【问题标题】:boolean from another script in Unity3D来自 Unity3D 中另一个脚本的布尔值
【发布时间】:2015-12-01 01:11:18
【问题描述】:

所以我有两个脚本,一个叫做 EndCollider.cs,它在地图上的某个地方, 它有一个 OnTriggerEnter 函数将布尔值设置为 true。

using UnityEngine;
using System.Collections;

public class EndCollider : MonoBehaviour {

public bool isShow = false;

void OnTriggerEnter ()
{
    isShow = true;
}

}

另一个脚本是SlowDownRun.cs,它在一个怪物对象上,在这个脚本中,我试图检测来自另一个脚本的布尔值是否为真,如果是则移动怪物。

using UnityEngine;
using System.Collections;

public class SlowDownRun : MonoBehaviour {

GameObject TrollScript;
EndCollider MonsterShow;

// Use this for initialization
void Start ()
{
    TrollScript = GameObject.Find("Troll");
    MonsterShow = TrollScript.GetComponent<EndCollider>();
}

void Update()
{
    if (MonsterShow.isShow == true)
    {
        float movementSpeed = 10f;
        transform.position += transform.forward * Time.deltaTime * movementSpeed;
    }
}

}

现在代码不起作用,如果我将它们从 IF 语句中取出,移动怪物的代码就起作用了。我也一直收到这个错误 NullReferenceException: Object reference not set to an instance of an object on the line if (MonsterShow.isShow == true)

请帮助我是 Unity 的初学者,这个问题困扰了我好几个小时,我已经做了很多谷歌搜索并一次又一次地修改我的代码,但就是无法解决这个问题,我觉得很着急,只是不知道该怎么办。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您在 Start() 方法中的 find troll 调用未找到 troll 或未在其上找到 EndCollider 组件,导致它为空。而且由于您只在启动时搜索一次,因此它将始终为空。

    这可能是因为您的巨魔尚未在场景开始时创建。

    如果您的意图实际上是让怪物在玩家撞到对撞机时出现,您应该查看 Prefab Instantiation。

    http://docs.unity3d.com/Manual/InstantiatingPrefabs.html

    所以在您的 OnTriggerEnter 中,您可以简单地实例化一个全新的怪物:

    public class EndCollider : MonoBehaviour {
    
    public GameObject MonsterPrefab;
    
    void OnTriggerEnter ()
    {
        Instantiate(MonsterPrefab);
    }
    
    }
    

    【讨论】:

      【解决方案2】:

      在两个场景之间传递数据的一种更好的方法可能是使用 PlayerPrefs:

      //EndCollider.cs
      public bool isShown
      {
          get { return PlayerPrefs.GetInt("IS_SHOWN")==1? true:false; }
          set { PlayerPrefs.SetInt("IS_SHOWN", Convert.ToInt32(value));} 
      }
      
      //SlowDownRun.cs
      if(PlayerPrefs.GetInt("IS_SHOWN")==1)  // isShown = true
      {
          ...
      }
      

      【讨论】:

        【解决方案3】:
        • 公开 masterShow endcollider
        • 清理您的启动方法。
        • 只需将巨魔对象从层次结构拖放到您的脚本中。

          公共类 SlowDownRun : MonoBehaviour {

          公共 EndCollider MonsterShow;

          // 用于初始化 无效开始() {

          }

          无效更新() { 如果(MonsterShow.isShow == true) { 浮动运动速度 = 10f; transform.position += transform.forward * Time.deltaTime * 运动速度; } }

          }

        【讨论】:

          猜你喜欢
          • 2014-08-16
          • 2014-11-12
          • 1970-01-01
          • 1970-01-01
          • 2016-04-13
          • 1970-01-01
          • 1970-01-01
          • 2016-11-05
          • 1970-01-01
          相关资源
          最近更新 更多