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

Unity PawnHasFallen方法在Start运行正常、跨脚本调用失效问题

问题根因

核心错误是你在HitBowling中调用的是预制体资源上的Pawn组件方法,而非场景中实际运行的球瓶实例的方法:

  • 你在HitBowling.Start()中直接从pawnPrefab(预制体资源)上获取Pawn组件,预制体本身的transform状态永远是初始的竖直朝上状态,不会随场景中球瓶的碰撞倒下发生变化,所以PawnHasFallen()的角度判断永远走else分支。
  • Pawn.Start()是场景中实际生成的球瓶实例运行时调用的,读取的是实例自身的transform状态,所以判断逻辑正常。
其他附带问题
  1. Pawn脚本中的pawnName是GameObject类型,直接插值到日志字符串中输出格式会异常,无需额外声明该变量,直接用gameObject.name即可获取当前球瓶的名称。
  2. 现有倒地判断逻辑过于严格:用Mathf.Approximately判断角度完全等于0,球瓶受碰撞轻微晃动时容易出现误判,建议增加合理的倒地角度阈值。
  3. 如果场景内有多个保龄球瓶,只持有单个Pawn引用无法完成所有球瓶的判分逻辑。
修复步骤
  1. 修正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();
    }
    
  2. 优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:24:01