You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C# 3D碰撞触发器近战伤害脚本运行异常,误伤自身武器对象

Unity近战攻击脚本碰撞误判问题

我编写了一套对敌造成伤害的逻辑脚本,将其挂载在带有触发类型Box Collider的武器对象上,预期逻辑为武器命中指定GameObject后,获取其生命值属性并扣除对应伤害值。但实际运行时除敌方对象外,武器自身对象也会被判定为命中目标。我对Unity的碰撞机制理解尚不完善,无法定位问题原因,按现有认知原有逻辑应当正常运行。

问题解决

经过反复调试我已自行解决该问题,将所有攻击相关逻辑迁移到父对象下的独立新对象中后,功能恢复正常。

经验总结

不要在同一个对象上同时实现攻击和受击逻辑

关联代码
public class MeleeAttackScript : MonoBehaviour
{
    public float Range = 1.0f;
    public float AttackSpeed = 1.2f;
    public float AttackCooldown = 0f;
    public float Damage = 5f;

    bool Collision = false;
    BoxCollider RangeCollider;
    Collider HitObject;

    public void Awake()
    {
        RangeCollider = GetComponent<BoxCollider>();
        RangeCollider.size = new Vector3(1, 1, Range);
        RangeCollider.center = new Vector3(0, 0.00001f, (RangeCollider.size.z+1)/2);
    }

    public void Update()
    {
        if (AttackCooldown > 0)
        {
            AttackCooldown -= Time.deltaTime;
        }

        if (Mathf.Clamp(AttackCooldown, 0, (1 / AttackSpeed)) == 0 && Collision && HitObject.gameObject.tag == "Object")
        {
            Attack();
            Collision = false;
        }
    }

    private void OnTriggerStay (Collider collider)
    {
        if (collider.GetComponent<Collider>().GetType() == typeof(CapsuleCollider))
        {
            Debug.Log(collider.name);
            HitObject = collider;
            Collision = true;
        }
    }

    public void Attack()
    {
        HitObject.gameObject.GetComponent<LifePointScript>().CurrentLifePoints -= Damage;
        AttackCooldown = 1 / (AttackSpeed);
    }
}
效果展示

效果可视化


内容的提问来源于stack exchange,提问作者Kara55555

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 04:24:03