在Unity中关于多态转换与序列化保存的细节

在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的数据是初始值。








来自为知笔记(Wiz)



转载于:https://my.oschina.net/zhenzhi868/blog/497463

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值