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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:43:21