List<T> 在 Unity 中编写脚本时继续抛出 "NullReferenceExceprion",即使它已初始化
List<T> keep throwing "NullReferenceExceprion" when scripting in Unity, even though it is initialized
我正在做我的 Unity 项目,这是在我编写 C# 脚本时发生的。只要此脚本附加的对象处于活动状态,它就会不断抛出 NullReferenceException
。导致该异常的是 List<T>.Add()
函数,但我没有办法阻止它。
请注意,我已经初始化了列表,但它似乎没有正常工作。
(我需要的是一个解决方案,其他的可以稍后。)
这是我的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tracer : MonoBehaviour
{
public float tracerSize;
public int fadeCount;
private MeshFilter mf;
private Mesh mesh;
private List<Vector3> positionArray;
private List<int> index;
private List<Color> clr;
private List<Vector3> vec;
private Transform trans;
private Color tracerColor;
void Start()
{
trans = GetComponentInParent<Transform>();
tracerColor = GetComponentInParent<SpriteRenderer>().color;
mf = GetComponent<MeshFilter>();
index = new List<int>() { 0, 0, 0, 0, 0, 0 };
clr = new List<Color>() { };
vec = new List<Vector3>() { };
mesh = new Mesh();
mf.mesh = mesh;
}
void Update()
{
positionArray.Add(trans.position);
if (positionArray.Count > fadeCount)
{
positionArray.RemoveAt(0);
}
mesh.Clear();
index.Clear();
clr.Clear();
vec.Clear();
for (int i = 1; i < fadeCount; i++)
{
int ii = (i - 1) * 4;
index.AddRange(new int[] { 0 + ii, 1 + ii, 2 + ii, 2 + ii, 3 + ii, 0 + ii }); // throw!
clr.Add(new Color(tracerColor.r, tracerColor.g, tracerColor.b, (tracerSize - i) / (float)tracerSize)); // throw!
vec.AddRange(CalculateQuad(positionArray[i - 1], positionArray[i], (tracerSize - i + 1) / (float)tracerSize, (tracerSize - i) / (float)tracerSize)); // throw!
}
mesh.triangles = index.ToArray();
mesh.colors = clr.ToArray();
mesh.vertices = vec.ToArray();
}
private Vector3[] CalculateQuad(Vector3 f, Vector3 b, float sizf, float sizb)
{
Vector3 vec = f - b;
Vector3 vecN = Vector3.Normalize(vec);
Vector3 vecf = new Vector3(vecN.y, -vecN.x) * sizf, vecb = new Vector3(vecN.y, -vecN.x) * sizb;
return new Vector3[]
{
vecf, -vecf, -vecb, vecb
};
}
}
我猜线上发生了 NullReferenceException
positionArray.Add(trans.position);
此变量已声明但未像其他列表一样在 Start() 函数中初始化
要调试此类问题,请检查错误日志,它应该会给你行。您可以使用 Debug.Log
打印您的变量并找到空变量。
我正在做我的 Unity 项目,这是在我编写 C# 脚本时发生的。只要此脚本附加的对象处于活动状态,它就会不断抛出 NullReferenceException
。导致该异常的是 List<T>.Add()
函数,但我没有办法阻止它。
请注意,我已经初始化了列表,但它似乎没有正常工作。
(我需要的是一个解决方案,其他的可以稍后。)
这是我的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tracer : MonoBehaviour
{
public float tracerSize;
public int fadeCount;
private MeshFilter mf;
private Mesh mesh;
private List<Vector3> positionArray;
private List<int> index;
private List<Color> clr;
private List<Vector3> vec;
private Transform trans;
private Color tracerColor;
void Start()
{
trans = GetComponentInParent<Transform>();
tracerColor = GetComponentInParent<SpriteRenderer>().color;
mf = GetComponent<MeshFilter>();
index = new List<int>() { 0, 0, 0, 0, 0, 0 };
clr = new List<Color>() { };
vec = new List<Vector3>() { };
mesh = new Mesh();
mf.mesh = mesh;
}
void Update()
{
positionArray.Add(trans.position);
if (positionArray.Count > fadeCount)
{
positionArray.RemoveAt(0);
}
mesh.Clear();
index.Clear();
clr.Clear();
vec.Clear();
for (int i = 1; i < fadeCount; i++)
{
int ii = (i - 1) * 4;
index.AddRange(new int[] { 0 + ii, 1 + ii, 2 + ii, 2 + ii, 3 + ii, 0 + ii }); // throw!
clr.Add(new Color(tracerColor.r, tracerColor.g, tracerColor.b, (tracerSize - i) / (float)tracerSize)); // throw!
vec.AddRange(CalculateQuad(positionArray[i - 1], positionArray[i], (tracerSize - i + 1) / (float)tracerSize, (tracerSize - i) / (float)tracerSize)); // throw!
}
mesh.triangles = index.ToArray();
mesh.colors = clr.ToArray();
mesh.vertices = vec.ToArray();
}
private Vector3[] CalculateQuad(Vector3 f, Vector3 b, float sizf, float sizb)
{
Vector3 vec = f - b;
Vector3 vecN = Vector3.Normalize(vec);
Vector3 vecf = new Vector3(vecN.y, -vecN.x) * sizf, vecb = new Vector3(vecN.y, -vecN.x) * sizb;
return new Vector3[]
{
vecf, -vecf, -vecb, vecb
};
}
}
我猜线上发生了 NullReferenceException
positionArray.Add(trans.position);
此变量已声明但未像其他列表一样在 Start() 函数中初始化
要调试此类问题,请检查错误日志,它应该会给你行。您可以使用 Debug.Log
打印您的变量并找到空变量。