Unity PawnHasFallen方法在Start运行正常、跨脚本调用失效问题
问题根因
核心错误是你在HitBowling中调用的是预制体资源上的Pawn组件方法,而非场景中实际运行的球瓶实例的方法:
- 你在
HitBowling.Start()中直接从pawnPrefab(预制体资源)上获取Pawn组件,预制体本身的transform状态永远是初始的竖直朝上状态,不会随场景中球瓶的碰撞倒下发生变化,所以PawnHasFallen()的角度判断永远走else分支。 Pawn.Start()是场景中实际生成的球瓶实例运行时调用的,读取的是实例自身的transform状态,所以判断逻辑正常。
其他附带问题
Pawn脚本中的pawnName是GameObject类型,直接插值到日志字符串中输出格式会异常,无需额外声明该变量,直接用gameObject.name即可获取当前球瓶的名称。- 现有倒地判断逻辑过于严格:用
Mathf.Approximately判断角度完全等于0,球瓶受碰撞轻微晃动时容易出现误判,建议增加合理的倒地角度阈值。 - 如果场景内有多个保龄球瓶,只持有单个Pawn引用无法完成所有球瓶的判分逻辑。
修复步骤
- 修正Pawn引用逻辑
如果是动态生成球瓶,生成时将每个球瓶实例的Pawn组件存入列表;如果是场景提前放置球瓶,可通过标签批量获取实例:
调用时遍历列表逐个判断:public List<Pawn> pawnList = new List<Pawn>(); public void Start() { // 假设球瓶都提前设置了"Pawn"标签 GameObject[] pawnObjs = GameObject.FindGameObjectsWithTag("Pawn"); foreach(var obj in pawnObjs) { pawnList.Add(obj.GetComponent<Pawn>()); } }yield return new WaitForSeconds(5); foreach(var p in pawnList) { p.PawnHasFallen(); } - 优化Pawn脚本逻辑
public void PawnHasFallen() { // 阈值可根据需求调整,比如大于15度就算倒地 float angle = Vector3.Angle(Vector3.up, transform.up); if (angle > 10f) { Debug.Log($"{gameObject.name} has fallen", this); } else { Debug.Log("It Aint working mate"); } }
内容的提问来源于stack exchange,提问作者Benjamin Venema
相关产品推荐
相关产品推荐

