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