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

这篇具有很好参考价值的文章主要介绍了【Unity】 HTFramework框架(四十四)【进阶篇】指令系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

指令系统

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

简单使用

定义InstructionAgent

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

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

编辑指令代码

定义了InstructionAgent对象后,我们回到编辑器里,将Test脚本挂载到场景物体之上,然后我们就可以看到指令代码的编辑窗口了。
【Unity】 HTFramework框架(四十四)【进阶篇】指令系统

我们在其中键入几段指令代码(指令代码的语法后续讲解):
【Unity】 HTFramework框架(四十四)【进阶篇】指令系统

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

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):
【Unity】 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包中、甚至是数据库中的,那么用他来实现你的紧急性、临时性程序修补功能(正式版补丁上线后就移除),想想还是很不错的。

自定义指令:【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令。

运行时检视面板

在编辑器中运行时将会出现运行时检视面板(Runtime Data),主要用以调试或数据监测,目前面板如下:
【Unity】 HTFramework框架(四十四)【进阶篇】指令系统
1.No Runtime Data!文章来源地址https://www.toymoban.com/news/detail-483613.html

到了这里,关于【Unity】 HTFramework框架(四十四)【进阶篇】指令系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LVS集群 (四十四)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、集群概述 1. 负载均衡技术类型  2. 负载均衡实现方式 二、LVS结构 三、LVS工作模式 四、LVS负载均衡算法  1.  静态负载均衡   2.  动态负载均衡 五、ipvsadm命令详解 六、LVS配置案例 1.  基

    2024年02月11日
    浏览(33)
  • RabbitMQ面试题(四十四道)

    0什么是消息队列: 消息队列的优点: (1)解耦:将系统按照不同的业务功能拆分出来,消息生产者只管把消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布的。消息生产者和消费者都不知道对方的存在; (2)异步:主流程只需要完成业务的

    2024年03月13日
    浏览(26)
  • 2023-03-24 网工进阶(四十)华为防火墙技术---概述、基本概念(安全区域、安全策略、会话表)、ASPF、虚拟系统

    在通信领域,防火墙是一种安全设备。它用于保护一个网络区域免受来自另一个网络区域的攻击和入侵,通常被应用于网络边界,例如企业互联网出口、企业内部业务边界、数据中心边界等。 防火墙根据设备形态分为,框式防火墙、盒式防火墙和软件防火墙,支持在云上云下

    2024年02月16日
    浏览(29)
  • unity进阶学习笔记:消息框架

    1 使用消息框架的目的 对于小型游戏,可能不需要任何框架,而是让各个游戏脚本直接相互通信。如要实现玩家受到攻击血量减少,通过玩家控制类向血条脚本发送消息减少血量。但是这样直接通信会导致各脚本通信关系记为复杂,并且每一个脚本都和多个脚本有联系,导致

    2024年02月06日
    浏览(29)
  • Unity进阶-ui框架学习笔记

    笔记来源课程:https://study.163.com/course/courseMain.htm?courseId=1212756805_trace_c_p_k2_=8c8d7393c43b400d89ae94ab037586fc 最上面的管理层(canvas) 调整下运行顺序,让他快于controller panel的控制层 panel下面的组件层 使用

    2024年02月16日
    浏览(33)
  • swing快速入门(四十四)拖动、编辑JTree结点

    注释很详细,直接上代码 上一篇 新增内容(源码细节知识点巨多,建议细看) 1.设置JTree可编辑 2.使用JTree关联的数据模型实现节点的增删改 3.鼠标拖动节点事件设计及处理方法 4.手动刷新视图与自动刷新的方法区别 5.自定位节点视图方法 源码 : 演示效果:

    2024年01月19日
    浏览(25)
  • Android 项目必备(四十四)-->Android 实现悬浮窗

    悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。 本文将讲解悬浮窗实现步骤、原理、实例代码等 1. WindowMananger 接口 Android 的界面绘制,都是通过 WindowMananger 的服务来实现的。那么,既然要实现一个能够在自身应

    2024年02月12日
    浏览(27)
  • leetcode解题思路分析(一百四十四)1247 - 1253 题

    交换字符使得字符串相同 有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 “x” 和 “y”,你需要通过「交换字符」的方式使这两个字符串相同。每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。交换只能发生在两个不同的字符串之间,

    2024年02月16日
    浏览(32)
  • Salesforce LWC学习(四十四) Datatable 显示日期类型的有趣点思考

    本篇参考:https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_salesforce_modules 背景: 项目中经常用到datatable显示日期类型字段,并要求日期类型字段基于指定格式显示。这种是一个很常见的需求,而且demo很容易找到,无论是官方文档中还是网上。这里列一个

    2024年02月04日
    浏览(23)
  • 【Android从零单排系列四十四】《聊一下Android数据权限permission》

    目录 前言 一.Android 数据权限基本介绍 二 Android 权限分类 三 Android 权限清单 四 Android 动态申请权限DEMO 小伙伴们,在前面的几篇文章中,我们谈到了Android开发中的几种数据存储方式及数据持久化,本文我们介绍下Android开发中的另一部分内容,权限管理。 在Android中,权限管

    2024年02月12日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包