SRPG游戏开发(四十七)第十章 游戏剧情 - 五 命令执行器 (Command Executor)

返回总目录

第十章 游戏剧情(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

额外再加上GameActionParse错误:

  • 转换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)
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值