【原创】在Unity中关于多态转换与序列化保存的细节
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【原创】在Unity中关于多态转换与序列化保存的细节,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1546字,纯文字阅读大概需要3分钟。
内容图文
在Unity中关于多态转换与序列化保存的细节
环境:
在unity中为类变量分类。
[System.Serializable] public class dllProperty { public int num1 = 1; public string name1 = "dll"; public bool isOn = false; } [System.Serializable] public class myProperty : dllProperty { public int num2 = 10; public string name2 = "my"; }public class dll2csharp : MonoBehaviour { public dllProperty[] dll = new myProperty[2];
此时在Inspector中显示的是父类dllProperty的成员。隐藏子类myProperty成员。
问题:
此时想clone个实例在Start函数中,转换为子类使用。则要么dll为空, 要么转换失败。
dllProperty p = new myProperty(); myProperty c = (myProperty)p; c.name2 = "p->c"; // 正常 myProperty mydll = (myProperty)(dll[0]); mydll2.name2 = "dll->mydll"; // 失败
分析解决:
猜想untiy对初始化进行了干扰。使初始化后的数组内容是父类dllProperty, 进而不能进行转换子类myProperty。
public class dll2csharp : MonoBehaviour { //面板不设置 public dllProperty[] dll = null; // 面板设置为2,则初始化为myProperty // 如果面板设置不为2,根据面板个数初始化为dllProperty // 猜测面板初始化在这之后。Awake之前。 public dllProperty[] dll2 = new myProperty[2] { new myProperty(), new myProperty() }; void Start () { dllProperty p = new myProperty(); myProperty c = (myProperty)p; c.name2 = "p->c"; // 动态赋值 dll = new myProperty[2] { new myProperty(), new myProperty() }; myProperty mydll = (myProperty)(dll[0]); mydll.name2 = "dll->mydll"; myProperty mydll2 = (myProperty)(dll2[0]); mydll2.name2 = "dll->mydll";}
}
结论:
1. 有父子转换需求的初始化,尽量放在Start/Awake中进行。保证在面板设置生效后。
2. unity中保存预设时,只保存声明的数据类型(此处的dllProperty)。而不保存实现的数据类型(此处的myProperty)。
故:实例化后,只有num1,name1的数据是保存的。num2,name2的数据是初始值。
原文:http://www.cnblogs.com/zhiGamer/p/6097055.html
内容总结
以上是互联网集市为您收集整理的【原创】在Unity中关于多态转换与序列化保存的细节全部内容,希望文章能够帮你解决【原创】在Unity中关于多态转换与序列化保存的细节所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。