【问题标题】:Unity 2D Change sprite from a list of spritesUnity 2D 从精灵列表中更改精灵
【发布时间】:2018-12-02 18:57:05
【问题描述】:

我在我的 2D 游戏中有一个 gameObject 作为 sprite,然后在另一个脚本中,我有一个 sprite 数组中的 2d 纹理数组。我只是想更改精灵的精灵属性,但得到错误“对象引用未设置为对象的实例”。 这是抛出错误的行,它在一个脚本中。:

this.gameObject.GetComponent<SpriteRenderer> ().sprite = GameObject.Find ("UIM").GetComponent<Manager> ().spriteImages [1];

虽然数组位于不同的脚本中,但附加到与我尝试访问它的场景不同的场景中的对象“UIM”(不确定这是否会导致问题),定义为:

public Sprite[] spriteImages = new Sprite[5];

为什么会出现此错误?我已经用纹理填充了数组,所以看不到问题。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您正在尝试从另一个场景访问脚本和变​​量。统一加载新场景时,您的旧场景值将被破坏,这将导致“对象引用未设置为对象实例”错误。您可以通过调用DontDestroyOnLoad 来告诉团结不要破坏您在未来场景中需要的对象。这将允许游戏对象在场景中持续存在。 您必须记住的另一件事是,如果您要返回将 Object UIManager 标记为 dontdestroyonload 的旧场景,则请确保从场景中删除并管理下一个实例,然后在您继续重新加载时重新加载使用 UImanager 的旧场景将继续在场景中堆积它的实例。与 dontdestroyonload 统一的示例应该足以解决您的问题。这是 Unity API 中显示的 sn-p,您可以参考:

    void Awake()
    {
        GameObject[] objs = GameObject.FindGameObjectsWithTag("music");
    
        if (objs.Length > 1)
        {
            Destroy(this.gameObject);
        }
    
        DontDestroyOnLoad(this.gameObject);
    }
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      public GameObject[] objs = 
            SceneManager.GetSceneByName(sceneToLoad).GetRootGameObjects(); 
      foreach(GameObject go in objs)
      {
          if(go.name == "UIM")
          {
              this.gameObject.GetComponent<SpriteRenderer> ().sprite = 
                go.GetComponent<Manager> ().spriteImages [1];
              break;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-18
        • 1970-01-01
        • 2023-02-14
        • 2016-09-02
        • 1970-01-01
        • 2023-04-06
        • 2012-02-10
        • 2019-07-13
        • 1970-01-01
        相关资源
        最近更新 更多