c# - NullReferenceException:对象引用未设置为对象的实例。通过 Unity 教程
问题描述
我按照 Unity 教程编写了一个版本的 Flappy Bird 但我收到错误 NullReferenceException: Object reference not set to an instance of an object Parallaxer.Shift () (at Assets/scripts/Parallaxer.cs:130) Parallaxer.Update ( ) (在 Assets/scripts/Parallaxer.cs:75) uijk,hfgmjdcfmhfc,ghvkmbgµfhj,ddgxngsdfaf
This is the code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Parallaxer : MonoBehaviour
{
class PoolObject
{
public Transform transform;
public bool inUse;
public PoolObject(Transform t) { transform = t; }
public void Use() { inUse = true; }
public void Dispose() { inUse = false; }
}
[System.Serializable]
public struct YSpawnRange
{
public float min;
public float max;
}
public GameObject Prefab;
public int poolSize;
public float shiftSpeed;
public float spawnRate;
public YSpawnRange ySpawnRange;
public Vector3 defaultSpawnPos;
public bool spawnImmediate;
public Vector3 immediateSpawnPos;
public Vector2 targetAspectRatio;
float spawnTimer;
float targetASpect;
PoolObject[] poolObjects;
GameManager game;
private void Awake()
{
}
private void Start()
{
game = GameManager.Instance;
}
private void OnEnable()
{
GameManager.OnGameOverConfirmed += OnGameOverConfirmed;
}
private void OnDisable()
{
GameManager.OnGameOverConfirmed -= OnGameOverConfirmed;
}
void OnGameOverConfirmed()
{
for (int i = 0; i < poolObjects.Length; i++)
{
poolObjects[i].Dispose();
poolObjects[i].transform.position = Vector3.one * 1000;
}
if (spawnImmediate)
{
SpawnImmediate();
}
}
void Update()
{
if (game.GameOver) return;
Shift();
spawnTimer += Time.deltaTime;
if (spawnTimer > spawnRate)
{
Spawn();
spawnTimer = 0;
}
}
void Configure()
{
targetASpect = targetAspectRatio.x / targetAspectRatio.y;
poolObjects = new PoolObject[poolSize];
for (int i = 0; i < poolObjects.Length; i++)
{
GameObject go = Instantiate(Prefab) as GameObject;
Transform t = go.transform;
t.SetParent(transform);
t.position = Vector3.one * 1000;
poolObjects[i] = new PoolObject(t);
}
if (spawnImmediate)
{
SpawnImmediate();
}
}
void Spawn()
{
Transform t = GetPoolObject();
if (t == null) return;
Vector3 pos = Vector3.zero;
pos.x = defaultSpawnPos.x;
pos.y = Random.Range(ySpawnRange.min, ySpawnRange.max);
t.position = pos;
}
void SpawnImmediate()
{
Transform t = GetPoolObject();
if (t == null) return;
Vector3 pos = Vector3.zero;
pos.x = immediateSpawnPos.x;
pos.y = Random.Range(ySpawnRange.min, ySpawnRange.max);
t.position = pos;
Spawn();
}
void Shift()
{
for (int i = 0; i < poolObjects.Length; i++)
{
poolObjects[i].transform.position += -Vector3.right * shiftSpeed * Time.deltaTime;
CheckDisposeObject(poolObjects[i]);
}
}
void CheckDisposeObject(PoolObject poolObject)
{
if (poolObject.transform.position.x < -defaultSpawnPos.x)
{
poolObject.Dispose();
poolObject.transform.position = Vector3.one * 1000;
}
}
Transform GetPoolObject()
{
for (int i = 0; i < poolObjects.Length; i++)
{
if (!poolObjects[i].inUse)
{
poolObjects[i].Use();
return poolObjects[i].transform;
}
}
return null;
}
}
谢谢您的帮助。
解决方案
我认为您需要致电或Configure
。否则数组不会被初始化并且尝试访问会导致 NullRefrence 错误。Start
Awake
poolObjects
poolObjects[i]
Shift
推荐阅读
- django - 在前端使用 django restframework 时如何获取选择域的所有选项
- javascript - double 类型的数量转换为指数类型
- reactjs - React Ref 的 offsetheight,即使在加载内容后,对于开玩笑的测试用例也总是返回 '0'
- python - df.pyplot 中的 Markevry
- javascript - 更改图片的src属性是否会导致回流?
- c# - 如果密钥中的值发生更改,密钥库值不会更新,因为它会为密钥生成新版本
- c# - 实体框架和 AsQueryable 性能问题
- oracle - FRM-50026 日期必须以 DD-MON-YYYY 等格式输入
- google-cloud-platform - 保护 Google 云功能免受 DDOS 攻击的最佳方法是什么
- javascript - 如何使用javascript更改文本颜色?