作者elcnick (左手妹妹右手女友)
看板GameDesign
标题Re: [程式] Unity遇到List初始化器就闪退?
时间Sun Dec 8 14:29:52 2019
首先,你要弄清楚Unity3d的序列化规则
MonoBehaviour能被序列化的栏位(Field)为
1. 宣告为public
2. 带有标签[UnityEngine.SerializeField] 但为non public
的栏位
3. 没有带标签[System.NonSerialized]
4. Property预设是无法序列化的
能被序列化的类型为
1. 基础资料类型,例如int string float 等等
2. 带有[System.SerializableAttribute]的class或者struct
并且不能有递回结构,要不然会跳出错误
3. 继承自UnityEngine.Object,受Unity控管的物件
4. T[]或者List<T> T为能序列化的类型
作为第2种结构,资料储存方式会是树状的
作为第3种结构,会有该物件专属的id,会是一笔一笔的纪录
而MonoBehaviour是Unity控管的物件,请不要自行呼叫其建构子
这是必定错误的写法
如果想更清楚明白,其实你可以直接用纯文字打开档案较小的.asset或者场景
其资料类型是yaml,这应该有助於你了解其资料结构
而会闪退的原因应该只是代码造成无穷递回的关系
Visual Studio版本应该也会一样的情况,如果是没有印出任何讯息
代表只是要比较久才会发生堆叠溢位
最後,Unity3D,其编辑器预设上可以编辑序列化结构的资料
使用编辑器栏位初始化你的资料,不要在代码去增加资料
public class MegBox:MonoBehaviour
{
// 在这边,编辑器是可以直接更改资料内容的
[SerializeField]
private Data[] m_DataList;
void Start()
{
if(m_DataList!=null)
{
//Do something
}
}
}
[System.Serializable]
public class Data
{
public string P;
public int M;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.71.86.16 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1575786595.A.3F9.html
※ 编辑: elcnick (111.71.86.16 台湾), 12/08/2019 15:05:11
1F:推 berice152233: 非常感谢学长的解说 12/09 16:21
2F:→ berice152233: 正在用你说的方法研究如何改进,谢谢 12/09 16:21