从Unity到IdeaXR
本指南从 Unity 用户的角度概述了 IdeaXR ,如果你了解 Unity 并且希望将使用经验快速应用到 IdeaXR 中,那么本指南就是为你而准备的。下面将向你展示 IdeaXR 的基本使用方法,并解释相关术语帮助你快速入门。除了基本使用和相关术语之外,还会类比 Unity 与 IdeaXR ,帮助您快速理解并掌握 IdeaXR 的编辑器结构、节点及常用编程知识等。
编辑器对比
IdeaXR
提供了一个功能丰富的编辑器,从而构建您的应用。下图显示了两个编辑器的默认布局,并带有彩色块以指示常见功能。
虽然两个编辑器可能看起来很相似,但在表面之下存在许多差异。两者都允许您使用文件系统来组织项目,但是 IdeaXR
的方法更简单,只需一个配置文件,极简主义文本格式,并且没有元数据。这使得 IdeaXR
对 VCS系统 更加友好,例如 Git , Subversion 或 Mercurial 。
IdeaXR
场景树面板类似于 Unity
的层级面板,但由于每个节点都有一个特定的功能,因此 IdeaXR
使用的方法更具视觉描述性。
IdeaXR
左侧有“快捷图标工作区”,将常用的 UI 、 3D 、 脚本 、 资源商城 、 项目设置 、 导出 、 退出到项目列表 等功能列入其中,便于用户快捷操作。
术语简表
类别 | Unity | IdeaXR |
---|---|---|
编辑器UI | Hierarchy Panel/层级面板 | ScneneTree/场景树 |
Project/项目 | FileSystem/文件系统 | |
类型 | GameObject/游戏对象 | Node/节点 |
Prefab/预制体 | ReusableSceneFile/可复用场景文件 | |
编程 | C# | IVRScript |
可视化交互编辑器 |
从GameObject到节点
我的预制体在哪里?
Unity
提供的 预制体(Prefab)
是场景的 模板元素 。它是可重复使用的,场景中存在的预制体的每个实例都有自己的存在,但它们都具有预制体定义的相同属性。
IdeaXR
不提供这样的预制体,但 IdeaXR
场景系统 提供了相同的功能。IdeaXR
允许您将场景的任何节点另存为场景文件;然后,您可以根据需要将另存的新场景作为任何节点的子级并进行实例化。您在另存的新场景中所做的任何更改都将应用于其实例。但是,您对实例所做的任何更改都不会对 模板场景 即另存的新场景产生任何影响。
确切地说,您可以通过右键—菜单面板中修改实例的参数。组成此实例的节点最初处于锁定状态。如果需要,可以通过右键—菜单面板中选择 子节点可编辑 来解锁它们。向此节点添加新的子节点并不需要操作 子节点可编辑 ;但是,任何新子节点都将属于此实例,而不是磁盘上的 模板场景 。如果要将新子节点应用到 模板场景 的每个实例中,则应将新子节点添加到 模板场景 中。
例如:
IdeaXR
的 BasicScene 场景中,包含 第三人称 与 建筑 两个子场景,这两个子场景就具有 Unity预制体 的功能,在文件系统中找到对应的场景名称,拖拽至 主视口 ,就能够进行实例化。
您可以右键 建筑 节点,在右键菜单中选择 子节点可编辑 ,来编辑场景中的子节点;但是,在这里的修改仅作用于当前场景—BasicScene,并不能作用于其他使用建筑的场景。如果需要同步所有引用建筑的场景,那么可以通过点击建筑节点的右侧 场景图标 ,进入建筑场景进行修改,保存后即可应用到所有引用建筑的场景。
我的组件在哪里?
Unity组件的组合与IdeaXR节点的组合
在 Unity
中,我们可以通过组件的组合实现特定的需求;在 IdeaXR
中,我们可以通过节点的组合实现特定的需求。
例如
我们要模拟一个方块的真实物理状态,那么就需要让这个方块具有刚体与碰撞体两个功能。
Unity
中,我们通过添加组件的方式,将 Rigidbody 与 Box Collider 组件添加到方块的 GameObject ,从而实现方块真实物理状态的模拟。
IdeaXR
中,我们通过刚体节点与碰撞节点组合的方式,将 模型 与 碰撞形状 节点设置为 刚体 的子节点,实现方块真实物理状态的模拟。
提示
在 IdeaXR
中, 碰撞形状 需要设置成为 刚体 的子节点,才能与其他物体产生碰撞;再将模型 网格实例(MeshInstance) 设置为 刚体 的子节点,即可实现模型、碰撞、刚体的同步。
IdeaXR不同应用场景下的专属节点
IdeaXR
提供了多种可直接使用的节点,以 UI-Button 为例, 复选按钮 、 菜单按钮 、 工具按钮 等节点都可以直接使用。
相对应的,上图也展现了复选按钮的继承关系: Node-CanvasItem-Control-BaseButton-Button , 通过继承,基类的属性方法和信号就可以得到复用。
IdeaXR自定义脚本
IdeaXR支持对每个节点添加自定义脚本(包括 可视化脚本 或 IVRScript ),从而实现对节点功能扩展。
例如
我们在一模型节点,新建 IVRScript ,扩展其控制模型的显隐功能。
func _show():
get_node("桌子").show()
get_node("椅子").show()
func _hide():
get_node("桌子").hide()
get_node("椅子").hide()
提示
在 IdeaXR
中,每个节点只能附加一个脚本。可以使用外部 IVRScript 文件,也可以将脚本直接包含在节点中。如果需要将多个脚本附加到一个节点,则可以考虑以下两种解决方案,具体取决于应用场景和要实现的目标:
- 在目标节点与其当前父节点之间添加新节点,然后向该新节点添加脚本。
- 将目标节点拆分为多个子节点,并为每个子节点附加一个脚本。
从MonoBehaviour到Node
Unity脚本都继承于MonoBehaviour,而IdeaXR脚本都继承于Node。
Unity | IdeaXR |
---|---|
Awake() | _init() |
Start() | _ready() |
FixedUpdate() | _physics_process(delta) |
Update() | _process(delta) |
IdeaXR节点执行顺序
IdeaXR节点执行顺序指的是场景中单个节点脚本执行顺序
初始化函数
func _init()
初始化对象时调用func _enter_tree()
在节点进入 SceneTree 时调用func _ready()
在节点“就绪”时调用,即在节点及其子节点都进入场景树时调用
物理循环函数
func _physics_process(delta)
在物理循环处理步骤中调用
主循环函数
func _process(delta)
在主循环处理步骤中调用
离开场景树
_exit_tree()
在节点即将离开 SceneTree 时调用
提示
除了 _ready()
是先执行完子节点的方法;其余都是先执行父节点中的方法,然后执行子节点的
开发方式
Unity C# 与IdeaXR IVRScript
Unity
内的 C# 运行于 Mono虚拟机 ,Mono虚拟机提供了与 .Net 差不多的功能,所以在Unity内使用C#不但能调用Unity引擎本身的功能,还能调用.Net平台中提供的大部分功能。
IdeaXR
提供自己的脚本语言 IVRScript ,IVRcript从 Python 借用了它的语法,但与它无关。IVRScript与 IdeaXR API 紧密相连,学习时间不长,易于上手。
详情请参考: IVRScript
func move_to_node_positions(node):
get_node("VR相机").global_transform = node.global_transform
func call_start(scene_node:Object):
if scene_node.has_method("start"):
scene_node.start()
IdeaXR 可视化交互编辑器
IdeaXR
更提供了可视化交互编辑器,通过可视化模块连线的方式完成程序所需逻辑的方式,避免繁琐的代码及语法逻辑。比普通的编辑器操作简单方便,更容易上手。
详情请参考: 交互编辑器