Unity。我在寻找一种方法来比较两个游戏对象碰撞时的速度。

问题描述 投票:0回答:1

我正在寻找一种方法来比较两个gameObjects碰撞时的速度。因此,如果对象的速度比它碰撞的对象快,它就会ApplysBreak。然而,当我试图访问每个gameobject的速度变量时,我得到一个空引用。

我想做的是让汽车在路上行驶。汽车的前面有一个触发器,后面有一个hitbox。我想发生的是,当触发器击中hitbox时,它会比较碰撞中两辆车的速度变量,即让后面的车减速或等于前面的车的速度。然而,我遇到的问题是引用两辆车的速度并进行比较。这是因为它们都是使用相同脚本的预制车。 我了解到这意味着我只是参考了相同的脚本,而不是每辆车的实际值。

private void OnTriggerStay2D(Collider2D collision)
{
    Debug.Log("TriggerStay");

    Traffic Col_speed = collision.gameObject.GetComponent<Traffic>();

    if (speed > Col_speed.speed)
    {
        Accelerate = false;
        ApplyBreak = true;
    }
    else if (speed< Col_speed.speed)
    {
        Accelerate = false;
        ApplyBreak = false;
        speed = Col_speed.speed;
    }
}
c# unity3d compare collision-detection
1个回答
0
投票

如果你使用碰撞而不是触发器,那么传入的 "碰撞 "就会被触发。OnCollisionEnter() 函数有一个属性 Impulse,让你了解速度的差异。它还有一个 GetContact() 以查找到底是在哪里被触动的。

https:/docs.unity3d.comScriptReferenceCollision.html。

对于触发器,它有点不同。你需要计算碰撞点上物品的速度。麻烦的是,OnTriggerEnter()和OnTriggerStay()方法不提供接触点。

如果你的物品大小相似,你可以简单地假设中间的点是接触点,然后计算这些点的速度。使用Rigidbody2D的velocity和angularVelocity来做这件事。如果你的对象有一个简单的形状,比如矩形汽车,你可能会自己做一些代码来找出一个更有用的接触点。

本示例中的代码假设两个物品中间有一个简单的接触点,然后计算它两端的速度。如果你不是在同一个对象上使用Rigidbody2D,而是在某个父体中使用,你可能需要改变一下。当从父体中获取一个刚体时,要注意使用拥有刚体的同一个gameObject的transform.position,而不是拥有碰撞器的那个!

using UnityEngine;

public class TriggerHitSpeed : MonoBehaviour
{
    public Vector3 hit_v1;
    public Vector3 hit_v2;
    private Rigidbody2D rgb;

    private void Start()
    {
        rgb = GetComponent<Rigidbody2D>();
        if(rgb==null)
            Destroy(this);
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        Vector3 hitpoint;

        // unlike OnCollisionEnter2D(), trigger functions don't get a contact point
        // simply assume middle of centers. For a CollisionEnter, can use the contact point from the collision.
        hitpoint = (collision.transform.position+transform.position)*0.5f;
        // speed of self at hitpoint
        Vector3 rotspeed;
        Vector3 v1,v2;
        Vector2 speed;
        if(rgb!=null)
        {
            rotspeed = Vector3.forward * rgb.angularVelocity*Mathf.Deg2Rad;  // for 3D object, use angularVelocity directly.
            speed = rgb.velocity;
            v1 = Vector3.Cross( rotspeed , hitpoint-transform.position );
            v1 += new Vector3(speed.x,speed.y,0f);
        }else
            v1 = Vector3.zero;
        // speed of other at hitpoint
        if(collision.attachedRigidbody!=null)
        {
            rotspeed = Vector3.forward * collision.attachedRigidbody.angularVelocity*Mathf.Deg2Rad;// for 3D object, use     angularVelocity directly.
            speed = collision.attachedRigidbody.velocity;
            v2 = Vector3.Cross( rotspeed , hitpoint-collision.transform.position );
            v2 += new Vector3(speed.x,speed.y,0f);
        }else
            v2 = Vector3.zero;

        // can now look at the difference and do something with it.
        //   v2-v1;
        // [...]
        hit_v1 = v1;
        hit_v2 = v2;

    }
}

考虑到旋转的代码让它变得更漂亮,更有价格,万一你的车失控旋转,然后撞到人,把他撞得横七竖八。

© www.soinside.com 2019 - 2024. All rights reserved.