Unity3d ScriptableObject那些事

探讨了ScriptableObject类在制作行为树编辑器数据存储时遇到的问题,详细介绍了两种解决方案及各自的应用场景,并通过实例解释了如何正确使用第二种方法以避免创建的资产中board对象始终为null的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

最近在写行为树编辑器 数据存储用到ScriptableObject在制作过程中 对于ScriptableObject遇到一个棘手的问题 下面总结下:

 ScriptableObject类无法直接聚合ScriptableObject

 例如:

                     public class Blackboard: ScriptableObject{  }

                     public class BehaviourTree: ScriptableObject

                      {

                             [SerializeField]

                             public Blackboard board;

                             public void Init(){

                                    this.board=new Blackboard();

                                   //(或者:this.board=ScriptableObject.CreateInstance<Blackboard>())

                           }

                    }

这种写法Create 出来的BehaviourTree asset  的 board 等于null

问题来了 应该如何嵌套类 有二种方式:

 

第一种是最简单的:

          Blackboard类不要继承ScriptableObject,在Blackboard类上加上[System.Serializable] 特性  

         注意 Blackboard 不能是抽象类。

第二种相对复杂点:

           Blackboard依然继承ScriptableObject.

  代码片段:

           BehaviourTree tree = ScriptableObject.CreateInstance<BehaviourTree>();

           AssetDatabase.CreateAsset(tree, "Assets/NewBehaviourTree.asset");

           Blackboard blackboard= ScriptableObject.CreateInstance< Blackboard >()

           if (EditorUtility.IsPersistent(tree))

            {

                AssetDatabase.AddObjectToAsset(blackboard,tree);

            }

           tree. board =blackboard;

           AssetDatabase.SaveAssets();

 

既然有简单的方法 为什么还需要第二种方法?

  下面举个例子:

               采用第一种方法, 新增加个类MyBlackboard:

               public class MyBlackboard: Blackboard { }

               BehaviourTree类改为:

               public class BehaviourTree: ScriptableObject{

                     [SerializeField]

                     public Blackboard board;

                     public void Init(){

                           this.board=new MyBlackboard();

                    }

               }

这种情况下Create 出来的BehaviourTree asset获取到的board值只会是Blackboard类

强转的结果 (board as MyBlackboard) 只会是null

如果采用第二种方式 则是可以正确获取到想要的MyBlackboard


但需要将MyBlackboard  也就是子ScriptableObject对象的HideFlags属性 设置为HideFlags.HideInHierarchy

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值