5

Unityで2Dプラットフォーマーを作成していて、プレーヤーを移動するプラットフォームにとどまらせようとしています。私は今1日か2日検索といじくり回しをしました、そして私は運がありません。

基本的に、私はキャラクターが触れているときにプラットフォームと一緒にキャラクターを動かし続けるように努めるように言われました。まず、OnTriggerEnter()に関連するものを使用すると、プレーヤーはプラットフォームを直接通過します。OnCollisionEnter()(プレーヤーにCharacterController、プラットフォームにBoxColliderを使用)を実行しても、何も起こりません。これらは私が最も示唆していると思った2つのことです。もう1つは、プレーヤーをプラットフォームで育てることですが、これは明らかに「問題」を引き起こします(頻繁に述べられ、説明されることはありません)。

では、どうすればプレーヤーを移動するプラットフォームにとどまらせることができますか?移動プラットフォームのコードは次のとおりです。

public class MovingPlatform : MonoBehaviour
{
private float useSpeed;
public float directionSpeed = 9.0f;
float origY;
public float distance = 10.0f;

// Use this for initialization
void Start () 
{
    origY = transform.position.y;
    useSpeed = -directionSpeed;
}

// Update is called once per frame
void Update ()
{
    if(origY - transform.position.y > distance)
    {
        useSpeed = directionSpeed; //flip direction
    }
    else if(origY - transform.position.y < -distance)
    {
        useSpeed = -directionSpeed; //flip direction
    }
    transform.Translate(0,useSpeed*Time.deltaTime,0);
}

そして、これがプレイヤーの動きのコードです(アップデート):

CharacterController controller = GetComponent<CharacterController>();
    float rotation = Input.GetAxis("Horizontal");
    if(controller.isGrounded)
    {
        moveDirection.Set(rotation, 0, 0); //moveDirection = new Vector3(rotation, 0, 0);
        moveDirection = transform.TransformDirection(moveDirection);

        //running code
        if(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) //check if shift is held
        { running = true; }
        else
        { running = false; }

        moveDirection *= running ? runningSpeed : walkingSpeed; //set speed

        //jump code
        if(Input.GetButtonDown("Jump"))
        {
            //moveDirection.y = jumpHeight;
            jump ();
        }
    }
    moveDirection.y -= gravity * Time.deltaTime;
    controller.Move(moveDirection * Time.deltaTime);

編集:それは私がプレーヤーとプラットフォームをどのように定義しているかに関係しているかもしれないと思いますが、私はさまざまな組み合わせを試しました。プラットフォームが(コライダーの)トリガーである場合、プレーヤーは一貫してそれを通過します。そうでない場合、OnTrigger関数を使用できません。プレーヤーとプラットフォームの両方に剛体を取り付けていますが、何の影響も受けていないようです。プレイヤーがいくつかのセットアップでプラットフォームに乗るとき、彼はジッターし、しばしばただ失敗してしまいます。

4

5 に答える 5

1

これは最善の方法ではありませんが、プレーヤーから移動するプラットフォームにRayCastを実行することはできます。RayCastが「MovingPlatform」に当たった場合、Y軸の違いを確認して、プレーヤーが「OnThePlatform」と見なされるのに十分な距離にあるかどうかを判断できます。その後、通常どおりプレーヤーの位置を調整できます。

例は次のとおりです。

private bool isOnMovingPlatform;
private float offsetToKeepPlayerAbovePlatform = 2.2f;
private float min = 0.2f;
private float max = 1.2f;

private void Update()
{
RaycastHit hit;
if(Physics.Raycast (player.position, player.TransformDirection(Vector3.down), out hit))
{
    if(hit.transform.name.Contains("MovingPlatform"))
    {
        Transform movingPlatform  = hit.collider.transform;

        if(movingPlatform.position.y - player.position.y <= min && movingPlatform.position.y - player.position.y >= max)
        {
            isOnMovingPlatform = true;
        }
        else
        {
            isOnMovingPlatform = false;
        }
    }

    if(isOnMovingPlatform)
    {
        player.position = new Vector3(hit.transform.x, hit.transform.y + offsetToKeepPlayerAbovePlatform, 0);
    }
}
}
于 2013-03-26T18:31:57.037 に答える
1

必要なのは、プラットフォーム上の2番目のコライダーのようです。メインコライダーはisTrigger = false、キャラクターコントローラーが機能していることを確認する必要があります。2つ目はで実行され、その唯一の機能は、が呼び出されisTrigger = trueたときにプレーヤーがプラットフォームに接続されていることを検出し、プラットフォームをオンのままにすることです。OnTriggerEnterOnTriggerExit

同じタイプのコライダーを2つ持つことはできないため(ボックスコライダーが必要だと思います)、プラットフォームゲームオブジェクトの下に空の子を作成し、ボックスコライダーを割り当てます。私は通常、自分のものをきれいにするために、ActionMaterialと呼ばれる特別な物理材料を使用します。レイヤーを使用していて、衝突マトリックスを微調整している場合は、衝突がphysXによって処理されることを確認してください。

于 2013-03-26T19:25:00.667 に答える
0

このUnityAnswersページが役立つ場合があります。

于 2013-03-27T12:30:26.763 に答える
0

また、単純にプレーヤーのゲームオブジェクトをプラットフォームの変換と同じように変換する親を作成することもできます。これにより、プレイヤーはその上にいる間も動き続けることができます。検出に関しては、レイキャストは少し遅いですが、仕事を成し遂げます。

于 2015-11-22T17:32:57.617 に答える
0

SliderJoint2dを使用し、移動するプラットフォーム上でキャラクターの重力スケールをゼロに設定することで、問題を解決しました。完全な説明へのリンクは次のとおりです。

http://spacelizardstudio.com/devblog/index.php/2016/03/02/unity-a-guide-to-moving-platforms/

于 2016-03-02T15:47:41.507 に答える