2023年11月27日发(作者:)
<UnityScriptsERROR>Unity脚本报错合集(附带解决办法)
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 修改gameobject的Position和Rotation 不能达到预期
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数组的赋值过程


发布评论