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

news2025/1/11 2:57:31

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

索引

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

指令系统

指令系统为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方法便可以执行这段指令代码:

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"的值为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),主要用以调试或数据监测,目前面板如下:
在这里插入图片描述
1.No Runtime Data!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】MySQL的事务原理和实现?

文章目录 MySQL事务的底层实现原理一、事务的目的可靠性和并发处理 二、实现事务功能的三个技术2.1 redo log 与 undo log介绍2.1.1 redo log2.1.2undo log 2.2 mysql锁技术2.2.1 mysql锁技术 2.3 MVCC基础 三、事务的实现3.1 原子性的实现3.1.1 undo log 的生成3.1.2 根据undo…

机器视觉陶瓷板智能检测设备在工业质检中的应用

随着工业自动化的不断发展,机器视觉技术在质量控制领域中的应用越来越广泛。在陶瓷制品生产中,机器视觉技术可以帮助企业实现陶瓷板的智能检测,减少人工操作的错误率,提高生产效率和产品质量。本文将介绍机器视觉陶瓷板智能检测设…

4种不改变格式将PDF转Word文档的方法

Microsoft Word 使用户能够按照自己的喜好创建和编辑文档。当用户发现一些PDF资源有助于补充他们的文书工作时,他们可能希望将PDF插入到Word文档中,特别是插入多页PDF文件,以进行编辑或其他目的。将 PDF 插入 Word 文档非常容易,只…

视频剪辑必备,7免费个视频素材库,马住。

请收藏好这6个免费可商用的视频素材网站,以后再也不用为找素材而烦恼了,这些就够了! 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 可以称之为最大素材库,在这里你可以找到设计、办公、图片、视频、音频等各种素材。…

【科普】干货!带你从0了解移动机器人(三) ——自主导航系统及上位机软件设计与实现

随着机器人技术的不断发展,我们可以在许多简单重复,危险的岗位上看到机器人的身影,移动机器人凭借其在复杂环境下工作,具有自行感知、自行规划、自我决策功能的能力,它可以在不同的环境中移动并执行任务,在…

泉州银行:面向业务场景的赋能型数据中台

关 注gzh"大数据食铁兽",了解更多银行大数据案例 案例简介 作为支持数字经济发展和高质量发展的一份子,数字化转型成为泉州银行当前的重要任务。为加强业务场景数据赋能,数据资产共享流通,我行以“数聚、数用、数智”为…

认识Servlet---2

hi,大家好,今天我们继续来认识Servlet 1.更方便的部署方式 2.访问出错的问题分析 3.Servlet的API之HttpServlet 🍨🍨🍨🍨 🍭1.更方便的部署方式 在上一期的讲解中,我们已经完整的创建项目并且编写代码并且得到了验…

Linux之进程地址空间

文章目录 前言一、是什么1.例子2.感性的理解虚拟地址空间3.现象的具体解释4.写时拷贝 二、为什么三、怎么办总结 前言 内存区域划分: 在学习C/C时我们都有接触过内存区域划分这个概念,也知道它表示的是程序加载到内存中不同的数据所分布的不同的区域&a…

阿里云服务器数据盘是什么?系统盘和数据盘区别

阿里云服务器系统盘和数据盘有什么区别?系统盘类似Windows电脑的C盘,数据盘相当于其他盘符,数据盘可以有多个而系统盘只能有一个,数据盘可有可无而云服务器系统盘是必须要有的。阿里云服务器网来详细说下阿里云服务器数据盘和系统…

电子企业MES管理系统解决方案

随着信息技术的飞速发展,电子企业面临着日益复杂的数据管理、生产流程和业务决策等问题。如何应对这些问题并提高企业生产效率已成为电子企业的当务之急。本文旨在探讨电子企业MES管理系统的解决方案,以应对电子企业面临的挑战。 在制定电子企业MES管理…

苹果笔不用原装可以吗?推荐性价比最高的平替苹果笔

苹果Pencil的价格令人难以入手,单支就要接近千元,我实在想不通,这款电容笔怎么会以969元的价格出售?尽管苹果的Pencil性能非常不错,但是我认为它的价值还是不值这个价钱。当前国产的平板电容笔正不断完善中&#xff0c…

华为OD机试之羊、狼、农夫过河(Java源码)

羊、狼、农夫过河 题目描述 羊、狼、农夫都在岸边,当羊的数量小于狼的数量时,狼会攻击羊,农夫则会损失羊。农夫有一艘容量固定的船,能够承载固定数量的动物。 要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。只计算…

Zookeeper集群 + Fafka集群

Zookeeper 概述 Zookeeper 定义 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。 Zookeeper 工作机制 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心…

Python3,使用openpyxl进行excel数据对比,反手一个赞。

openpyxl技能 1、引言2、代码实战2.1 安装2.2 代码实战2.2.1 思路2.2.2 代码示例 3、总结 1、引言 小屌丝:鱼哥,我最近在对搞数据对比,你有什么便捷的方法? 小鱼:斗胆问一句,数据量多少? 小屌丝…

lammps教程:Ovito计算RDF方法

本文介绍ovito分析rdf的方法以及参数设置。 专栏已经介绍过多种rdf的计算方法。 如:在in文件中计算rdf: lammps案例:液体平衡态rdf计算模拟练习 编程后处理计算rdf: lammps后处理:python ovito编程计算不同原子对…

Linux运维必备的13款实用工具,你用过吗?

本文介绍几款 Linux 运维比较实用的工具,希望对 Linux 管理员有所帮助。 1、查看进程占用带宽情况-Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载:http://sourceforge.net/projects/nethogs/files/nethogs…

Vue+SpringBoot,一款企业级的进销存管理系统,星标2.7k

介绍 Finer 进销存系统是一款面向中小企业的管理软件,基于十多年的中小企业管理经验,由ERP领域的资深专家分析设计;基于J2EE快速开发平台Jeecg-Boot开发,前后端分离架构SpringBoot2.x、Ant Design&Vue、Mybatis-plus、Shiro、…

从零开始搭建属于自己的物联网平台(二)实现基于订阅发布的消息总线

实现基于订阅发布的消息总线 往期链接实现的功能及形式功能设计及代码实现生产者使用redis实现生产者 消费者使用redis实现消费者 配套Subscribe注解实现BeanPostProcessor监听所有的bean创建 EventBus对象 往期链接 从零开始搭建属于自己的物联网平台(一&#xff…

测试类型(单元、集成、系统或手动测试)

测试类型(单元、集成、系统或手动测试) 单元测试 单元是系统的单个组件,例如类或单个方法。孤立地测试单元称为单元测试。 优点:速度快/易控/易写 缺点:缺乏现实性/无法捕获所有错误(例如与其他组件或服务的交互) 单元…

40. 组合总和 II

40. 组合总和 II 回溯 去重