跳到主要内容

从Unity到IdeaXR

本指南从 Unity 用户的角度概述了 IdeaXR ,如果你了解 Unity 并且希望将使用经验快速应用到 IdeaXR 中,那么本指南就是为你而准备的。下面将向你展示 IdeaXR 的基本使用方法,并解释相关术语帮助你快速入门。除了基本使用和相关术语之外,还会类比 UnityIdeaXR ,帮助您快速理解并掌握 IdeaXR 的编辑器结构、节点及常用编程知识等。

编辑器对比

IdeaXR 提供了一个功能丰富的编辑器,从而构建您的应用。下图显示了两个编辑器的默认布局,并带有彩色块以指示常见功能。

虽然两个编辑器可能看起来很相似,但在表面之下存在许多差异。两者都允许您使用文件系统来组织项目,但是 IdeaXR 的方法更简单,只需一个配置文件,极简主义文本格式,并且没有元数据。这使得 IdeaXRVCS系统 更加友好,例如 GitSubversionMercurial

IdeaXR 场景树面板类似于 Unity 的层级面板,但由于每个节点都有一个特定的功能,因此 IdeaXR 使用的方法更具视觉描述性。

IdeaXR 左侧有“快捷图标工作区”,将常用的 UI3D脚本资源商城项目设置导出退出到项目列表 等功能列入其中,便于用户快捷操作。

术语简表

类别UnityIdeaXR
编辑器UIHierarchy Panel/层级面板ScneneTree/场景树
Project/项目FileSystem/文件系统
类型GameObject/游戏对象Node/节点
Prefab/预制体ReusableSceneFile/可复用场景文件
编程C#IVRScript
可视化交互编辑器

从GameObject到节点

我的预制体在哪里?

Unity 提供的 预制体(Prefab) 是场景的 模板元素 。它是可重复使用的,场景中存在的预制体的每个实例都有自己的存在,但它们都具有预制体定义的相同属性。

IdeaXR 不提供这样的预制体,但 IdeaXR 场景系统 提供了相同的功能。IdeaXR允许您将场景的任何节点另存为场景文件;然后,您可以根据需要将另存的新场景作为任何节点的子级并进行实例化。您在另存的新场景中所做的任何更改都将应用于其实例。但是,您对实例所做的任何更改都不会对 模板场景 即另存的新场景产生任何影响。

确切地说,您可以通过右键—菜单面板中修改实例的参数。组成此实例的节点最初处于锁定状态。如果需要,可以通过右键—菜单面板中选择 子节点可编辑 来解锁它们。向此节点添加新的子节点并不需要操作 子节点可编辑 ;但是,任何新子节点都将属于此实例,而不是磁盘上的 模板场景 。如果要将新子节点应用到 模板场景 的每个实例中,则应将新子节点添加到 模板场景 中。

例如:

IdeaXRBasicScene 场景中,包含 第三人称建筑 两个子场景,这两个子场景就具有 Unity预制体 的功能,在文件系统中找到对应的场景名称,拖拽至 主视口 ,就能够进行实例化。

您可以右键 建筑 节点,在右键菜单中选择 子节点可编辑 ,来编辑场景中的子节点;但是,在这里的修改仅作用于当前场景—BasicScene,并不能作用于其他使用建筑的场景。如果需要同步所有引用建筑的场景,那么可以通过点击建筑节点的右侧 场景图标 ,进入建筑场景进行修改,保存后即可应用到所有引用建筑的场景。

我的组件在哪里?

Unity组件的组合与IdeaXR节点的组合

Unity 中,我们可以通过组件的组合实现特定的需求;在 IdeaXR 中,我们可以通过节点的组合实现特定的需求。

例如

我们要模拟一个方块的真实物理状态,那么就需要让这个方块具有刚体与碰撞体两个功能。

Unity 中,我们通过添加组件的方式,将 RigidbodyBox 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。

UnityIdeaXR
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 更提供了可视化交互编辑器,通过可视化模块连线的方式完成程序所需逻辑的方式,避免繁琐的代码及语法逻辑。比普通的编辑器操作简单方便,更容易上手。

详情请参考: 交互编辑器