2

我的 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 回答