在脚本相同的情况下检查哪个对象与另一个对象发生冲突

时间:2016-06-13 05:28:22

标签: c# unity3d

两个动画汽车对象都包含刚体盒子对撞机脚本包含 OnTriggerEnter事件

现在我想检查两辆车在运行时哪辆车撞到另一辆车。意味着如果 A击中B或B击中A ,因为两者都具有相同的脚本和相同的事件,则两个事件都成为触发器。如何识别谁击中???

请记住,请不要建议我使用Raycast,这是昂贵的

例如,我制作了两个立方体添加的盒子对撞机和刚体以及一个包含(或检查)

的脚本
void OnTriggerEnter(Collider c) {
        Debug.Log("GameObject is : " + gameObject.name + " and collider : " + c.name);

    }

现在,当我触发两个对象时触发器的顺序保持不变,无论我将A对象指向B或B对象指向A.我将如何区分它?

1 个答案:

答案 0 :(得分:0)

我看到的方法很简单,其中最简单的方法是:

编辑:注意 - RigidBidy需要有速度,我的意思是您需要使用RigidBody或任何其他基于物理的移动来移动AddForce对象。

  1. 检查速度。 获取每辆车RigidBody并查看velocity - velocity Vector3更高的那辆车就是那辆车。请注意,您需要在此处使用投影。

    void OnTriggerEnter(Collider c) 
    {
        Debug.Log("GameObject is : " + gameObject.name + " and collider : " + c.name);
    
        Vector3 directionB = this.transform.position - c.transform.position;
        Vector3 directionA = c.transform.position - this.transform.position;
    
        Vector3 rawVelocityA = this.GetComponent<Rigidbody> ().velocity;
        Vector3 rawVelocityB = c.GetComponent<Rigidbody> ().velocity;
    
        Vector3 realSpeedA = Vector3.Project (rawVelocityA, directionA);
        Vector3 realSpeedB = Vector3.Project (rawVelocityB, directionB);
    
        if (realSpeedA.magnitude > realSpeedB.magnitude) 
        {
            Debug.Log ("A hit B");
        }
        else if (realSpeedB.magnitude > realSpeedA.magnitude) 
        {
            Debug.Log ("B hit A");
        }
        else
        {
            Debug.Log ("A hit B and B hit A");
        }
    }
    
  2. 编辑:由于你没有使用物理来移动汽车,你需要以其他方式计算速度

    我建议这样的事情:

    每辆车上都有一个SpeedCalculator.cs脚本。

    public class SpeedCalculator : MonoBehaviour 
    {
        public float Velocity
        {
            get
            {
                return velocity;
            }
        }
        private float velocity;
    
        private Vector3 lastPosition;
    
        void Awake()
        {
            lastPosition = transform.position;
        }
    
        void Update()
        {
            velocity = transform.position - lastPosition;
            lastPosition = transform.position;
        }
    }
    

    然后从RigidBody取得速度,而不是从SpeedCalculator获取速度:

    void OnTriggerEnter(Collider c) 
    {
        Debug.Log("GameObject is : " + gameObject.name + " and collider : " + c.name);
    
        Vector3 directionB = this.transform.position - c.transform.position;
        Vector3 directionA = c.transform.position - this.transform.position;
    
        Vector3 rawVelocityA = this.GetComponent<SpeedCalculator> ().Velocity;
        Vector3 rawVelocityB = c.GetComponent<SpeedCalculator> ().Velocity;
    
        Vector3 realSpeedA = Vector3.Project (rawVelocityA, directionA);
        Vector3 realSpeedB = Vector3.Project (rawVelocityB, directionB);
    
        if (realSpeedA.magnitude > realSpeedB.magnitude) 
        {
            Debug.Log ("A hit B");
        }
        else if (realSpeedB.magnitude > realSpeedA.magnitude) 
        {
            Debug.Log ("B hit A");
        }
        else
        {
            Debug.Log ("A hit B and B hit A");
        }
    }