• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
神码编程
帮助5

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhchab
系列文章
更多 icon
同类精品
更多 icon
继续加载