Physics.Ignore碰撞无所事事

本文关键字:无所事事 碰撞 Ignore Physics | 更新日期: 2023-09-27 17:58:38

我正在尝试制作一款BTD游戏。由于不同的气球(敌人)有不同的速度,它们在路径上行进时会相互碰撞。我目前正在使用这个代码:

void OnCollisionEnter (Collision coll)
{
    if (coll.gameObject.tag == "Enemy")
    {
        Physics.IgnoreCollision(coll.collider, gameObject.GetComponent<SphereCollider>());
    }
}

然而,它似乎根本不起作用。敌人仍然相互冲突。另一方面,与敌人的碰撞和来自塔楼的子弹正在发挥作用。

void OnTriggerEnter (Collider col)
{
    if (col.tag == "Bullet")
    {
        CurrentHP -= col.GetComponent<TackShooterBullet>().Damage;
    }  

我尝试过层碰撞(敌人到同一层&在层碰撞矩阵中取消选中同一层碰撞,但这也不起作用。敌人包含一个球体网格过滤器、球体碰撞器、网格渲染器、刚体、材质和2个脚本。有没有更好的方法来避免敌人之间的碰撞。我问这个问题是因为我看到了重复的,但他们的解决方案根本不起作用如果需要,可以提供更多我的代码。

Clarity编辑:同样,我试图实现的是让敌人能够互相攻击。

编辑(修复问题):我发现为了避免敌人碰撞,我还可以移除刚体。然而,移除ridigbody会弄乱敌人类中的子弹-->敌人触发器。因此,我只是写了子弹和;子弹级的敌人。

using UnityEngine;
public class TackShooterBullet : MonoBehaviour {
private GameObject target;
public float Damage;
// Use this for initialization
void Start () {
    target = transform.parent.GetComponent<TackShooterRange>().Target; // Target = Enemy[0] (First Enemy To Enter Range - Enemy is Removed from JList when exiting Range)
}
// Update is called once per frame
void Update()
{
    Damage = gameObject.transform.parent.transform.parent.GetComponent<TackShooterLimitingRange1>().level * 20; // Upgrade Level * 20 = Damage Done
    if (target == null) // If Enemy Exits Range
    {
        Destroy(gameObject); // Destroy Bullet
    }
    if (target != null) // Enemy Exists In Range
    {
        transform.position = Vector3.MoveTowards(transform.position, target.transform.position, 20 * Time.deltaTime); // Bullet Follows Enemy
        Destroy(gameObject); // Destroy Bullet Upon Contact With Enemy
        target.GetComponent<HealthOfEnemy>().CurrentHP -= Damage; // Enemy Loses Health
    }
}

这允许我删除OnTriggerEnter&OnCollisionEnter方法以及Enemy类中的RigidBody,如上所述,因此这些属性不再影响敌人之间的碰撞。

Physics.Ignore碰撞无所事事

Unity有一个内置的功能,用于更容易的碰撞检测,称为基于层的碰撞检测:

https://docs.unity3d.com/Manual/LayerBasedCollision.html

文档真的很好。如果您需要进一步澄清,请发表评论。