问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity3D ScriptableObject使用详解

创作时间:
作者:
@小白创作中心

Unity3D ScriptableObject使用详解

引用
CSDN
1.
https://blog.csdn.net/2301_76984003/article/details/137741790

Unity3D中的ScriptableObject是一个非常实用的数据存储类,可以用来创建和管理游戏配置数据。本文将详细介绍如何使用ScriptableObject,包括创建、获取数据、使用序列化类组织数据结构,以及在简单游戏中应用配置表的方法。

创建ScriptableObject

要使用ScriptableObject,首先需要创建一个继承自ScriptableObject的类,并添加创建菜单的代码。以下是一个简单的示例:

using UnityEngine;
[CreateAssetMenu(fileName = "SOConfig", menuName = "SOConfig", order = 0)]
public class SOConfig : ScriptableObject
{
    public string version;
}

创建数据文件后,可以在Unity编辑器中填写数据:

获取ScriptableObject数据

在其他脚本中,可以直接引用创建好的ScriptableObject数据文件。例如:

using UnityEngine;
public class SODemo : MonoBehaviour
{
    public SOConfig config;
    void Start()
    {
        Debug.Log($"version = {config.version}");
    }
}

使用序列化类组织数据结构

除了在ScriptableObject中定义单一的字段,还可以使用类来组织数据结构。这个类需要打上[Serializable]标签:

using System;
using UnityEngine;
[CreateAssetMenu(fileName = "SOConfig", menuName = "SOConfig", order = 0)]
public class SOConfig : ScriptableObject
{
    public string version;
    public ConfigData configData;
}
[Serializable]
public class ConfigData
{
    public string name;
    public string description;
}

简单游戏配置示例

对于一些简单的小游戏来说,使用ScriptableObject做配置表会比较简单快捷。例如,一个商店的商品列表:

using System;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "SOShop", menuName = "SOShop", order = 1)]
public class SOShop : ScriptableObject
{
    public List<SOShopItem> shopItems;
    public SOShopItem GetItem(int id)
    {
        return shopItems.Find(x => x.id == id);
    }
}
[Serializable]
public class SOShopItem
{
    public string name;
    public int id;
    public string description;
    public int price;
}

配置数据后,可以在其他脚本中使用这些配置:

using UnityEngine;
public class SODemo : MonoBehaviour
{
    public SOConfig config;
    public SOShop shop;
    void Start()
    {
        for (int i = 0; i < shop.shopItems.Count; i++)
        {
            SOShopItem item = shop.shopItems[i];
            Debug.Log($"name = {item.name} price = {item.price}");
        }
    }
}

动态修改配置

ScriptableObject文件中填写的数据可以在代码中赋值:

using UnityEngine;
public class SODemo : MonoBehaviour
{
    public SOConfig config;
    public SOShop shop;
    void Start()
    {
        config.version = "1.0.1";
    }
}

如果只想在运行时修改,不想覆盖旧值,可以让ScriptableObject创建实例:

using UnityEngine;
public class SODemo : MonoBehaviour
{
    public SOConfig config;
    public SOShop shop;
    public SOConfig configInstance;
    void Start()
    {
        configInstance = ScriptableObject.CreateInstance<SOConfig>();
        configInstance.version = "1.0.2";
    }
}

运行后,可以看到有一个ScriptableObject实例。双击查看实例数据,可以看到实例的version是1.0.2,而本地文件的version还是1.0.1。


© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号