第十章 游戏剧情(Game Plot)
在大部分的RPG中,故事剧情是非常重要的。例如某些播放某些过场动画,人物台词等文字叙述的显示。这些可以推动整个游戏流程。
在Unity商店中,有一些剧情类的插件。我们编写的这个可以配合那些插件使用。
文章目录
四 执行命令 (Execute Command)
我们在这里将对命令的执行进行处理。
我们将遵循以下步骤直到运行结束:
-
读入一条命令;
-
格式化命令成参数;
-
将参数传入命令方法,并执行。
而在运行它们时,我们需要一个能够将命令参数字符串转化成方法理解的参数(Parse
)。其中执行命令的动作,我们称它为GameAction
(看起来Action这个单词在很多地方都用过,如果你没有使用命名空间,那么就要注意命名问题了;在表示上,在这里不止表示剧情动作(就像电影那样),还有我们的一些操作指令。当然,最后还不能缺了导演GameDirector
。
GameDirector
将作为游戏剧情的主控制器。
1 游戏动作(Game Action)
我们在开始编写之前,一定要先搞清楚它的作用(运行命令):
-
运行的命令不一定是剧情方面的命令,也有一些操作命令;剧本动作(类似电影的Action)只是游戏动作的一种。
-
游戏动作中间可能穿插其它分支动作(例如剧情剧本中读取分支剧本),所以它应该有一个参数“上一个动作”;
-
和电影剧本不同的是,它有许多程序方面的东西,所以不一定是一个标准的剧本;
-
在游戏中,可能弹出选项,需要有等待功能,且有时还需要有计时器功能;
在创建时,我们同样最好有一个基类或者接口,这样方便添加其它类型。
1.1 游戏动作接口(Interface IGameAction)
创建接口IGameAction
:
using System;
using UnityEngine;
namespace DR.Book.SRPG_Dev.ScriptManagement
{
public interface IGameAction : IDisposable
{
/// <summary>
/// 是否打印信息
/// </summary>
bool debugInfo {
get; set; }
/// <summary>
/// 上一个Action
/// </summary>
IGameAction previous {
get; }
/// <summary>
/// 错误信息
/// </summary>
string error {
get; }
/// <summary>
/// 抛出异常
/// </summary>
/// <param name="abortParams"></param>
void Abort(params object[] abortParams);
// TODO 其它
}
}
在分析中,我们知道需要输入操作(比如等待点击菜单选项)。
所以,我们加入输入控制的方法:
// 目前只写鼠标左右键,其它输入操作以后添加
void OnMouseMove(Vector3 mousePOsition);
void OnMouseLButtonDown(Vector3 mousePosition);
void OnMouseLButtonUp(Vector3 mousePosition);
void OnMouseRButtonDown(Vector3 mousePosition);
void OnMouseRButtonUp(Vector3 mousePosition);
而且我们需要暂停功能(可能是游戏暂停,可能是切换动作时暂停上一个动作):
/// <summary>
/// 暂停
/// </summary>
void Pause();
/// <summary>
/// 重启
/// </summary>
void Resume();
最后,我们的剧本是持续运行的,需要每一帧都运行:
/// <summary>
/// 每帧运行:true继续运行,false终止运行。
/// </summary>
/// <returns></returns>
bool Update();
我们有了接口,进而最好还创建一个空的类。
1.2 游戏动作类(Class GameAction)
我们的类只是完成了一些接口,和添加一些帮助方法。
创建类GameAction
:
using System;
using UnityEngine;
namespace DR.Book.SRPG_Dev.ScriptManagement
{
[Serializable]
public class GameAction : IGameAction
{
#region Fields
[SerializeField]
private bool m_DebugInfo = false;
private IGameAction m_Previous = null;
protected string m_Error = null;
#endregion
#