首页 > 其他分享 >【Unity】 HTFramework框架(四十四)【进阶篇】指令系统

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

时间:2023-06-03 12:07:19浏览次数:45  
标签:指令系统 物体 .# 进阶篇 Unity 指令 Path 标识符 代码

索引

  • 指令系统
  • 简单使用
  • 定义InstructionAgent
  • 编辑指令代码
  • 执行指令代码
  • 指令代码语法
  • 基本语法
  • 指令关键字
  • 注释
  • 支持的值类型
  • 标识符命名规范
  • 进阶使用
  • 运行时检视面板


指令系统

指令系统为Unity动态修补程序、热更新等提供了另一种补充方案,我们可以将任意一段指令代码即时编译并执行(请放心,即时编译的性能开销极低),达到运行时随意修改程序功能的骚操作。

简单使用

定义InstructionAgent

首先,定义一个InstructionAgent对象,InstructionAgent字面理解为可执行指令的代理者,他是指令系统开放出来的最简单的使用接口,将源码读取代码编译代码执行融合在了一起,使用者什么都不需要关心,写入源码直接调用执行即可。

public class Test : HTBehaviour
{
    [Label("指令代码")] public InstructionAgent Agent;
}

编辑指令代码

定义了InstructionAgent对象后,我们回到编辑器里,将Test脚本挂载到场景物体之上,然后我们就可以看到指令代码的编辑窗口了。

【Unity】 HTFramework框架(四十四)【进阶篇】指令系统_值类型


我们在其中键入几段指令代码(指令代码的语法后续讲解):

【Unity】 HTFramework框架(四十四)【进阶篇】指令系统_HTFramework_02


这几段代码实现的功能为:

1.#NewObj “新的物体” ----- 新建一个GameObject,名为新的物体
2.#Define [A] “新的物体” ----- 定义标识符[A],指向新的物体
3.#Define [Light] “UnityEngine.Light” ----- 定义标识符[Light],指向UnityEngine.Light
4.#AddCom [A] [Light] ----- 向标识符[A]的目标物体添加一个组件[Light]

执行指令代码

回到IDE,在Test类中,此时我们只需要调用一个Execute方法便可以执行这段指令代码:

public class Test : HTBehaviour
{
    [Label("指令代码")] public InstructionAgent Agent;

    private void Start()
    {
        Agent.Execute();
    }
}

然后在编辑器中运行场景,指令代码的效果便产生了(需要注意,场景中必须存在框架主模块HTFramework):

【Unity】 HTFramework框架(四十四)【进阶篇】指令系统_值类型_03


当然,除了在编辑器中编辑代码,肯定也是可以直接为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"的值为ArgsArgs必须为值类型(不能为标识符);
5.#SetProperty "Path" "ComType" "PropertyName" Args ——设置属性值,即设置"Path"路径指向物体的组件"ComType"的属性"PropertyName"的值为ArgsArgs必须为值类型(不能为标识符);
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)

注释

目前仅支持//单行注释。

支持的值类型

目前仅支持stringboolintfloatVector2Vector3等值类型。

标识符命名规范

严格来说,标识符目前没有什么命名规范,除了必须以[]包裹以外,其他无硬性要求(需注意标识符中不能出现"")。

进阶使用

通过了解整个指令系统的使用规则,我想你已经明白了,指令代码是可以来源于网络AB包中、甚至是数据库中的,那么用他来实现你的紧急性、临时性程序修补功能(正式版补丁上线后就移除),想想还是很不错的。

运行时检视面板

在编辑器中运行时将会出现运行时检视面板(Runtime Data),主要用以调试或数据监测,目前面板如下:

【Unity】 HTFramework框架(四十四)【进阶篇】指令系统_HTFramework_04


1.No Runtime Data!


标签:指令系统,物体,.#,进阶篇,Unity,指令,Path,标识符,代码
From: https://blog.51cto.com/u_15911199/6407662

相关文章

  • Unity转出FBX模型(Exporter插件)
    Unity转出FBX模型为了解决在Unity场景修改过导出的模型,以后给美工修改不了预制体的问题Unity版本要求:2021.3.6f1c1(包括但不限于此版本以上)下载插件场景中选中模型任意模型点击导出FBX导出模型设置路径......
  • 深度学习进阶篇[7]:Transformer模型长输入序列、广义注意力、FAVOR+快速注意力、蛋白质
    深度学习进阶篇[7]:Transformer模型长输入序列、广义注意力、FAVOR+快速注意力、蛋白质序列建模实操。基于Transformer模型在众多领域已取得卓越成果,包括自然语言、图像甚至是音乐。然而,Transformer架构一直以来为人所诟病的是其注意力模块的低效,即长度二次依赖限制问题。随着输入......
  • unity随机生成乱码图片并保存本地,各项参数均可调整
    @TOC<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">前言最近有个小需求,要生成随机的乱码图片,用于ar的识别,于是我写了这个小demo,有需要的小伙伴可以拿去用,我也是借此留个备份。<hrstyle="border:solid;width:100px;height:1px;"color=#000000si......
  • 【Unity】记录一下:自定义组件的InspectorGUI面板,修改数据不保存问题
    使用target修改之后需要使用EditorUtility.SetDirty设置为脏,但是要注意的是应该设置target所指代的组件,而非是对.gameObject设置为脏,这是没有用的。[CustomEditor(typeof(MerryGoRound))]publicclassMerryGoRoundEditor:Editor{publicoverridevoidOnInspectorGUI(......
  • unity3d 不销毁物品
    在游戏中,经常需要用到一个类似于static的功能,想要一个参数一直使用,如生命值、登陆状态等。方案一使用static,如在gamemanager脚本中设置publicstaticboolis_login=false;在其他脚本中,不需要gameobject,直接调用脚本即可boolget=gamemanager.is_login;但是缺点是,只......
  • Unity框架与.NET, Mono框架的关系
    什么是C#C#是一种面向对象的编程语言。什么是.NET.NET是一个开发框架,它遵循并采用CIL(CommonIntermediateLanguage)和CLR(CommonLanguageRuntime)两种约定,CIL标准为一种编译标准:将不同编程语言(C#,JS,VB等)使用各自的编译器,按照统一的标准编译成语义一致的CIL中间码,......
  • Unity_Photon
    PhotonPhoton搭建(2条消息)【Unity3D】Photon环境搭建_photon框架_little_fat_sheep的博客-CSDN博客连接云服务器主要代码:PhotonNetwork.ConnectUsingSettings();usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingPhoton.Pun;using......
  • MySQL学习进阶篇Day5
    2.6.4索引失效情况2.6.4.1索引列运算不要在索引列上进行运算操作,索引将失效。 在tb_user表中,除了前面介绍的联合索引之外,还有一个索引,是phone字段的单列索引。 A.当根据phone字段进行等值匹配查询时,索引生效。explainselect*fromtb_userwherephone='1779......
  • Unity中根据平面的多边形点的数据,生成简单的立体网格
    todo 最近需要一个功能,就是根据给定的多边形顶点(按照顺时针或者逆时针这样的顺序),然后生成一个具有高度,投影与多边形一样的一个Mesh。效果如下,比如给定以下的一些顶点的位置         https://blog.csdn.net/lxbhahaha/article/details/111687476......
  • Unity发布IOS发布Android版本出现屏幕问题 UGUI半屏被压缩 另一半黑屏
    项目场景:用Unity做的app发布的ios和Android版本,ui做屏幕自适应,来适配多机型,unity版本是2019.4,用的UGUI。问题描述:极个别机型有个偶发的问题,就是在app息屏,再开屏的时候,会出现半边屏幕被压缩,半边屏幕黑屏的问题,但是ui交互的位置还是正常的,bug效果图如下:跟这张图一样的<hrstyle="bor......