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

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

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

指令系统

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

运行指令代码,运行结果如下:
【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令

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" "你好世界"

执行上条指令的结果:
【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令

5.自定义指令的参数

补充一下,你可能纳闷#Debug的后面为什么跟了一个"null",那是因为目前自定义指令后面必须跟2个string类型的参数:

参数1:指向的游戏物体路径,尽量是场景中存在的物体,SentenceCustom(自定义指令基类)中的Target属性便引用向该物体,当然,此处传入一个"null",因为我们的Hello World不需要用到游戏物体。
参数2:一个string值SentenceCustom(自定义指令基类)中的Args属性便可以取出该值。

也即是说,即便不需要用到第一个参数,但这里也得传一个string参数进去,否则就会编译错误(错误日志后面会跟上对应的行号):

#Debug "你好世界"

【Unity】 HTFramework框架(四十五)【进阶篇】指令系统-自定义指令
如下这样也不行,需记住,string类型必须使用""包裹:

#Debug null "你好世界"

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

6.结尾

到此,自定义指令Hello World便编写完成了,很简单、很小巧、门槛很低吧?请记住他的定位,小型解决方案!(要是大刀阔斧整个程序都用指令系统来做那就违背初心了)针对一些小型的线上、线下项目,即时修补程序还是有用武之地的。文章来源地址https://www.toymoban.com/news/detail-505414.html

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

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

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

相关文章

  • 四十五、时间/空间复杂度分析

    (1)看循环 一层循环为O(N),两层循环为O(n^2) 不包含输入输出所必须的循环 若两个循环,不互相嵌套,分别为m与n,则为O(m+n) (2)看递归 主定理,不适用太麻烦 例如快排与归并排序: 一共logn层,每一层是O(N)的时间复杂度,则总复杂度为O(nlogn) (3)一些看似为O(n^2),但实

    2024年02月13日
    浏览(79)
  • 【LeetCode75】第四十五题 重新规划路线

    目录 题目: 示例: 分析: 代码: 给我们一个表示城市连通情况的有向图,要求每个城市都要可以通向0号城市,不同城市之间只有一条路线,我们每次可以改变一条路线的指向,问我们需要操作多少次才可以达到每个城市都可以通向0号城市的要求。 由于不同城市之间只有

    2024年02月10日
    浏览(46)
  • web学习笔记(四十五)Node.js

    目录 1. Node.js 1.1 什么是Node.js 1.2 为什么要学node.js 1.3  node.js的使用场景 1.4 Node.js 环境的安装 1.5 如何查看自己安装的node.js的版本 1.6 常用终端命令 2. fs 文件系统模块 2.1引入fs核心模块 2.2 读取指定文件的内容 2.3  向文件写入指定内容 2.4 创建文件夹  2.5 判断文件夹是否存

    2024年04月16日
    浏览(33)
  • 第四十一天 Java基础学习(三十五)

    一、JSP内置对象 ●内置对象 因为SP的本质是Servlet,在JSP文件经过转译之后,生成JAVA代码,在运行时JSP给我们准备好了九个可以直接使用而不用我们自己去new的对象,这九个对象我之为内置对象. 内置对象完全由SP自行去维护,我们直接使用即可。 ●九大内置对象 confia ;page ;

    2024年02月16日
    浏览(46)
  • 【从零开始学习JAVA | 第四十五篇】反射

    目录 前言: ​反射:  使用反射的步骤: 1.获取阶段: 2.使用阶段: 反射的应用场景: 使用反射的优缺点: 总结: Java中的反射是一项强大而灵活的功能,它允许程序在运行时 动态地获取、操作和利用类的信息 。通过反射,我们可以在运行时检查和修改类的属性、调用类

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

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

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

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

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

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

    2024年02月16日
    浏览(49)
  • AIGC内容分享(四十五):AIGC绘画 | OutfitAnyone在线试衣&AnimateAnyone你的科目三

    ⚡  AIGC绘画 | outfit anyone 虚拟试衣 animate anyone 图像动画化 本文主要介绍2篇最新研究,outfit anyone 虚拟试衣 和 animate anyone 图像动画化,在在线购物试衣和动画制作上迈出了一小步! An Asian girl, smiling, dancing in central park, wearing long shirt and long jeans. 先选择衣服和模特进行试衣

    2024年01月21日
    浏览(54)
  • 【Microsoft Azure 的1024种玩法】四十五.在Azure中快速创建Azure AD Domain Services

    Azure Active Directory (Azure AD) 是一种基于云的标识和访问管理服务、 Azure Active Directory 可帮助相关企业访问内部资源,例如企业 Intranet 网络上的应用,以及为我们自己的组织开发的任何云应用,本文主要介绍了如何在Azure中创建 Azure AD 域服务 【Microsoft Azure 的1024种玩法】一.一分

    2024年02月13日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包