2023年11月27日发(作者:)

UnityScriptsERRORUnity脚本报错合集(附带解决办法)

Unity 报错合集,从现在开始记录于该博客中

1. 前⾔

⽤于汇总在代码书写中所遇到的错误,⽅便⾃⼰和⼀些同样在书写Unity脚本时遇到此类错误的同僚进⾏查找和解决问题。直接在⽹页

中按住进⾏报错问题的搜索即可!!该⽂档将会不断地得到完善,直到放弃Unity编程。

Ctrl + F

2. 错误名 && 错误原因 && 解决⽅法

2.1 The supplied array needs to be the same size as the es array.

问题提⽰,与顶点Vertices的数量不⼀致,超出边界,然后将三个值打印出来(创建MeshFilter之前),代码&&报错 如图:

代码:

Debug.Log("==========");

Debug.Log("temp_Nor_: " + temp_Nor_List.Count);

Debug.Log(": " + points.Count);

Debug.Log(": " + newTriangles.Length);

Debug.Log("==========");

//

获得切⾯顶点法向量

mesh.normals = temp_Nor_List.ToArray();

//

获得切⾯顶点坐标

mesh.vertices = points.ToArray();

//

获得切⾯三⾓关系

mesh.triangles = new int[newTriangles.Length];

mesh.triangles = newTriangles;

//

绘制

cutPlaneMark(mesh);

Debug.Log("绘制结束");

// ""

绘制函数将三⾓⾯⽣成新的物体进⾏渲染并绑定到原物体上,从⽽实现视觉上的物体某⼀个⾯的渲染

//Shader

这个操作是不会编程⽽采取的替代⼿段

//cutPlaneMark(Mesh mesh);

cutPlaneMark(points, temp_Nor_List, newTriangles);

报错:

因此,可以确认的是:这跟三个量所对应的数量⽆关()

属于正常,不存在问题

解决办法:

绕开Mesh,⽽是直接给 cutPlaneMark()函数传⼊Mesh的三个数组数据,则不会报错

void cutPlaneMark(List<Vector3> ver,List<Vector3> nor,int[] tri )

{

//Mesh meshToMark = new Mesh(mesh);

//Mesh meshToMark = mesh;

//es = es;

//es = es;

//les = les;

//s = s;

//shNow(meshToMark, ,ty);

GameObject PlaneMark = new GameObject("PlaneMark");

PlaneMark.transform.SetParent(beCutThing.transform);

PlaneMark.AddComponent<MeshFilter>();

PlaneMark.GetComponent<MeshFilter>().mesh.vertices = ver.ToArray();

PlaneMark.GetComponent<MeshFilter>().mesh.triangles = tri;

PlaneMark.GetComponent<MeshFilter>().mesh.normals = nor.ToArray();

PlaneMark.transform.position = Vector3.zero;

PlaneMark.transform.rotation = Quaternion.Euler(Vector3.zero);

PlaneMark.tag = "temp_cutplane_mark";

PlaneMark.AddComponent<MeshRenderer>();

PlaneMark.GetComponent<MeshRenderer>().material.color = Color.red;

GameObject planeMark = GameObject.Instantiate(PlaneMark);

Vector3[] temp_nor = planeMark.GetComponent<MeshFilter>().mesh.normals;

for(int i=0;i<temp_nor.Length;i++)

{

temp_nor[i] = -temp_nor[i];

}

planeMark.GetComponent<MeshFilter>().mesh.normals = temp_nor;

}

效果如图:

(总结:结果不理想,标注未达到预期效果,重新考虑新的办法(Shader编程 ),与上述代码报错⽆关)

2.2 ()查找失败

NullReferenceException : al..ctor ( shader) (at

D:/unity/artifacts/generated/common/runtime/:254)

GameObject line1 = new GameObject("line1");

line1.transform.SetParent(beCutThing.transform);

line[0] = line1.AddComponent<LineRenderer>();

line[0].material = new Material(Shader.Find("snapTurnArrow"));

line1.GetComponent<LineRenderer>().useWorldSpace = false;

line[0].positionCount = points.Count + 1;

line[0].startWidth = 0.0003f;

line[0].endWidth = 0.0003f;

for (int i = 0; i < points.Count; i++)

line[0].SetPosition(i, points[i]);//

设置渲染顶点

line[0].SetPosition(points.Count, points[0]);

错误原因:

此处是因为我查找的是⼀个格式为Material的材质,⽽⾮Shader类型。并且Shader只能找到Resources⽂件夹中的(来⾃于⽹络),但

是可以采⽤如下办法进⾏规避该错误:,并主动进⾏赋值,则不需要利⽤()⽅法进⾏查找。

public Shader shader;

解决办法:

⾸先在类开始处定义⼀个Material变量,并在Unity中赋值

然后将改为:

line[0].material = new Material(("snapTurnArrow"));line[1].material = material;

2.3 修改gameobjectPositionRotation 不能达到预期

Position VS localPosition && Rotation VS localRotation(简单讲解)

当前Unity版本为 2017.3.0f ,需要注意的是:在此版本中Transform中对旋转⾓和位置做了区分

对⽐:

项⽬Value

position表⽰物体的世界坐标

localRotation表⽰物体的局部坐标(以⽗物体为参照)

rotation表⽰物体的世界旋转⾓度

localRotation表⽰物体的局部旋转⾓度(以⽗物体为参照)

代码:

line1.transform.position = Vector3.zero;

line2.transform.position = Vector3.zero;

Debug.Log("on: " + line1.transform.position);

Debug.Log("on: " + line2.transform.position);

Debug.Log("=========修正位置&&⾓度==========");

//on = ;

//on = ;

line1.transform.localPosition = Vector3.zero;

line2.transform.localPosition = Vector3.zero;

Debug.Log("on: " + line1.transform.position);

Debug.Log("on: " + line2.transform.position);

Debug.Log("============修正完成=============");

通过对⽐可

知,localPosition才将其Position选项变为了(0,0,0)–>局部坐标,Position代表世界坐标,当物体的Position被赋值时,Unity会⾃

动将其转化为当前的局部坐标进⾏赋值!!

采⽤局部坐标和旋转⾓度后 获得预期效果

Debug.Log("=========修正位置&&⾓度==========");

line1.transform.localPosition = Vector3.zero;

line2.transform.localPosition = Vector3.zero;

Debug.Log("on: " + line1.transform.position);

Debug.Log("on: " + line2.transform.position);

line1.transform.localRotation = Quaternion.Euler(Vector3.zero);

line2.transform.localRotation = Quaternion.Euler(Vector3.zero);

Debug.Log("============修正完成=============");

2.4 空指针报错 NullReferenceException -->(Unity三维模型导出插件 Exporter相关)

NullReferenceException: Object reference not set to an instance of an object (wrapper stelemref) object:stelemref (object,intptr,object)

经过验证,是该数组在定义时未进⾏内存分配!

⽽在调⽤sToExport 时,直接进⾏赋值,导致出错

sToExport[0] = game;

public void ObjExporter()

{

ImgSpcExporter imgSpcExporter = new ImgSpcExporter();

string path = Application.dataPath + "/ExportFile/" + "" + Export_num + "个导出的⽂件.obj";

Directory.CreateDirectory(path + "ExportFile");

Debug.Log("path: " + path);

imgSpcExporter.SetFilename(path);//

设置导出⽂件夹

//

执⾏导出操作

GameObject game = GameObject.FindWithTag("ChosenObject");

Debug.Log("game:" + (game == null ? "yes" : "no"));

if (game != null)

{

imgSpcExporter.ObjectsToExport = new Object[1];//

需要先进⾏内存分配再赋值避免报错

imgSpcExporter.ObjectsToExport[0] = game;

imgSpcExporter.Export();

Debug.Log("已经导出!!");

}

else

{

Debug.Log("未找到物体");

}

}

2.5 LineRenderer渲染出错

传⼊LineRenderer的为点集(SetPosition(index,position) ⽅法),但是渲染出来却是⼀整块正⽅形区域,并且⼤⼩和预设值不同。

问题原因:

我给⽗物体也增加了LineRenderer组件,导致报错,删去即可。在给物体做额外的标记,仅需要给其⼦物体加上LineRenderer进⾏渲

染就可以

代码

GameObject line2 = new GameObject("line2");

Debug.Log("line2" + line2);

line2.tag = "temp_cutplane_mark";

line2.transform.SetParent(beCutThing.transform);

line[1] = line2.AddComponent<LineRenderer>();//lineLineRenderer

数组

line[1].material = material;

//line[1].material = new Material(("snapTurnArrow"));

line2.GetComponent<LineRenderer>().useWorldSpace = false;

line2.transform.localScale.Set(1, 1, 1);//

设置其⼤⼩,避免出现过⼤情况就不会附着在⽗物体上

line[1].positionCount = points.Count + 1;

line[1].startWidth = 0.0003f;

line[1].endWidth = 0.0003f;

for (int i = 0; i < points.Count; i++)

line[1].SetPosition(i, points[i]);//

设置渲染顶点

line[1].SetPosition(points.Count, points[0]);

line2.transform.localPosition = Vector3.zero;

line2.transform.localRotation = Quaternion.Euler(Vector3.zero);

2.6 Failed setting triangles. Some indices are referencing out of bounds vertices

Mesh中Triangles数组存储的顶点索引值超过了Vertices的⼤⼩

对于此类问题,⾸先可以⼤致确定问题出在中,

Triangles数组的赋值过程