Unity ScriptableObject学习笔记

引言

最近在做3DRPG游戏的时候,需要玩家或者敌人的一些属性,比如血量,防御力等等。

方法一

我首先想到的方法是,写一个敌人脚本,然后里面有很多的属性,比如血量和防御力,但是如果我这么写,那我每创建一个敌人对象,那我的这些属性统统需要我自己重新设置,如果属性一多,那么就很麻烦。

方法二

然后我改进了下,就弄一个C#类,不继承MonoBehaviour,它相当与一个数据类,然后我在这个类里面为我的属性赋值,然后每一个对象被创建的时候,在该对象的Awake方法里面为该对象的属性赋值。这样的就可以不用每次都手动重新设置了。但是有么有更好点的方法呢。

方法三

然后我就找到了ScriptableObject,这个东西的概念我是先看了几篇文章,我把我觉得好的容易理解的文章的链接放在下方了。
传送门1
传送门2

例子

我就拿我现在做的游戏为例子吧,算是记录下,免得以后忘记咋写了。。。

步骤一:

首先我们需要一个配置文件,如果需要新建一个配置文件的话就先要写一个脚本继承自ScriptableObject,然后再把它实例化为配置文件,那么第一步就是新建一个脚本,命名为CharacterData_SO,SO代表ScriptableObject,可以一眼看出来他是继承自ScriptableObject,之后把对象的一些属性给写好。

[CreateAssetMenu(fileName = "New Data", menuName = "Character Stats/Data")]
public class CharacterData_SO : ScriptableObject
{
    [Header("Stats Info")]
    public int maxHealth;
    public int currentHealth;
    public int baseDefence;
    public int currentDefence;
}

步骤二

之后在Assets目录下新建一个文件夹,叫Game Data,这个文件夹存放的是所有的配置文件,然后在这个目录下创建一个文件夹,叫做Character Data,存放的是所有角色的配置文件。
之后就可以在Character Data文件夹下右击鼠标,然后点击Creat,就可以找到我们的Character Stats了,然后再点击Data创建一个配置文件,名字叫做PlayerData,然后再创建一个配置文件,叫做SlimeData。下方贴出完成之后的样子。还有我已经在Inspectors窗口下配置好了属性了。Unity ScriptableObject学习笔记

步骤三

此时我们已经有了配置文件了,但是我们怎么让角色读取我这里面的数据呢,我们又不可以直接将这个配置文件或者之前继承ScriptableObject(下方统称CharacterData_SO)挂载到我们的角色上。那我们就可以自己写一个脚本,然后这个脚本里面有CharacterData_SO脚本的实例(也就是配置文件),然后我们利用这个脚本就可以间接访问配置文件里面的数据了。
所以我们创建一个CharacterStats的脚本,这次继承的是MonoBehaviour。

public class CharacterStats : MonoBehaviour
{
    public CharacterData_SO characterData;

    public int MaxHealth
    {
        get { return characterData == null ? 0 : characterData.maxHealth; }
        set { characterData.maxHealth = Mathf.Max(value, 0); }
    }
    public int CurrentHealth
    {
        get { return characterData == null ? 0 : characterData.currentHealth; }
        set { characterData.currentHealth = Mathf.Max(value, 0); }
    }
    public int BaseDefence
    {
        get { return characterData == null ? 0 : characterData.baseDefence; }
        set { characterData.baseDefence = Mathf.Max(value, 0); }
    }
    public int CurrentDefence
    {
        get { return characterData == null ? 0 : characterData.currentDefence; }
        set { characterData.currentDefence = Mathf.Max(value, 0); }
    }
}

步骤四

我们将该脚本拖拽到我们的角色上。之后在Inspector面板上将PlayerData配置文件拖到CharacterStats的characterData属性上面。相当于我们只需要在我们的PlayerController里面声明一个CharacterStats变量,之后利用这个变量我们可以得到CharacterData_SO实例,然后我们就可以间接读取到配置文件里面的数据了。

至此需求已完成。

说在结尾

ScriptableObject可以用来写配置文件,可以更便捷地去修改我们角色或者一些其他敌人的一些属性。而且也可以提高游戏效率,毕竟每一个角色的配置文件都只有一个。不用为每一个角色对象都拷贝相同的数据。

上一篇:UGUI学习笔记之ScrollView以及ScrollRect和Mask组件


下一篇:[Unity编辑器扩展基础总结] 第4章 脚本化对象 ScriptableObject