第八章 游戏中的数据(Data in Game)
在之前的章节中,我们进行地图对象的生成,移动等操作。
这一章本来可以进行战斗的编写,不过数据缺失是一个问题。
所以这一章我们先来建立一些数据,以及如何编辑它们,是否需要生成配置文件等。
文章目录
六 运行时对象(Runtime Object)
之前建立的数据几乎都是静态数据,而实际在游戏中,我们要创建一些类来使用它们。
在数据上,我们来创建一些类。在之前应该注意:
-
角色(role)在SRPG中分为独有人物,和一系列的杂兵。当然还包括职业;
-
物品(item)存在不同分类;
-
移动消耗(Move Consumption)、人物(character)和职业(class)只是静态数据的代理。
1 移动消耗、人物与职业(Move Consumption, Character and Class)
在实际游戏中,移动消耗、人物与职业数据是不存在变化的,我们只需要读取它(只读属性)。
两种方式(以人物为例):
-
其一,内部直接使用静态数据
namespace DR.Book.SRPG_Dev.Models { public class Character { private CharacterInfo m_Info; // 类似这样的只读属性 public int id { get { return m_Info.id; } } // 其它只读属性 public Character(CharacterInfo info) { this.m_Info = info; } } }
-
其二,内部不使用静态数据,外部读取静态数据后创建
namespace DR.Book.SRPG_Dev.Models { public class Character { // 类似这样的只读属性 public int id { get; private set;} // 其它只读属性 public Character(int id /* 其它读取属性 */) { this.id = id; // 读取其它属性 } public Character(CharacterInfo info) { this.id = info.id; // 读取其它属性 } } }
当然你也可以不在构造函数中进行,而是自己写一个读取函数(例如Load
)。
这里我们不再过多的阐述,以下是移动消耗完整的类,人物与职业也可以参考它。
完整的移动消耗的类:
using UnityEngine;
namespace DR.Book.SRPG_Dev.Models
{
using DR.Book.SRPG_Dev.Maps;
public class MoveConsumption
{
private MoveConsumptionInfo m_Info;
public ClassType classType
{
get {
return m_Info.classType; }
}
public float this[TerrainType terrainType]
{
get
{
if (terrainType == TerrainType.MaxLength)
{
Debug.LogError("MoveConsumption -> TerrainType can not be MaxLength.");
return 255f;
}
return m_Info.consumptions[terrainType.ToInteger()];
}
}
public MoveConsumption(MoveConsumptionInfo info)
{
this.m_Info = info;
}
}
}
2 运行时数据(Runtime Data)
在写其他的类之前,我们都知道一些数据是随着游戏进程而动态变化的(例如经验值,等级等)。
增加保存这些数据的变量是必须的,这里我把这些变量单独建立一个类来存储:
using System;
using System.Reflection;
using UnityEngine;
namespace DR.Book.SRPG_Dev.Models
{
[Serializable]
public abstract class RuntimeData<T> : IRuntimeData<T> where T : RuntimeData<T>, new()
{
public virtual T Clone()
{
T clone = new T();
CopyTo(clone);
return clone;
}
public virtual void CopyTo(T data)
{
if (data == null