14.4.2 制作UI交互效果
本例中,将每幅作品旁边都放置一个文字简介UI。实际上,到这里项目就可以完成了。但是为了增加VR项目的互动性,本例中增加UI交互效果。关于VR中的UI交互,在第13章已经有了比较详细的介绍,此处不再赘述。在VR展馆类的应用中,作品简介的UI可以是固定在作品旁,也可以采用唤起方式。唤起方式主要有三种:第一种是通过手柄发出射线按下某个按钮,从而出现UI;第二种是凝视触发,即用户在VR环境中注视UI达到一定时长后,显示UI;第三种是满足某种条件的自动触发,例如用户与UI的距离小于一定数值时,即可自动显示UI。本例中采用第三种UI交互方式。
这种UI交互方式的原理是:在程序初始运行时,UI默认为不可见。在运行过程中,计算当前场景中VR玩家与UI之间的距离,当小于某个距离阈值(例如3 m)时,显示UI,反之UI隐藏。接下来按此原理编写脚本。
选中Introduction对象,在Inspector面板中单击“Add Component”,在搜索栏输入“Show UI”,单击下方的“New script”,在Introduction上挂载一个名为“Show UI”的脚本组件。
打开“Show UI”脚本,编写代码。由于需要访问Player等属性,所以首先引入“Valve.VR.InteractionSystem”名称空间,在第4行添加代码:using Valve.VR.InteractionSystem。
然后在Show UI的类体中定义字段,此处需要定义四个字段:可以在Unity编辑器中直接设置的距离阈值Distance(float类型)、表示UI的canvas对象canvas UI(GameObject类型)、VR玩家myplayer(Player类型)、UI的位置UITransform(Transform类型)。编写代码如图14.35所示。
接下来,编写Start()方法,在其中添加以下代码,如图14.36所示。
图14.35 定义Show UI的字段
图14.36 编写Start()方法
在Start()方法中,主要是进行初始化工作,例如将表示UI的canvas对象设置为默认不可见。
最后,编写Update()方法。通过if.else语句判断VR玩家和UI之间的距离是否小于Distance设定的参数:如果是,则使用嵌套if语句进一步判断当前场景中是否没有显示此UI,若没有,则显示UI;如果否,则使用嵌套if语句进一步判断当前场景中是否已经显示了此UI,若是,则隐藏UI。代码如图14.37所示。
图14.37 编写Update()方法
使用嵌套if语句进行二次判断的好处是,避免对于Set Active()方法的不必要的调用,从而优化程序代码。
保存脚本,在Visual Studio中单击“附加到Unity”按钮,脚本正常运行,再单击“停止调试按钮”。回到Unity编辑器中,可以看到Show UI脚本组件上出现了Distance(初始值为3)、Canvas UI两个选项。从Hierarchy面板中将Introduction的子对象Canvas拖至“Canvas UI选项”的插槽中,将其设定为目标Canvas,如图14.38所示。
图14.38 Show UI脚本组件
保存并运行当前场景,测试交互效果。可以看到,在初始时,UI是隐藏的,如图14.39所示。使用VIVE手柄瞬移到UI前方一点,则UI自动显示。
图14.39 UI默认隐藏
使用此方法制作其他位置的UI和交互效果。再次测试,项目能够成功运行,保存项目和场景。
将项目打包为可执行文件