游戏制作过程中难免会涉及到使用一些数据表。
很多游戏对数据表的使用方法是 用游戏对象去依赖数据表,比如初始化血量、攻击力等数值时,去根据相关表格进行计算。
但我个人更倾向于使用 数据表依赖游戏对象 的方法,游戏对象完全不依赖数据表的存在。具体的做法是:数据表中的数据读写,实际上是对游戏对象数据的读写,数据表只是相当于把多个游戏对象的数值汇总,以用于统一管理。
在 Unity 里我习惯使用 ScriptableObject
来作为数据表,这样的话引用 prefab
会很方便。给数据表的 property
加上 Odin Inspector
的 ShowInInspector
, 就可以实现通过 ScriptableObject
对 prefab
进行读写。
Prefab
是可以这样做了,但是由于场景中的对象无法在 ScriptableObject
中序列化,所以对于场景对象的修改还得想想办法。
我目前的办法是在场景中放一个对象 M, 用于存放场景中所有需要通过数据表进行修改的对象引用。每次使用数据表时,把 M 拖到数据表中进行数据表中引用的初始化,这样就可以了。
实际上大部分人大概都不是使用 ScriptableObject
来做数据表,而是使用例如 Excel, CSV 之类的表格。这些表格不能读取项目中游戏对象的实际参数,这时我认为应该使用 ScriptableObject
作为中介者,读取表格的数据,写入各个对象。
上面我所说的,都是针对游戏开发阶段。如果是 Stellaris
这类需要在发布后依赖外部表格的游戏,或者是玩家可以通过表格进行自定义修改的游戏,那么需要重新考虑问题。
大部人可能为认为做这些是多此一举,但我写工程习惯于简洁直接地表达事物之间的关系。在整个游戏逻辑里,数据表的概念实际上是不需要的,实际必要的是游戏对象的数值。数据表只是开发者开发时的中间产物,那么它就不应该出现在最后的发布版里。