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

Unity游戏中角色数据模板的设计与应用

创作时间:
2025-01-21 22:22:20
作者:
@小白创作中心

Unity游戏中角色数据模板的设计与应用

在Unity游戏开发中,角色数据管理是一个常见的需求。本文将介绍如何使用ScriptableObject设计角色数据模板,并将其附加到游戏对象上,实现数据的读取和写入。

设计数据模板

首先,我们需要创建一个ScriptableObject来作为角色数据模板。ScriptableObject是一种可以被序列化并保存到磁盘上的数据容器,常用于存储游戏中的可重用数据或配置信息。

以下是CharacterData_SO类的代码实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "New Data", menuName = "characterStats/Data")]
public class CharacterData_SO : ScriptableObject
{
    public float maxHealth;
    public float currentHealth;
    public float baseDefence;
    public float currentDefence;
}

[CreateAssetMenu]是Unity特有的属性标签,用于在Unity编辑器的资产菜单(Assets > Create)中创建一个新的选项。点击该菜单时,会根据fileName参数生成一个新的资源文件,并将新建的资源对象命名为"New Data"。menuName参数定义了这个新建选项在菜单中的路径,这里是"characterStats/Data",表示它将出现在“characterStats”子菜单下的“Data”选项下。

最终实现效果如下图所示:

将数据模板附加到游戏对象上

由于ScriptableObject不能直接附加到游戏对象上,我们需要创建一个继承自MonoBehavior的脚本来管理数据模板。通过getter和setter属性,我们可以实现数据的读取和写入。

以下是CharacterStats类的代码实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// CharacterStats类主要起到对角色数据封装的作用,提供了一种便捷的方式来获取和修改角色的各项基本属性(如最大生命值、当前生命值、基础防御力和当前防御力)。
/// 同时,通过引用CharacterData_SO实例,可以确保所有属性修改都会反映到角色的基础数据上,便于持久化和同步角色状态。
/// </summary>
public class CharacterStats : MonoBehaviour
{
    #region read from data
    //read from data 这部分表示这是一个逻辑区域,用于从数据存储中读取角色统计数据。
    public CharacterData_SO characterData;

    public float maxHealth
    {
        get
        {
            if (characterData != null)
                return characterData.maxHealth;
            else
                return 0;
        }
        set
        {
            characterData.maxHealth = value;
        }
    }

    /// <summary>
    /// 这四个属性都是通过getter和setter方法来操作的。
    /// getter方法: 当外部访问这些属性时,它们首先检查characterData是否为空。如果不为空,则返回characterData内对应的属性值;如果为空,则返回0作为默认值。
    /// setter方法: 当外部尝试设置这些属性时,它们直接将新值赋给characterData内对应的属性。
    /// </summary>
    public float currentHealth
    {
        get
        {
            if (characterData != null)
                return characterData.currentHealth;
            else
                return 0;
        }
        set
        {
            characterData.currentHealth = value;
        }
    }

    public float baseDefence
    {
        get
        {
            if (characterData != null)
                return characterData.baseDefence;
            else
                return 0;
        }
        set
        {
            characterData.baseDefence = value;
        }
    }

    public float currentDefence
    {
        get
        {
            if (characterData != null)
                return characterData.currentDefence;
            else
                return 0;
        }
        set
        {
            characterData.currentDefence = value;
        }
    }
    #endregion
}

通过上述代码,我们实现了将数据模板附加到游戏对象上,并通过getter和setter属性实现了数据的读取和写入。最终效果如下图所示:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号
Unity游戏中角色数据模板的设计与应用