基于Unity3d引擎的数据驱动尝试

前些天尝试搭建的组件化的游戏框架的雏形已经确定,从传统的层级架构思维转到组件思维上的确有些东西会感到迷茫。

我定义了一个Entity类作为组件和属性容器,用组件来处理行为,属性保存状态。这样的话,如果基于数据驱动,Entity通过配置来加载组件和属性。那所有的GameObject只要一个Entity脚本就可以通用,所有的开发就集中在组件功能开发,可以通过配置来尝试加载不同的组件,组合实体的不同行为,有更多的精力去调整玩法。

OK,思想确定了,剩下的就是实现了,我选的C#语言,跟脚本语言比较起来,各种数据类型的匹配以及上下转型让我苦不堪言。考虑一下后使用反射机制来加载组件,属性保存在容器里读取。

最早的尝试用Entity来定义两个字典components和properties用来键值对容器保存组件和属性值。结果在序列化得时候发现,Unity的JsonUitlity不支持字典的序列化。

于是另辟蹊径,自定义一个StringPair的类,使用List<StringPair>来存储。OK,这样就解决了序列化的问题,但是产生另外一个问题,当访问属性的时候会遇到一个性能问题,每个属性都需要遍历List才能取到想要的值。

继续寻找解决方案,Google了一下发现Unity提供了一个IserializationCallbackReceiver接口,可以在序列化前和反序列化后提供一个回调方法。于是开始动手封装一个可序列号的自定义字典,方案就是用一个Dictionary存储数据,用一个List保存Key,一个List保存Value序列化这两个List。然后在序列化前把字典的数据加载到两个List里保存,反序列化之后再从List里取值出来,Add到字典里。测试自定义字典OK。

之后再Entity中使用自己写的可序列号的字典,发现字典在一个可序列化的类中,没有调用IserializationCallbackReceiver的接口。很崩溃,不知道为什么不支持嵌套。那只能放弃可序列化的字典,直接用Entity去实现IserializationCallbackReceiver的接口,方法和上面的类似 也是通过两个List。最后实现了序列化和反序列化,但是看生成的json文件格式,对一个完美主义的人,真是不能接受。看到键值分成两块儿,太痛苦了。而且在Inspecor上面也看不到字典类型的属性值。

最后决定使用之前的List<StringPair>来做序列化,这样在Inspecor上也能方便的看到各参数。再把两个List映射到两个字典里,用字典保存,来快速访问属性。提供个访问和读取的接口,同步List和Dictionary的数据。

最后算是实现了Entity的数据驱动,但也总觉得不够优雅。之后再去想想其他的方式,折腾了一天,现在的我很怀念Lua。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值