【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令

奋斗吧
奋斗吧
擅长邻域:未填写

标签: 【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令 HarmonyOS博客 51CTO博客

2023-06-25 18:24:24 201浏览

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令,指令系统当前支持十几种指令关键字(也即是指令类型),实际上用他们只能进行一些简单的程


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


索引

  • 指令系统
  • 1.使用指令系统
  • 2.自定义指令
  • 1.新建类 MyInstruction
  • 2.标记 CustomInstruction 特性
  • 3.编写指令的逻辑
  • 4.执行自定义指令
  • 5.自定义指令的参数
  • 6.结尾


指令系统

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

运行指令代码,运行结果如下:

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令_热修补

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" "你好世界"

执行上条指令的结果:

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令_热修补_02

5.自定义指令的参数

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

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

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

#Debug "你好世界"

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令_HTFramework_03


如下这样也不行,需记住,string类型必须使用""包裹:

#Debug null "你好世界"

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令_HTFramework_04

6.结尾

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


好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695