嗯……要开始尝试做自己的事了
一开始策划给我列了这些
工程仓库搭建
工程程序框架
第三人称相机实现
主角基础移动实现
主角闪避实现
主角战斗实现
主角能量条实现
近战敌人战斗实现
远程敌人战斗实现
UI实现02
用户设置实现02
开始开始
我觉得主角基础移动是首先要做的
那就先看什么时候要开始控制主角吧
那自然是从流程开始看
ProcedureLaunch 中做语言、资源包、音乐设置
一帧之后跳转
然后到 ProcedureSplash 这个是游戏开始前的闪屏,比如展示公司标志
闪屏任务结束后跳转
然后到 ProcedurePreload 加载设置、数据表、字典、字体
订阅加载函数成功事件,设置 flag 为真。所有 flag 都为真,说明所有加载项都加载完毕,可以跳转
NextSceneId 是 Assets\GameMain\Configs\DefaultConfig.txt 中的 Scene.Menu
然后到 ProcedureChangeScene,进入时 停止所有声音,隐藏所有实体,卸载所有场景,还原游戏速度 这其实也是基于游戏的,比如还原游戏速度,是因为游戏中陨石被打碎的时候会让游戏速度先减慢后恢复,游戏有可能在陨石被击碎,游戏速度还没恢复正常的时候退出,这个时候就要恢复正常了
但总归来说,也是一个通用的中间流程
接下来自然到了这一句
IDataTable<DRScene> dtScene = GameEntry.DataTable.GetDataTable<DRScene>();
感觉很神奇,因为实际上我需要的是一个 scene 表,但是我是向 api 输入了一个泛型
那么就有一个问题是,为什么我能够得到一个表
如果对 GetDataTable
溯源的话,就会找到一个 DataTable 中的接口,其中找不到对 GetDataTable
接口的实现
这个时候没有头绪的话,我就会想,是不是我直接在 Assets\GameMain\DataTables 中创建好了 txt 格式的表格,就能直接通过 GameEntry.DataTable.GetDataTable<DR表格名>()
获得表格
毕竟因为我看不到内容嘛
但总归是不确定,所以就很烦躁
之后找别的教程才知道所有数据表已经 load 过了
在 ProcedurePreload 的 OnEnter 就开始加载资源,加载资源的函数里面包含了加载数据表,这个加载数据表是对一个名称列表遍历,把名称输入到加载数据表函数里面,加载数据表函数根据这个数据表名称找到资源名,名称和资源名一起输入到 DataTableExtension 的加载函数里面,在那里面再给文件名前面加上一个 DR,看有没有定义过 DR+数据表名 的类,有的话就新建一个表然后读数据进去
Assets\GameMain\Scripts\Procedure\ProcedurePreload.cs
protected override void OnEnter(ProcedureOwner procedureOwner)
{
//...
PreloadResources();
}
private void PreloadResources()
{
// Preload configs
LoadConfig("DefaultConfig");
// Preload data tables
foreach (string dataTableName in DataTableNames)
{
LoadDataTable(dataTableName);
}
Assets\GameMain\Scripts\Procedure\ProcedurePreload.cs
namespace OaksMayFall
{
public class ProcedurePreload : ProcedureBase
{
public static readonly string[] DataTableNames = new string[]
{
"Aircraft",
"Armor",
"Asteroid",
"Entity",
"Music",
"Scene",
"Sound",
"Thruster",
"UIForm",
"UISound",
"Weapon",
};
Assets\GameMain\Scripts\Procedure\ProcedurePreload.cs
private void LoadDataTable(string dataTableName)
{
string dataTableAssetName = AssetUtility.GetDataTableAsset(dataTableName, false);
m_LoadedFlag.Add(dataTableAssetName, false);
GameEntry.DataTable.LoadDataTable(dataTableName, dataTableAssetName, this);
}
Assets\GameMain\Scripts\DataTable\DataTableExtension.cs
public static void LoadDataTable(this DataTableComponent dataTableComponent, string dataTableName, string dataTableAssetName, object userData)
{
if (string.IsNullOrEmpty(dataTableName))
{
Log.Warning("Data table name is invalid.");
return;
}
string[