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)
您必须gameLoader在尝试访问变量之前设置变量.否则,它的值将始终为null默认值.有很多方法可以做到这一点.更简单的是在场景中使用搜索它FindObjectOfType.只需将其添加到您的SceneController中Awake:
void Awake ()
{
gameLoader = FindObjectOfType<GameLoader>();
}
Run Code Online (Sandbox Code Playgroud)
请记住,FindObjectOfType只应在一次性操作中使用:
请注意,此功能非常慢.不建议每帧使用此功能.在大多数情况下,您可以使用单例模式.