更新日期:2023年6月19日。
Github源码:[点我获取源码]
Gitee源码:[点我获取源码]

指令系统

1.使用指令系统

指令系统详解:【Unity】 HTFramework框架(四十四)【进阶篇】指令系统。

使用HTFramework指令系统,可以将一段指令代码即时编译并执行。

例如,我需要这样一个功能:

新建一个游戏物体,将它的位置设置到(100,100,100),并为其添加一个灯光(Light)组件,并设置其强度(intensity)为10.5。

使用指令代码实现:

#Define [Name] "New Light"
#Define [Light] "UnityEngine.Light"

#NewObj [Name]         //新建一个游戏物体,名为 New Light
#SetPosition [Name] Vector3(100,100,100) false     //设置物体的位置

#AddCom [Name] [Light]        //为物体 New Light 添加一个灯光组件
#SetProperty [Name] [Light] "intensity" 10.5      //设置灯光组件的属性 intensity 值为10.5

运行指令代码,运行结果如下:
在这里插入图片描述

2.自定义指令

指令系统当前支持十几种指令关键字(也即是指令类型),实际上用他们只能进行一些简单的程序修补工作,虽然指令系统的定位便是如此,咱比不上强大的Lua(人家虚拟机、解释器自成一体),高大上的ILRuntime(随时随地C#写代码,高端优雅上档次),但咱也有优点:简单、小巧、门槛低,人家是大型解决方案,咱的定位就是小型解决方案!

So!为了提升扩展性和灵活性,自定义指令应运而生,接下来,按程序界不成文的老规矩,先写一个Hello World来证明它的存在吧。

1.新建类 MyInstruction

首先,新建一个类MyInstruction,并继承至HT.Framework.SentenceCustom,后者为自定义指令唯一可继承基类

/// <summary>
/// 我的新建指令
/// </summary>
public class MyInstruction : SentenceCustom
{
    public override void Execute()
    {
        
    }
}

2.标记 CustomInstruction 特性

然后,为MyInstruction类标记一个CustomInstruction特性,该特性表明此类为自定义指令类,并为其定义指令关键字(比如此处,我便成功定义了一个自定义指令关键字#Debug):

/// <summary>
/// 我的新建指令
/// </summary>
[CustomInstruction("#Debug")]
public class MyInstruction : SentenceCustom
{
    public override void Execute()
    {
        
    }
}

注意:自定义指令的关键字必须是#开头,不能包含空格。

3.编写指令的逻辑

前面两步只是完成了自定义指令的定义,在覆写的Execute方法中,就是编写此自定义指令的执行逻辑的地方(比如此处,打印一个Hello World):

/// <summary>
/// 我的新建指令
/// </summary>
[CustomInstruction("#Debug")]
public class MyInstruction : SentenceCustom
{
    public override void Execute()
    {
        Log.Info($"Hello World!Args: {Args}");
    }
}

4.执行自定义指令

此时,我们便可以编写#Debug类型的指令,并执行指令了:

#Debug "null" "你好世界"

执行上条指令的结果:
在这里插入图片描述

5.自定义指令的参数

补充一下,你可能纳闷#Debug的后面为什么跟了一个"null",那是因为目前自定义指令后面必须跟2个string类型的参数:

参数1:指向的游戏物体路径,尽量是场景中存在的物体,SentenceCustom(自定义指令基类)中的Target属性便引用向该物体,当然,此处传入一个"null",因为我们的Hello World不需要用到游戏物体。
参数2:一个string值SentenceCustom(自定义指令基类)中的Args属性便可以取出该值。

也即是说,即便不需要用到第一个参数,但这里也得传一个string参数进去,否则就会编译错误(错误日志后面会跟上对应的行号):

#Debug "你好世界"

在这里插入图片描述
如下这样也不行,需记住,string类型必须使用""包裹:

#Debug null "你好世界"

在这里插入图片描述

6.结尾

到此,自定义指令Hello World便编写完成了,很简单、很小巧、门槛很低吧?请记住他的定位,小型解决方案!(要是大刀阔斧整个程序都用指令系统来做那就违背初心了)针对一些小型的线上、线下项目,即时修补程序还是有用武之地的。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐