两个动画汽车对象都包含刚体和盒子对撞机,脚本包含 OnTriggerEnter事件。
现在我想检查两辆车在运行时哪辆车撞到另一辆车。意味着如果 A击中B或B击中A ,因为两者都具有相同的脚本和相同的事件,则两个事件都成为触发器。如何识别谁击中???
请记住,请不要建议我使用Raycast,这是昂贵的
例如,我制作了两个立方体添加的盒子对撞机和刚体以及一个包含(或检查)
的脚本void OnTriggerEnter(Collider c) {
Debug.Log("GameObject is : " + gameObject.name + " and collider : " + c.name);
}
现在,当我触发两个对象时触发器的顺序保持不变,无论我将A对象指向B或B对象指向A.我将如何区分它?
答案 0 :(得分:0)
我看到的方法很简单,其中最简单的方法是:
编辑:注意 - RigidBidy
需要有速度,我的意思是您需要使用RigidBody
或任何其他基于物理的移动来移动AddForce
对象。
检查速度。
获取每辆车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");
}
}
编辑:由于你没有使用物理来移动汽车,你需要以其他方式计算速度
我建议这样的事情:
每辆车上都有一个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");
}
}