Unity新手求助:如何从地形物体脚本调用预制体脚本的int变量
问题分析与解决方案
问题根源
- 空引用错误:Radish脚本的
OnCollisionEnter方法中,无论是否触发Cow碰撞,都会执行Destroy(gameObject),导致萝卜实例一发生碰撞就被销毁,FriendMove中的radishScript会变为空引用,后续Update访问变量必然报错。 - 计数器逻辑失效:每个萝卜实例的
foodCollisions是独立变量,FriendMove中实例化的是全新萝卜,既不会被牛碰撞,也无法同步其他萝卜的碰撞数据,完全起不到统计作用。
修复步骤
1. 创建全局计数器单例类
新建一个全局数据容器,统一统计所有萝卜的碰撞次数:
using UnityEngine; public class GameStats : MonoBehaviour { public static GameStats Instance { get; private set; } public int totalRadishCollisions = 0; private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); } else { Instance = this; DontDestroyOnLoad(gameObject); } } }
将此脚本挂载到场景中一个常驻的空GameObject上(如命名为GameManager)。
2. 修改Radish脚本
调整销毁逻辑,仅在碰撞到牛时更新全局计数器并销毁:
using UnityEngine; public class Radish : MonoBehaviour { [SerializeField] AudioSource munchSound; private void OnCollisionEnter(Collision collision) { if (collision.gameObject.CompareTag("Cow")) { munchSound.Play(); GameStats.Instance.totalRadishCollisions++; Destroy(gameObject, 0.1f); // 延迟销毁确保音效播放 } } }
3. 修改FriendMove脚本
直接读取全局计数器的值,无需实例化无效萝卜:
using UnityEngine; using UnityEngine.AI; public class FriendMove : MonoBehaviour { public Transform Playerpos; NavMeshAgent agent; void Start() { agent = GetComponent<NavMeshAgent>(); } private void Update() { if (GameStats.Instance.totalRadishCollisions == 3) { agent.destination = Playerpos.position - new Vector3(5, 0, 5); } } }
额外注意事项
- 确保场景中存在挂载
GameStats脚本的GameObject,否则会出现找不到实例的错误。 - 若萝卜通过生成器批量创建,无需修改生成逻辑,只要每个萝卜带有Radish脚本,就会自动更新全局计数器。
内容的提问来源于stack exchange,提问作者toastyducky
相关产品推荐
相关产品推荐

