欢迎光临散文网 会员登陆 & 注册

Unity学习记录/ #3 ScriptableObject

2022-06-22 16:25 作者:Kanada_a  | 我要投稿

//

    本专栏为本人对ScriptableObject的学习记录,欢迎分享学习经验和指出本文的错误之处。

//

    让我们来试着想象一下,当我们想要做一款经典RPG模式的游戏(像勇者斗恶龙,最终幻想)的时候,我们需要在这个架空世界里加入玩家、怪物、NPC、道具、货物、任务等等,玩家拥有各种各样的属性和技能(如攻击力ATK,防御力DEF等等),而怪物我们又能细分成很多不同的种类,不同种类下又能有多种怪物,它们各有各不同的数据。在一般情况下,我们通常会使用继承的方式来写这些数据脚本,但这样我们每次生成一个怪物的时候,都会实例化一次,Unity中有没有东西是专门用来处理数据的呢。那么我们这次的主角,ScriptableObject就该登场了。

一、介绍

    ScriptableObject(以下简称SO),中文翻译为脚本化对象,它不是一种Unity组件,而是一个类。在Unity官方文档中是这样介绍的:“ScriptableObject 是一个可独立于类实例来保存大量数据的数据容器。ScriptableObject 的一个主要用例是通过避免重复值来减少项目的内存使用量。”哦!它是可以用于存储数据的。

Unity官方文档

    当我们在项目中可以熟练运用SO的时候,这将对整个开发的过程是非常有帮助的。当策划规划好了项目流程和数据,美术准备好了众多精美的美术素材,想要将它们放进游戏中,倘若他们看不懂要将数据和素材添加到哪个物体上的哪个脚本,将是非常让人头疼的。SO就可以完美解决这种状况,策划和美术只需要在游戏数据文件中添加即可(前提你所写的SO非常清楚明了)。从某种意义上来说,SO的功能也就是一个策划表,记录和展现游戏中的数据给项目的每个人看。

二、我们的第一个SO!

    快来动手写出我们的第一个SO脚本吧,这并不是一个非常困难的事情,SO脚本其实很简单。

    首先新建一个脚本文件名为PlayerData_SO,并让该类继承SriptableObject类,正是因为继承了SO类,该脚本并不能挂载到物体上,但我们可以在其中写入数据,Unity编辑器会将其写入硬盘中持久化数据

SO脚本都以SO结尾
继承SO类

    为了能够在该SO脚本中编辑数据,我们需要给它添加一个CreateAssetMenu属性。

该属性要写在类的上方

    这个CreateAssetMenu属性允许我们在Asset菜单的 Data/ PlayerData_SO下,新建一个SO文件默认名为“PlayerData_SO”,你可以看到因为我们在SO脚本中什么都还没写,所以该文件创建后是空的内容。

可以创建多个来实现多职业的数据

        让我们来为这个玩家角色写入数据。新建一个角色,他可能需要名字、年龄、性别、攻击力、防御力、甚至是立绘等等属性。SO脚本中可以存储非常多种的数据类型,此外可以是GameObject、Vector、Audioclip、List、甚至是你所创建的类等等,非常的人性化。

不用进行赋值

    值得注意的是,当我们使用创建新类的数据时,要给新的类加上System.Serializable属性,也就是序列化(关于序列化就不过多介绍),这样子我们才能在项目面板上它的内容。


写一个技能组为例

    重新打开我们新建的数据文件,在右侧面板中就可以看见具体的内容,并对其进行修改。

是不是已经有内味了呢
三、使用

三、使用我们的SO数据

    在我们创建好了一个玩家应有的数据之后,我们就可以在具体的PlayerControl脚本(也就是玩家控制脚本)中使用它了。具体的做法是,在PlayerControl脚本中声明一个PlayerData_SO变量,访问类型是public,将脚本挂载到玩家对象身上后,将所需的数据文件拖给它,这样我们的玩家控制脚本就能访问到策划和美术所设置的玩家数据,也不会出现混乱和意外修改。

声明变量
实例化后赋值

    并且,SO文件的数据是持久化的,也就是我们对数据所做出的修改是会被保存下来并存进硬盘中的。优秀的设计模式会将数据分为不可变数据和可变数据,前者主要用于配置数据,也就是我们所说的策划表,例如存储人物的名字、物品的名字等等;后者则是玩家自己的数据,它会随着玩家对游戏进度的推进而改变,如等级、攻击力、防御力等等。这两者独立开来进行编写,就可以防止出错。

四、强大的SO!

    SO只有上面所展现的这些作用吗?当然永不止这点!正如最开始所说的SO的功能非常强大,它可以帮助到我们非常多,保存玩家设置偏好、游戏场景加载、脚本绘制场景等等。甚至有大佬利用SO来替代单例模式,避免了单例模式的使用(单例模式是一种编程设计模式,有用但并不提倡频繁使用)。所以在你学习Unity的过程中,SO是必不可少的工具,掌握并熟练使用它可以让你受益很多!我推荐你认真学习好SO,并将它用到你的项目中去。

本期推荐学习教程:

1、https://www.bilibili.com/video/BV1X84y1F7aY?share_source=copy_web

(依旧是麦扣老师的强大系列教程!)

2、https://www.bilibili.com/video/BV1k54y1r78X?share_source=copy_web

(咖喱饭老师的很多视频都有用到SO)

3、https://www.bilibili.com/video/BV1GY41137m8?share_source=copy_web

(SO与有限状态机的结合,我猜你会感兴趣的)


Unity学习记录/ #3 ScriptableObject的评论 (共 条)

分享到微博请遵守国家法律