跳到主要内容

插件的创建

本章将介绍创建插件的基本流程以及每个固定文件的作用。

关于插件

插件是用来扩展编辑器节点的好方法。它可以完全使用 IVRScript 和标准场景(scene)制作。你可以用它们做很多事情。

创建插件的基本流程

在开始前,先找个地方创建个空项目。这个空项目是制作和测试我们插件的基础。

编辑器要识别一个新的插件,需要两个文件: 一个是plugin.cfg用于配置和具有此功能的工具脚本,一个是plugin.is,用于插件节点的初始化和清除。插件在项目文件夹里面有一个标准路径,比如addons/plugin_name。IdeaXR提供了创建插件的入口,用于生成这些文件并将它们放在需要的位置。

打开空项目后,点击左上方的工具->创建自定义插件,你会看到出现了一个对话框,类似这样:

create_plugin

  • 插件名称、插件描述、作者、版本号支持中英文输入;
  • 自定义节点类、文件夹名称仅支持英文输入;
    • 创建前会检测节点类名是否与引擎自有类重名,如有重名则会提示:节点类型已存在,请重新命名
    • 创建前会检测addons文件夹下是否已存在同名文件夹,如有重名则会提示:插件文件夹已存在,请重新命名
  • 继承节点类:
    • 输入框禁止手动输入,点击后方小按钮后弹出“新建Node窗口”选择继承的节点类型;
  • 接入第三方SDK:
    • 勾选后才出现后面的SDK类名,仅支持英文输入;
    • 点击帮助按钮,会打开官网开发者文档-插件开发的相关页面;

你可以尝试在其中输入你自己定义的文本,如果怕出问题,可以先使用图中的输入:

create_plugin_input

输入完毕后点击新建即可,这样插件就创建完毕了。IdeaXR 会默认帮你创建一个继承自Spatial的自定义节点,你可以在添加节点的页面搜索到:

add_custom_node

默认插件模板定义

  • res://addons下按创建插件时定义的文件夹名称生成新的插件文件夹:res://addons/[文件夹名称]
  • 文件夹内包含5个默认文件:
    • plugin.cfg
    • plugin.is
    • icon.svg
    • [自定义节点类].is
    • [自定义节点类].po

接下来依次介绍这五个文件的作用

plugin.cfg

该文件是根据设置面板上的信息所生成cfg配置文件。在编辑器中不可见,仅能在外部打开,非必要不要轻易修改。

[plugin]

name="[插件名称]"
description="[插件描述]"
author="[作者]"
version="[版本号]"
script="plugin.is"

[translation]
po_path = "res://addons/[文件夹名称]/[自定义节点类].po"

括号里面的文本与创建插件时的设置对应。[plugin]中指定的是插件的基本信息,[translation]中指定的是翻译文件的路径。

plugin.is

该文件名称对应cfg配置文件中的script字段,该脚本有两个要求你不能改变:它必须是一个tool脚本,否则将无法在编辑器中正常加载;它必须继承EditorPlugin。有关于tool关键字的介绍见 IVRScript基础语法-tool

警告

除了这个 EditorPlugin 脚本之外,插件用到的其他 IVRScript 也必须是工具脚本。没有tool的 IVRScript 在导入编辑器后都会像空文件一样!

处理好资源的初始化和清理是很重要的。一个好的做法是使用虚函数 _enter_tree() 来初始化你的插件,以及 _exit_tree() 来清理它。值得庆幸的是,IdeaXR 为你生成了这些回调。你的脚本应该看起来像这样:


tool
extends EditorPlugin



func _enter_tree():
add_custom_type("[自定义节点类]","[继承节点类型]",preload("res://addons/[文件夹名称]/[自定义节点类].is"),preload("res://addons/[文件夹名称]/icon.svg"))
pass

func _exit_tree():
remove_custom_type("[自定义节点类]")
pass

括号里面的文本与创建插件时的设置对应。如果后续你对插件中文件的名称或路径有修改,则需要同步修改该文件中对应路径和名称,否则由于找不到相关文件而导致报错。

icon.svg

该文件为创建插件节点时节点名称左侧的图标,你可将其改为自己设计的节点图标。如果节点名称则需要同步修改plugin.is中对应的文件名称。

自定义节点类.is

有时你希望在许多节点中存在某种行为,例如可以重复使用的自定义场景或控件。实例化在很多情况下都很有用,但有时它会很麻烦,特别是如果你在许多项目中使用它。一个很好的解决方案是创建一个插件,添加一个具有自定义行为的节点。IdeaXR 在你创建插件时会为你生成默认的自定义节点类型脚本[自定义节点类].is。根据“继承”属性选择的节点类型(默认继承Spatial),新建插件功能的 is 脚本,默认以“插件名称”作为脚本名称。默认代码如下:

extends Spatial


func _ready():
pass


func _physics_process(delta):
pass

翻译文件

[自定义节点].po,该文件作为翻译文件,默认以“插件名称”作为文件名。默认有如下代码

msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "English"
msgstr "中文翻译"

前四行为固定格式不能修改,用户可以在其之后添加需要翻译的单词句和翻译后的中文。具体方式为,在msgid中添加英文,msgstr中添加对应中文。一个单词或短语对应一组msgidmsgstr关键字。

正确:

msgid "property one"
msgstr "属性1"

msgid "property two"
msgstr "属性2"

错误:

msgid "property one","property two"
msgstr "属性1""属性2"