Unity销毁对象时崩溃求助(附自定义Attack脚本)
问题分析与修复方案
核心崩溃原因
你的脚本里存在死循环,这是导致Unity直接崩溃的根本原因:
while (timer == true)循环内没有任何修改timer值的代码,会持续占用主线程,导致程序完全无响应。- 第二个
while (x >= 1)同样未对x做任何修改,属于死循环。
同时还有几个关键逻辑错误:
Start()里直接访问cc2但未初始化,会触发空引用异常。- Collider设为
isTrigger = true,却使用了针对非Trigger碰撞的OnCollisionEnter2D,应该改用OnTriggerEnter2D。 - 攻击逻辑放在碰撞事件里不合理,时间更新类逻辑必须在
Update中处理,碰撞事件仅负责触发检测。 GameObject.Find("Enemy")效率极低,且场景中有多个同名Enemy时会出错,直接使用碰撞到的对象更可靠。
修复后的脚本
using UnityEngine; public class Attack : MonoBehaviour { private CircleCollider2D cc2; // 攻击冷却时长 private float attackCooldown = 3f; private float currentCooldown = 0f; private bool canAttack = true; private void Start() { // 初始化Collider引用 cc2 = GetComponent<CircleCollider2D>(); cc2.isTrigger = true; // 默认关闭碰撞检测,挥剑时再开启 cc2.enabled = false; } private void Update() { // 处理冷却计时 if (!canAttack) { currentCooldown += Time.deltaTime; if (currentCooldown >= attackCooldown) { canAttack = true; currentCooldown = 0f; } } // 检测鼠标左键输入,触发攻击 if (Input.GetKeyDown(KeyCode.Mouse0) && canAttack) { canAttack = false; // 开启碰撞检测,模拟挥剑范围 cc2.enabled = true; // 0.2秒后关闭碰撞,避免持续检测(可根据挥剑动画时长调整) Invoke(nameof(DisableAttackCollider), 0.2f); } } private void OnTriggerEnter2D(Collider2D other) { // 检测是否命中Enemy(需给Enemy对象添加Tag为"Enemy") if (other.CompareTag("Enemy")) { Destroy(other.gameObject); } } private void DisableAttackCollider() { cc2.enabled = false; } }
额外优化建议
- 给Enemy对象添加**Tag(标签)**为
Enemy,用CompareTag比判断name更可靠,避免同名对象干扰。 - 挥剑碰撞检测的开启时长可以匹配挥剑动画的时长,让逻辑更贴合视觉表现。
- 所有帧更新相关的逻辑都放在
Update中,保证Unity主线程的正常运行节奏。
内容的提问来源于stack exchange,提问作者Dom Sendall
相关产品推荐
相关产品推荐

