更新日期:2023年5月29日。
Github源码:[点我获取源码]
Gitee源码:[点我获取源码]
指令系统
指令系统
为Unity动态修补程序、热更新等提供了另一种补充方案,我们可以将任意一段指令代码
即时编译并执行(请放心,即时编译的性能开销极低),达到运行时随意修改程序功能的骚操作。
简单使用
定义InstructionAgent
首先,定义一个InstructionAgent
对象,InstructionAgent
字面理解为可执行指令的代理者
,他是指令系统
开放出来的最简单的使用接口,将源码读取
、代码编译
、代码执行
融合在了一起,使用者什么都不需要关心,写入源码直接调用执行即可。
public class Test : HTBehaviour
{
[Label("指令代码")] public InstructionAgent Agent;
}
编辑指令代码
定义了InstructionAgent
对象后,我们回到编辑器里,将Test脚本挂载到场景物体之上,然后我们就可以看到指令代码
的编辑窗口了。
我们在其中键入几段指令代码
(指令代码的语法后续讲解):
这几段代码实现的功能为:
1.#NewObj “新的物体” ----- 新建一个GameObject,名为
新的物体
;
2.#Define [A] “新的物体” ----- 定义标识符[A]
,指向新的物体
;
3.#Define [Light] “UnityEngine.Light” ----- 定义标识符[Light]
,指向UnityEngine.Light
;
4.#AddCom [A] [Light] ----- 向标识符[A]
的目标物体添加一个组件[Light]
。
执行指令代码
回到IDE,在Test
类中,此时我们只需要调用一个Execute
方法便可以执行这段指令代码(点击编辑面板的Execute
按钮也行,不过仅限于运行时):
public class Test : HTBehaviour
{
[Label("指令代码")] public InstructionAgent Agent;
private void Start()
{
Agent.Execute();
}
}
然后在编辑器中运行场景,指令代码的效果便产生了(需要注意,场景中必须存在框架主模块HTFramework
):
当然,除了在编辑器中编辑代码,肯定也是可以直接为InstructionAgent
赋予代码的,如下:
public class Test : HTBehaviour
{
[Label("动态指令代码")] public InstructionAgent Agent;
private void Start()
{
Agent.Code = "你的代码******";
Agent.Execute();
}
}
指令代码语法
当然,上面只是介绍了指令代码
使用的凤毛麟角,关于为什么要叫作指令代码
,而不直接叫代码
?那是因为这里的代码是逐行编译、逐行执行
的,每一行更像是一条指令
,比如让A物体做出B行为,设置C组件的D字段为E值等,简单来说就是基于指令
行为的代码,简称自然是指令代码
。
基本语法
指令代码的基本语法如下,一行即代表一条指令:
#NewObj
Args
1.#NewObj:指令关键字;
2.Args:指令行为的参数,可以是标识符,值类型的值(可以有多个参数)。
注意:指令关键字与参数之间以空格
分隔,string必须以""
包裹(string中不能再含有双引号,转义字符\"
也不行),标识符必须以[]
包裹,目前仅支持定义string类型的标识符,且标识符的定义必须在使用他之前。
指令关键字
目前仅支持以下几种指令关键字,每一个关键字即代表了一种指令行为
:
1.
#Define [A] "B"
——定义标识符,即定义标识符[A]
的值为"B"
;
2.#AddCom "Path" "ComType"
——添加组件,即为"Path"
路径指向的物体添加组件"ComType"
;
3.#RemoveCom "Path" "ComType"
——移除组件,即为"Path"
路径指向的物体移除组件"ComType"
;
4.#SetField "Path" "ComType" "FieldName" Args
——设置字段值,即设置"Path"
路径指向物体的组件"ComType"
的字段"FieldName"
的值为Args
,Args
必须为值类型(不能为标识符);
5.#SetProperty "Path" "ComType" "PropertyName" Args
——设置属性值,即设置"Path"
路径指向物体的组件"ComType"
的属性"PropertyName"
的值为Args
,Args
必须为值类型(不能为标识符);
6.#NewObj "Name"
——新建游戏物体,即新建一个游戏物体,名为"Name"
;
7.#DeleteObj "Path"
——删除游戏物体,即删除"Path"
路径指向的游戏物体;
8.#Rename "Path" "Name"
——重命名游戏物体,即将"Path"
路径指向的游戏物体重命名为"Name"
;
9.#Active "Path" true
——激活、隐藏游戏物体,即将"Path"
路径指向的游戏物体激活或隐藏true、false
;
10.#SendMessage "Path" "MethodName" Args(可选)
——向游戏物体发送消息,即向"Path"
路径指向的游戏物体发送消息"MethodName"
,Args
必须为值类型(可选);
11.#SetParent "Path" "Parent Path"
——设置游戏物体父级,即将"Path"
路径指向的游戏物体设置为"Parent Path"
的子级;
12.#SetPosition "Path" Vector3(0,0,0) true
——设置游戏物体位置,即设置"Path"
路径指向的游戏物体的位置为Vector3(0,0,0)
,第三个参数true
代表了是否使用世界坐标;
13.#SetRotation "Path" Vector3(0,0,0) true
——设置游戏物体旋转,即设置"Path"
路径指向的游戏物体的旋转为Vector3(0,0,0)
,第三个参数true
代表了是否使用世界坐标;
14.#SetScale "Path" Vector3(0,0,0)
——设置游戏物体缩放,即设置"Path"
路径指向的游戏物体的缩放为Vector3(0,0,0)
;
注释
目前仅支持//
单行注释。
支持的值类型
目前仅支持string
、bool
、int
、float
、Vector2
、Vector3
等值类型。
标识符命名规范
严格来说,标识符目前没有什么命名规范,除了必须以[]
包裹以外,其他无硬性要求(需注意标识符中不能出现""
)。
进阶使用
通过了解整个指令系统
的使用规则,我想你已经明白了,指令代码是可以来源于网络
、AB包中
、甚至是数据库中
的,那么用他来实现你的紧急性、临时性
程序修补功能(正式版补丁上线后就移除),想想还是很不错的。
自定义指令:【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令。文章来源:https://www.toymoban.com/news/detail-483613.html
运行时检视面板
在编辑器中运行时将会出现运行时检视面板(Runtime Data),主要用以调试或数据监测,目前面板如下:
1.No Runtime Data!文章来源地址https://www.toymoban.com/news/detail-483613.html
到了这里,关于【Unity】 HTFramework框架(四十四)【进阶篇】指令系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!