Unity Ragdoll角色创建、Rigidbody数组问题:仅首个敌人可被击杀
问题根源与解决方案
嘿,我一眼就看出问题的核心了——你的ShootScript里,敌人的引用逻辑完全错了!
问题出在哪?
看你的ShootScript的Start()方法:
enemyscript = GameObject.FindGameObjectWithTag("Enemy").GetComponent<ZombieStateMachine>();
GameObject.FindGameObjectWithTag("Enemy")只会返回场景中第一个带有Enemy标签的对象,所以不管你射击哪个敌人,代码里调用的始终是第一个敌人的KillZombie()方法!这就完美解释了你遇到的所有现象:
- 射第一个敌人时一切正常(确实调用了它的死亡逻辑)
- 射其他敌人时,实际触发的还是第一个敌人的ragdoll切换(所以第一个敌人会莫名其妙变 ragdoll)
- 你看到日志在跑,是因为Shoot方法本身在执行,但敌人引用不对,根本没调用当前命中敌人的代码
怎么修复?
你需要在每次Raycast命中敌人时,动态获取当前命中对象的ZombieStateMachine组件,而不是提前在Start里固定死引用。
修改ShootScript里的Shoot()方法,把敌人引用的获取逻辑移到命中判断里:
public void Shoot() { if (Input.GetKeyDown(KeyCode.Mouse0)) { Debug.DrawRay(cam.transform.position, cam.transform.forward, Color.red, 1.0f); RaycastHit hit; if (Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, 2000f)) { if(hit.transform.CompareTag("Enemy")) { // 直接从命中的对象获取对应脚本,而不是用提前存的固定引用 ZombieStateMachine hitEnemyScript = hit.transform.GetComponent<ZombieStateMachine>(); if(hitEnemyScript != null) { hitEnemyScript.KillZombie(); } gunshotsound.Play(); StartCoroutine(GunshotFlash()); } else { gunshotsound.Play(); StartCoroutine(GunshotFlash()); print("You MIssed!"); } } } }
同时,记得把ShootScript里开头定义的private ZombieStateMachine enemyscript;删掉(或者留着但不再使用),避免后续混淆。
额外检查项
- 确保每个敌人预制体都正确挂载了ZombieStateMachine脚本,并且标签确实设置为
Enemy - 代码里加的空引用判断(
if(hitEnemyScript != null))能避免偶尔出现的空指针报错,建议保留 - 你的
ZombieStateMachine里的KillZombie()逻辑本身是没问题的,只需要确保调用它的是正确的敌人对象
这样修改后,射击哪个敌人,就会触发哪个敌人的ragdoll死亡逻辑啦!
内容的提问来源于stack exchange,提问作者Kaleb Alfadda
相关产品推荐
相关产品推荐

