在unity3d中随机移动的问题?

时间:2014-07-09 09:14:11

标签: c# unity3d

我有一个随机移动的生物,当它撞到一堵墙时会改变一个方向,但过了一段时间它会消失(不应该这样)。任何人都可以告诉我为什么以及如何解决这个问题?这是我的代码:

using UnityEngine;

using System.Collections;

public class Random_moving : MonoBehaviour{

    public Vector3 target;

    public float speed=10f;

    Vector3 screenPos;

    int direction = 1;

    void  Start (){
        target = Random.insideUnitSphere * 5;
        transform.Rotate(target);
    }
    void  Update (){
        transform.position += (transform.forward * speed * Time.deltaTime)*direction;
    }

    void OnCollisionEnter2D (Collision2D coll){
                Debug.Log ("hit.");
                if (coll.gameObject.tag == "maze"){                 
                        if (screenPos.x < Screen.width / 2){
                                direction = -1;
                                Debug.Log ("change_2.");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果生物必须改变方向,你应该这样做:

direction *= -1;

而不是

direction = -1;

实际上,方向仅在第一次与墙壁碰撞时才会改变。可能这会导致该生物进入&#34;第二次碰撞时的墙,因为方向仍然相同。

答案 1 :(得分:0)

你有两个独立的问题。首先,正如Andrea已经告诉过你的那样,你并没有在每次碰撞时切换你的方向。如果1向前,-1向后,则在第一次碰撞后总是向后退。要切换方向,只需与-1相乘。

direction *= -1;

其次,你正在使用transform.position来移动你的生物。通过直接设置transform.position,您基本上忽略了碰撞。这就像将对象传送到目的地,即使它是另一个对象。要触发碰撞,您需要在物理引擎的帮助下移动您的生物。通过对生物施加力或使用函数Rigidbody2D.MovePosition()

void FixedUpdate() {
    rigidbody2D.MovePosition(rigidbody2D.position + (transform.forward * speed * Time.deltaTime * direction));
}

来自manual的重要提示:

  

重要的是要了解实际位置更改仅在下一次物理更新期间发生,因此重复调用此方法而不等待下一次物理更新将导致使用最后一次调用。因此,建议在FixedUpdate回调期间调用它。