第十章 游戏剧情(Game Plot)
在大部分的RPG中,故事剧情是非常重要的。例如某些播放某些过场动画,人物台词等文字叙述的显示。这些可以推动整个游戏流程。
在Unity商店中,有一些剧情类的插件。我们编写的这个可以配合那些插件使用。
文章目录
五 命令执行器 (Command Executor)
这一节,我们来编写一部分典型的命令执行器。
之所以是一部分,是因为这里只是展示如何转化参数,与运行命令。
知道这些之后,大家可以自由编写。其它执行器可以去看源代码。
1 基类(Abstract Class)
我们在上一节已经有了接口IScenarioContentExecutor
,这里我们建立一个基类。
除了接口外,我们再添加一些帮助方法。
创建类:
namespace DR.Book.SRPG_Dev.ScriptManagement
{
public abstract class ScenarioContentExecutor : IScenarioContentExecutor
{
public string typeName
{
get {
return GetType().Name; }
}
public abstract string code {
get; }
public abstract ScenarioActionStatus Execute(IGameAction gameAction, IScenarioContent content, out string error);
// TODO 帮助方法
}
}
1.1 错误字符串(Error String)
我们在转化参数或执行时可能出现许多错误,我们提前准备好这些错误字符串,这样可以节省一些编程时间。
最常见的错误:
-
命令参数长度错误:
GetLengthErrorString
; -
变量错误(不是以文字、字母或下划线开头,或包含非法字符):
GetMatchVariableErrorString
; -
变量未定义错误(变量必须定义了才能使用):
GetVariableExistErrorString
; -
运算符错误(运算符不正确):
GetMatchOperatorErrorString
。
额外再加上GameAction
的Parse
错误:
- 转换
GameAction
错误:GetActionTypeErrorString
。
1.2 检查变量名(Match and Get Variable)
我们的变量必须符合规则:必须是字母、数字、汉字和下划线组成,且不能以数字开头。
这使用正则表达式是一个非常好的方式。
创建一个正则表达式的帮助类:
using System.Text.RegularExpressions;
namespace DR.Book.SRPG_Dev
{
public static class RegexUtility
{
public const string k_Variable = @"^[a-zA-Z_\u4e00-\u9fa5)][\w]*$";
public static bool IsMatchVariable(string variable)
{
return Regex.IsMatch(variable, k_Variable);
}
}
}
正则表达式不明白没关系,我们来解释。
关于正则表达式@"^[a-zA-Z_\u4e00-\u9fa5)][\w]*$"
的解释:
-
^
和$
:开始与结束符号; -
[]
:需要匹配单字的内容; -
*
:将前一个匹配内容重复零到多次,这里是[\w]
; -
a-z
:小写字母; -
A-Z
:大写字母; -
_
:下划线; -
\u4e00-\u9fa5
:中文Unicode字符开始与结束; -
\w
:包含下划线的所有单字。
创建检查变量名方法:
/// <summary>
/// 判断变量格式是否正确,并赋值给`variable`。
/// `isExist`: 指定变量在使用之前,是否存在。
/// </summary>
/// <param name="varStr"></param>
/// <param name="isExist"></param>
/// <param name="variable"></param>
/// <param name="error"></param>
/// <returns></returns>
protected bool IsMatchVar(string varStr, bool isExist, ref string variable, out string error)
{
if (!RegexUtility.IsMatchVariable(varStr))
{
error = GetMatchVariableErrorString(varStr);
return false;
}
if (ScenarioBlackboard.Contains(varStr) != isExist)