CN117331552A - 基于语法树的界面代码自动生成方法 - Google Patents
基于语法树的界面代码自动生成方法 Download PDFInfo
- Publication number
- CN117331552A CN117331552A CN202310031286.9A CN202310031286A CN117331552A CN 117331552 A CN117331552 A CN 117331552A CN 202310031286 A CN202310031286 A CN 202310031286A CN 117331552 A CN117331552 A CN 117331552A
- Authority
- CN
- China
- Prior art keywords
- code
- interface
- node
- grammar tree
- nodes
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 22
- 230000003993 interaction Effects 0.000 claims description 10
- 238000004519 manufacturing process Methods 0.000 claims description 3
- 238000010586 diagram Methods 0.000 description 6
- 230000008569 process Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/38—Creation or generation of source code for implementing user interfaces
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于语法树的界面代码自动生成方法,首先交互在Unity引擎中完成界面预制体的制作,并对界面内各节点命名。随后,程序先在界面的根节点挂载UIEntity脚本,然后在需要导出绑定关系的节点上挂载UIComponent脚本,最后点击UIEntity上的导出按钮,程序内部会根据挂载的UIComponet脚本先生成语法树,再由语法树生成最终的Lua代码。本发明生成代码时使用语法树的结构来表达需要导出的内容,从而达成自由度更高的代码生成,提高开发效率,减少了大量的重复工作,统一了代码规范。采用本发明方案既加快了游戏开发的效率,又方便了代码格式的管理。
Description
技术领域
本发明属于软件技术领域,涉及代码的生成方法,具体涉及一种基于语法树的界面代码自动生成方法。
背景技术
目前,大量的游戏软件使用界面和用户进行交互,游戏中的界面因为数量多、功能繁琐,往往要占用非常多的开发时间,且相互之间往往彼此关联、耦合,会带来额外的工作量。
界面开发流程中最重要的两个部分为:1交互制作界面、2程序实现功能。这两者之间往往有着密切的耦合关系,比如交互修改了界面中节点的层级顺序,就会影响程序中代码的运行。比如交互增加了游戏内的节点,程序需要消耗时间新增代码进行绑定。如何解耦各工种之间的工作,提高开发效率,成为了加快游戏研发速度的重要难题。
发明内容
为解决上述问题,本发明公开了一种基于语法树的界面代码自动生成方法,首先,交互在Unity引擎中完成界面预制体的制作,并对界面内各节点命名。随后,程序先在界面的根节点挂载UIEntity脚本,然后在需要导出绑定关系的节点上挂载UIComponent脚本,最后点击UIEntity上的导出按钮,程序内部会根据挂载的UIComponet脚本先生成语法树,再由语法树生成最终的Lua代码。
为达到上述目的,本发明的技术方案如下:
基于语法树的界面代码自动生成方法,包括如下步骤:
步骤1,获取新的策划需求,根据新需求交互在Unity引擎中制作界面预制体,并对界面内各节点命名;
步骤2,在界面上挂载UIEntity脚本,标记这是一个界面的根节点;
步骤3,在需要导出绑定关系的节点上挂载UIComponent脚本,标记这是需要导出的节点;
步骤4,执行“生成代码”功能;
步骤5,代码中先创建根节点的数据结构,数据结构代表整个代码文件,结构中可以插入具体节点;
步骤6,根节点数据结构下,首先添加Class节点的数据,根据界面预制体中的名字,设置ClassName和InitStatement的内容;
步骤7,创建3个Function节点函数,3个函数包括:Constructor构造函数、Init初始化函数、UnInit反初始化函数,所述3个函数是每个界面必有的基础元素;
步骤8,创建一个Variable节点,用于定义名字为ui的表,用于存储所有导出到Lua中的ui变量;
步骤9,代码生成器按照层级顺序依次遍历需要导出的节点,根据节点中的数据生成代码;当遍历到一个节点时,向Init函数中添加绑定代码获取该节点的组件;
步骤10,生成的语法树结构;
步骤11,从根节点开始深度遍历整个语法树,每个遍历到的节点把自己包含的语法信息格式化成代码中对应的字符串,写入到输出中,输出的顺序和树形结构中一致;
步骤12,把输出内容写入到文件,最终生成代码。
进一步的,所述步骤6中将ClassName变量的名称赋值为界面预制体中的名字,InitStatement的内容赋值为类的定义代码所对应的字符串。
进一步的,所述步骤9中事件为按钮点击后回调的事件。
进一步的,代码生成完毕后,程序可以在派生类中实现相关的功能。
进一步的,当需求调整,交互行为修改了预制体中控件的层级时,只需要重新执行"生成代码"重新生成基类中的绑定关系,即执行步骤4-12。
进一步的,如果交互增加了节点,则需要针对新增节点执行步骤3,再执行步骤4-12。
进一步的,如果交互删除了节点,则重新执行步骤4-12。
进一步的,当线上出现问题,需要临时绑定某个未绑定的UI控件时,只需要热修改界面基类中的Init函数,即可任意访问预制体中的UI控件。
本发明的有益效果为:
本发明生成代码时使用语法树的结构来表达需要导出的内容,从而达成自由度更高的代码生成,提高开发效率,减少了大量的重复工作,统一了代码规范。采用本发明方案既加快了游戏开发的效率,又方便了代码格式的管理。
附图说明
图1为传统代码生成方式示意图。
图2为本发明中元素嵌套关系示意图。
图3为DemoTestUI界面示意图。
图4为本发明实施例最终生成的语法树部分结构示意图。
图5为本发明实施例最终生成的语法树部分结构示意图。
图6为本发明实施例最终生成的代码示意图。
图7为本发明提供的基于语法树的界面代码自动生成方法流程图。
具体实施方式
以下将结合具体实施例对本发明提供的技术方案进行详细说明,应理解下述具体实施方式仅用于说明本发明而不用于限制本发明的范围。
传统的代码生成一般采用模板作为基准,然后批量替换模板中的字符串来生成代码,如图1,这种方式的缺点很明显,那就是灵活性不足,无法根据每个界面元素的不同,生成自身独特的代码。只能生成最基本的函数名称和类名称。本发明设计了一套可以动态修改导出数据的结构。首先我们把界面的结构进行抽象,一个简单的界面由很多简单元素构成,如文本、图片、按钮,但是实际开发中往往会出现更复杂的情况,比如列表,列表中往往会包含大量的重复元素,为了方便描述这些元素的嵌套关系,我们可以把元素拆分为容器和控件,UI的根节点是一个容器,列表也是一个容器,列表中的单个元素也是一个容器,文字和图片则是控件。容器可以包含别的容器和控件,而控件则为叶子节点,不再包含别的节点,整体结构如图2所示。
从代码生成的角度来描述图2中的结构,其中:
容器:为了开发时的代码复用,一个类型的容器往往会对应一份代码,比如上图的结构中,根节点、列表、列表元素都有自己对应的代码,在代码生成的过程中,我们需要把所有使用到的容器代码包含进来(加载模块)。
控件又分为两种,一种是引擎自带控件,另一种是自定义控件。
引擎自带控件:引擎自带控件已经有对应的C#实现,不需要在Lua中包含,只需把控件的路径导出到代码中即可使用。对于需要和用户交互的组件,比如Button,需要监听用户的点击,绑定点击后的回调函数。
自定义控件:自定义控件是对引擎自带控件的扩展,比如倒计时组件,相当于一种更高级的文本,他内部对倒计时的逻辑进行了封装,可以减少很多二次开发,但是使用自定义控件时,需要把该控件的代码包含进来。
以下通过一个具体的实施例来说明本发明提供的基于语法树的界面代码自动生成方法。本发明实施例中界面名称为DemoTestUI,如图3,代码生成的过程如图7所示,具体包括如下步骤:
(1)获取新的策划需求,根据新需求交互在Unity引擎中制作界面预制体,并对界面内各节点命名。
(2)在DemoTestUI上挂载UIEntity脚本,标记这是一个界面的根节点。
(3)在Image、Button、HeroList等需要导出绑定关系的节点上挂载UIComponent脚本,标记这是一个需要导出的节点。
(4)点击"生成代码"按钮。
(5)代码中会先创建根节点的数据结构。这个结构代表的是整个代码文件,里面可以插入别的具体节点,比如Class节点(代表类声明和定义)、Function节点(代表函数声明和定义)。
(6)根节点数据结构下,首先添加Class节点的数据,其中ClassName这个变量的名称赋值为界面预制体中的名字,InitStatement的内容赋值为类的定义代码所对应的字符串,如:BaseClass(“UIBase”)。
(7)创建3个Function节点Constructor(构造函数)、Init(初始化函数)、UnInit(反初始化函数),这三个函数是每个界面必有的基础元素。
(8)创建一个Variable节点,来定义一个名字为ui的表,用于存储所有导出到Lua中的ui变量。
(9)代码生成器会按照层级顺序依次遍历需要导出的节点,根据节点中的数据生成代码。当遍历到Image节点时,我们向Init函数中添加绑定代码。当遍历到Button节点时,我们向Init函数中添加绑定代码和事件注册代码(按钮点击后回调的事件),然后向DemoTestUI中添加按钮的回调函数OnButtonBtnClick。HeroList节点比较特殊,首先要在根节点中添加2个Require节点,表示需要包含CircularList和HeroRender两个代码模块,然后在Init函数中添加绑定代码和初始化代码,最后在UnInit函数中添加反初始化代码。
(10)最终生成的语法树结构如图4、图5所示。
(11)从根节点开始深度遍历整个语法树,每个遍历到的节点把自己包含的语法信息格式化成代码中对应的字符串,写入到输出中,由于是按照树形结构存储,这样的遍历方式可以保证输出的顺序和树形结构中一致。
(12)把输出内容写入到文件,最终生成的代码如图6所示。
(13)生成完毕后(生成的是基类),程序可以在派生类中实现相关的功能
(14)基于以上方式,当需求调整,交互行为修改了预制体中控件的层级时,只需要重新执行"生成代码"重新生成基类中的绑定关系,即执行步骤(4)-(12)即可。
(15)如果交互增加了节点,则需要针对新增节点执行步骤(3),再执行步骤(4)-(12)
(16)如果交互删除了节点,则重新执行步骤(4)-(12)即可。
(17)当线上出现问题,需要临时绑定某个未绑定的UI控件,只需要热修改界面基类中的Init函数,即可任意访问预制体中的UI控件。例如想要增加一个btnStart按钮的绑定函数,只需要在Init函数中插入self.ui.btnStart=rootTrans:Find(“testPanel/Button”).gameObject:GetComponent(“Button”),其中“testPanel/Button”代表节点的查找路径,即根节点->testPanel->Button。
需要说明的是,以上内容仅仅说明了本发明的技术思想,不能以此限定本发明的保护范围,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰均落入本发明权利要求书的保护范围之内。
Claims (8)
1.基于语法树的界面代码自动生成方法,其特征在于,包括如下步骤:
步骤1,获取新的策划需求,根据新需求交互在Unity引擎中制作界面预制体,并对界面内各节点命名;
步骤2,在界面上挂载UIEntity脚本,标记这是一个界面的根节点;
步骤3,在需要导出绑定关系的节点上挂载UIComponent脚本,标记这是需要导出的节点;
步骤4,执行“生成代码”功能;
步骤5,代码中先创建根节点的数据结构,数据结构代表整个代码文件,结构中可以插入具体节点;
步骤6,根节点数据结构下,首先添加Class节点的数据,根据界面预制体中的名字,设置ClassName和InitStatement的内容;
步骤7,创建3个Function节点函数,3个函数包括:Constructor构造函数、Init初始化函数、UnInit反初始化函数,所述3个函数是每个界面必有的基础元素;
步骤8,创建一个Variable节点,用于定义名字为ui的表,用于存储所有导出到Lua中的ui变量;
步骤9,代码生成器按照层级顺序依次遍历需要导出的节点,根据节点中的数据生成代码;当遍历到一个节点时,向Init函数中添加绑定代码获取该节点的组件;
步骤10,生成的语法树结构;
步骤11,从根节点开始深度遍历整个语法树,每个遍历到的节点把自己包含的语法信息格式化成代码中对应的字符串,写入到输出中,输出的顺序和树形结构中一致;
步骤12,把输出内容写入到文件,最终生成代码。
2.根据权利要求1所述的基于语法树的界面代码自动生成方法,其特征在于,所述步骤6中将ClassName变量的名称赋值为界面预制体中的名字,InitStatement的内容赋值为类的定义代码所对应的字符串。
3.根据权利要求1所述的基于语法树的界面代码自动生成方法,其特征在于,所述步骤9中事件为按钮点击后回调的事件。
4.根据权利要求1所述的基于语法树的界面代码自动生成方法,其特征在于,代码生成完毕后,程序可以在派生类中实现相关的功能。
5.根据权利要求1所述的基于语法树的界面代码自动生成方法,其特征在于,当需求调整,交互行为修改了预制体中控件的层级时,只需要重新执行"生成代码"重新生成基类中的绑定关系,即执行步骤4-12。
6.根据权利要求1所述的基于语法树的界面代码自动生成方法,其特征在于,如果交互增加了节点,则需要针对新增节点执行步骤3,再执行步骤4-12。
7.根据权利要求1所述的基于语法树的界面代码自动生成方法,其特征在于,如果交互删除了节点,则重新执行步骤4-12。
8.根据权利要求1所述的基于语法树的界面代码自动生成方法,其特征在于,当线上出现问题,需要临时绑定某个未绑定的UI控件时,只需要热修改界面基类中的Init函数,即可任意访问预制体中的UI控件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310031286.9A CN117331552A (zh) | 2023-01-10 | 2023-01-10 | 基于语法树的界面代码自动生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310031286.9A CN117331552A (zh) | 2023-01-10 | 2023-01-10 | 基于语法树的界面代码自动生成方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117331552A true CN117331552A (zh) | 2024-01-02 |
Family
ID=89293998
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310031286.9A Pending CN117331552A (zh) | 2023-01-10 | 2023-01-10 | 基于语法树的界面代码自动生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117331552A (zh) |
-
2023
- 2023-01-10 CN CN202310031286.9A patent/CN117331552A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1811702B (zh) | 用于向门户服务器应用环境自动部署门户应用的系统和方法 | |
Clark1 et al. | Engineering modelling languages: A precise meta-modelling approach | |
US20050203718A1 (en) | Knowledge management system with integrated product document management for computer-aided design modeling | |
Engelen et al. | Integrating textual and graphical modelling languages | |
Pescador et al. | Pattern-based development of domain-specific modelling languages | |
US20040158820A1 (en) | System for generating an application framework and components | |
CN110989976A (zh) | 基于J2EE的Web应用的组件化开发方法、存储介质和电子设备 | |
CN105512304A (zh) | 在线生成互联网应用方法和系统集成方法及支撑平台 | |
Schleicher et al. | Beyond stereotyping: Metamodeling approaches for the UML | |
CN101714078A (zh) | 代码生成方法及装置 | |
Gerasimov et al. | Continuous transition from model-driven prototype to full-size real-world enterprise information systems | |
US20080256509A1 (en) | Pattern-based programming system for automatic code generation | |
Drath | AutomationML: the industrial cookbook | |
Kolovos | An extensible platform for specification of integrated languages for model management | |
CN104063231A (zh) | 一种基于hit-tena的试验资源快速接入方法 | |
CN111176658B (zh) | 基于元对象机制的AADL到Simulink模型自动转换方法 | |
Moreno et al. | Towards interoperable Web engineering methods | |
CN117331552A (zh) | 基于语法树的界面代码自动生成方法 | |
CN114911466B (zh) | 一种采集端数据质量控制系统 | |
Williams et al. | Automated formalisation for verification of diagrammatic models | |
Rajan et al. | Need for instance level aspect language with rich pointcut language | |
Pleumann et al. | A model-driven runtime environment for web applications | |
CN117094284B (zh) | 一种变电站智能设备能力描述文件生成方法 | |
Schiedermeier et al. | FIDDLR: streamlining reuse with concern-specific modelling languages | |
Malohlava et al. | Interoperable domain‐specific languages families for code generation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |