从另一个类中调用时,GameObject数组返回null
我目前处于丢失状态,因为我的GameObject返回null。从另一个类中调用时,GameObject数组返回null
关于这个问题,我不确定是否因为我错过了一件小事,或者如果我直接编写完全错误的多个类的使用。
我的代码,我产生了游戏对象数组:
public class gridInit : MonoBehaviour {
const int mapWidth = 33;
const int mapHeight = -27;
const float tileSizeUnits = 1.0f/3;
public GameObject tile;
// Use this for initialization
void Start() {
GenerateTileMap();
Screen.fullScreen = true;
}
void Awake()
{
}
// Update is called once per frame
void Update() {
}
bool walkable = false;
[HideInInspector]
public GameObject[] goTile = new GameObject[892];
void GenerateTileMap()
{
int tileNumber = 0;
for (float y = 0; y > mapHeight; y--)
{
for (float x = 0; x < mapWidth; x++)
{
float tilePosX = x/3;
float tilePosY = y/3;
int layerPos = -2;
goTile[tileNumber] = Instantiate(tile, new Vector3(tilePosX, tilePosY, layerPos), Quaternion.identity) as GameObject;
goTile[tileNumber].name = "tile" + tileNumber;
goTile[tileNumber].tag = "grid";
RaycastHit2D hit;
Vector3 fwd = goTile[tileNumber].transform.TransformDirection(Vector3.forward);
Debug.DrawRay(goTile[tileNumber].transform.position, fwd * 50, Color.green);
hit = Physics2D.Raycast(goTile[tileNumber].transform.position, fwd, 200);
if (hit)
{
goTile[tileNumber].tag = "walkableGrid";
}
tileNumber++;
}
}
}
而且我的课,我想用一组GameObjects:
public class gameCalibration : MonoBehaviour {
bool calibrationComplete = false;
public gridInit gInit;
public cam Cam;
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
{
for (int i = 0; i < gInit.goTile.Length; i++)
{
if (calibrationComplete == false)
{
gInit.goTile[i].GetComponent<Renderer>().enabled = true;
}
else
{
gInit.goTile[i].GetComponent<Renderer>().enabled = false;
}
}
if (calibrationComplete == false)
{
Calibrate();
}
else
{
gInit.GenerateObjects();
calibrationComplete = true;
}
}
}
Vector2[] camTileCenter;
Vector2 tempCenter;
void Calibrate()
{
for (int i = 0; i < gInit.goTile.Length; i++)
{
gInit.goTile[i].GetComponent<SpriteRenderer>().color = Color.red;
if (Cam.redBlobs[i] != null && camTileCenter[i] != tempCenter)
{
camTileCenter[i] = new Vector2(Cam.redBlobs[i].Width/2, Cam.redBlobs[i].Height/2);
tempCenter = camTileCenter[i];
}
}
}
}
我试着用一些值瞎搞,以及如何该课程已初始化,但没有占上风。
我的完整的错误:在gameCalibration
NullReferenceException: Object reference not set to an instance of an object
gameCalibration.Update() (at Assets/Scripts/gameCalibration.cs:21)
错误行:gInit.goTile[i].GetComponent<Renderer>().enabled = true;
public gridInit gInit = new gridInit();
代替
public gridInit gInit;
我没有看到你创建对象的实例随时随地
对象在gridInit.cs中实例化,然后我想在其他类中使用该数组的内容。 –
@JonDier你需要通过 –
实例化类本身但是在'gameCalibration'里面你不创建创建数组的对象的实例 – FakeCaleb
问题是类,gridInit
尚未实例,当你有这种情况
public gridInit gInit;
public gridInit gInit2 = new gridInit();
gInit.goTile[i].GetComponent<Renderer>().enabled = false;
gInit2.goTile[i].GetComponent<Renderer>().enabled = false;
现在你怎么想发生在这里借这个情况,例如
public List<string> exS;
public List<string> exS2 = new List<string>();
Console.WriteLine(exS.Count); //The List<string> is null, as it has not been instantiated - errors
Console.WriteLine(exS2.Count); //the List<string> is blank, as it was instantiated with new List<string>() - prints 0
这样? gInit
为空,因为它没有实例化,而gInit2
的作品,因为当我们使用= new gridInit();
它创建了类的新实例,然后创建它的变量
我一直在这条路上,但由于它没有解决我的问题,我只是在发布之前编辑我的代码。很高兴知道为什么需要这样做的原因。但是,尽管开始,问题仍然存在。 –
在这种情况下,改变这个'void Start(){GenerateTileMap(); Screen.fullScreen = true;向公共gridInit(){ GenerateTileMap(); Screen.fullScreen = true;当你实例化对象时,这个构造函数会被调用 –
要么是这个,要么尝试'public gridInit gInit;'然后在你的'Start'方法中放这个'gInit = new gridInit();' –
您需要实例化类的外观,因为你永远不会这样做 - 它从来没有将其称为启动方法 –
您是否在检查器中为gInit分配参考?你能指出它抛出异常的那一行吗? –
您可以添加一些日志记录来确定哪个引用为空?它是'goTile [i]'还是'GetComponent()'?知道这些信息会澄清手头的问题。 –
Serlite