我对 OnTriggerEnter 的工作原理或 Unity 中的碰撞体的工作原理感到非常困惑。我正在尝试添加一个碰撞测试,如果子弹击中一个物体,它会播放粒子系统并调试某些东西,但它不起作用,我很困惑为什么。请帮助。
这是我的代码:
公共类bulletScript:MonoBehaviour {
public ParticleSystem explosion;
public float speed = 20f;
public Rigidbody rb;
bool canDieSoon;
public float timeToDie;
void Start()
{
    canDieSoon = true;
}
// Start is called before the first frame update
void Update()
{
    rb.velocity = transform.forward * speed;
    if(canDieSoon == true)
    {
        Invoke(nameof(killBullet), timeToDie);
        canDieSoon = false;
    }
    
}
private void OnTriggerEnter(Collider collision)
{
    if (collision.gameObject.tag == "ground")
    {
        Debug.Log("hit ground");
        explosion.Play();
    }
    if (collision.gameObject.tag == "robot")
    {
        Debug.Log("hit ground");
        explosion.Play();
    }
    if (collision.gameObject.tag == "gameObjects")
    {
        Debug.Log("hit ground");
        explosion.Play();
    }
    if (collision.gameObject.tag == "walls")
    {
        Debug.Log("hit ground");
        explosion.Play();
    }
    if (collision.gameObject.tag == "doors")
    {
        Debug.Log("hit ground");
        explosion.Play();
    }
}
void killBullet()
{
    Destroy(gameObject);
}
}
小智 5
碰撞器一开始可能有点棘手,但让我向您解释一下基础知识。
首先,接收任何类似OnCollisionEnter或的函数OnTriggerExit这些函数的游戏对象),必须附加一个 Collider 组件(您想要的任何形状的 2D 或 3D,具体取决于您的项目)。
然后,如果您想使用触发器,则必须选中碰撞器组件上的“是触发器”复选框。除此之外,一个或两个碰撞对象必须具有刚体
最后你肯定想查看Unity Collider手册的底部,其中包含Unity的碰撞矩阵,描述什么可以或不可以与什么碰撞。
此外,为了帮助您发展编码技能,我建议您在OnTriggerEnter函数中使用一些循环以保持DRY
private void OnTriggerEnter(Collider collision)
{
    string[] tagToFind = new string[]{"ground", "robot", "gameObjects", "walls", "doors"};
    for(int i = 0; i < tagToFind.Length; i++)
    {
        var testedTag = tagToFind[i];
        //compareTag() is more efficient than comparing a string
        if (!collision.CompareTag(testedTag)) continue; //return early pattern, if not the good tag, stop there and check the others
        
        Debug.Log($"hit {testedTag}"); //improve your debug informations
        explosion.Play();
        return; //if the tag is found, no need to continue looping
    }
}
希望有帮助;)
| 归档时间: | 
 | 
| 查看次数: | 10304 次 | 
| 最近记录: |