在Unity中的另一个类中从Dictionary接收值

Tky*_*Stm 1 c# unity-game-engine

我想创建一个GameLoader来加载我的精灵,然后创建一个SceneController来创建游戏对象.我将精灵存储在GameLoader的字典中,以获取我想要创建函数的精灵,以从GameLoader接收特定的精灵.当它在一个类中时它正在工作但是现在它是两个类我在获取Sprite时遇到了问题.我收到这个错误

NullReferenceException: Object reference not set to an instance of an object
SceneController.createGeometry () (at Assets/Controllers/SceneController.cs:18)
SceneController.Start () (at Assets/Controllers/SceneController.cs:13)
Run Code Online (Sandbox Code Playgroud)

SceneController.cs

using System;
using System.Linq; 
using UnityEngine;
using System.Collections.Generic;

public class SceneController : MonoBehaviour {
    string[] geometryObjects = { "cube", "cube", "circle", "circle", "cube_small" };
    int objectCount = 5;
    GameLoader gameLoader;

    void Start () {
        createGeometry();
    }

    void createGeometry() {
        foreach (string geometryObject in geometryObjects) {
            Debug.Log(gameLoader.getGeometrySprite(geometryObject));
            GameObject geometryGameObject = new GameObject();
            geometryGameObject.name = geometryObject;
            geometryGameObject.tag = "Geometry";
            geometryGameObject.transform.position = new Vector3(0,0,0);
            geometryGameObject.AddComponent<SpriteRenderer>().sprite = gameLoader.getGeometrySprite(geometryObject);
            geometryGameObject.AddComponent<Rigidbody2D>(); 
            geometryGameObject.AddComponent<BoxCollider2D>(); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

GameLoader.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameLoader : MonoBehaviour {
    Dictionary<string, Sprite> geometrySprites;

    void Awake () {
        LoadSprites();
    }

    void LoadSprites() {
        geometrySprites = new Dictionary<string, Sprite>();
        Sprite[] geometrySpritesResources = Resources.LoadAll<Sprite>("Images/Geometry");

        foreach(Sprite geometrySpritesResource in geometrySpritesResources) {
            geometrySprites[geometrySpritesResource.name] = geometrySpritesResource;
        }
    }

    public Sprite getGeometrySprite(string spriteName) {
        return geometrySprites[spriteName];
    }
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*gge 5

您必须gameLoader在尝试访问变量之前设置变量.否则,它的值将始终为null默认值.有很多方法可以做到这一点.更简单的是在场景中使用搜索它FindObjectOfType.只需将其添加到您的SceneController中Awake:

void Awake () 
{
    gameLoader = FindObjectOfType<GameLoader>();
}
Run Code Online (Sandbox Code Playgroud)

请记住,FindObjectOfType只应在一次性操作中使用:

请注意,此功能非常慢.不建议每帧使用此功能.在大多数情况下,您可以使用单例模式.