2

Unity (ポケモン スタイル) の 2D ゲームに問題があり、ゲームtransform.positionオブジェクトの移動に使用しています。

プレイヤーと彼を追う敵がいます。すべて問題ありません。しかし、敵が衝突すると、互いに押し合い始めます

敵とプレイヤーが衝突したときに誰も押されないようにする必要があります。

  • 敵にキネマティックを使用しようとしましたが、プレイヤーはそれらを押すことができます。
  • プレイヤーに大量の質量を追加しようとしましたが、彼は敵を押すことができます.
  • とのコードで当たり判定を試みたのですOnCollisionが、敵の移動をキャンセルすると元に戻りません。

- - アップデート - -

衝突が必要で​​すが、それらの間をプッシュすることなく、問題を説明するビデオがあり ます https://www.youtube.com/watch?v=VkgnV1NOxlw

記録のために、私は A* パスファインディング スクリプト ( http://arongranberg.com/astar/ ) を使用しています。ここでは、敵がスクリプトを移動します。

void FixedUpdate () {
    if(path == null)
        return;

    if(currentWayPoint >= path.vectorPath.Count)
        return;

    Vector3 wayPoint = path.vectorPath [currentWayPoint];
    wayPoint.z = transform.position.z;

    transform.position = Vector3.MoveTowards (transform.position, wayPoint, Time.deltaTime * speed);

    float distance = Vector3.Distance (transform.position, wayPoint);

    if(distance == 0){
        currentWayPoint++;
    }

}

- - アップデート - -

最後に、ターゲットが近づいて停止したときに、rigidbody2D.isKinematic プロパティを true に変更して、期待どおりの結果を取得します。

ここにビデオがあります https://www.youtube.com/watch?v=0Zm0idUU75s

そして敵の移動コード

void FixedUpdate () {

    if(path == null)
        return;

    if(currentWayPoint >= path.vectorPath.Count)
        return;

    float distanceTarget = Vector3.Distance (transform.position, target.position);

    if (distanceTarget <= 1.5f) {
        rigidbody2D.isKinematic = true;
        return;
    }else{
        rigidbody2D.isKinematic = false;
    }

    Vector3 wayPoint = path.vectorPath [currentWayPoint];
    wayPoint.z = transform.position.z;

    transform.position = Vector3.MoveTowards (transform.position, wayPoint, Time.deltaTime * speed);

    float distance = Vector3.Distance (transform.position, wayPoint);

    if(distance == 0){
        currentWayPoint++;
    }

}
4

1 に答える 1

3

これにはいくつかの方法がありますが、

使用できますPhysics2D.IgnoreCollision

Physics2D.IgnoreCollision(someGameObject.collider2D, collider2D);
  • IgnoreCollisionおそらくオブジェクトがインスタンス化されるときなど、衝突が発生する前に呼び出しを行うようにしてください。

または代わりに、Layer Collision Matrix

ここに画像の説明を入力

  • Unity マニュアルは、これを使用するための情報を提供します。これは、異なるレイヤーに異なるレイヤーを割り当てることで、衝突を回避するだけGameObjectsです。試す: Edit->Project Settings->Physics

または、動きを止めたい場合は、次のように簡単に実行できます。

bool isCollided = false;

// when when OnCollisionEnter() is called stop moving. 
//maybe write your move script like 

void Move() { 
    if(!isCollided) { 
        // move logic 
    } 
}
于 2015-02-13T05:33:45.923 に答える