基于Unity3D的三维虚拟电脑组装实验系统
图25 虚拟装机场景
由于需要和虚拟世界的物体产生交互,所以需要做鼠标和物体之间的碰撞检测,当鼠标碰触到虚拟世界中的物体后,虚拟物体做出响应。
在Unity中,做碰撞检测有三种方法。第一种是碰撞器,第二种是触发器,最后一种是射线检测。
碰撞器是一群组件,它包含了很多种类,比如Box Collider,Capsule Collider等,这些碰撞器应用场合不同,但作用基本一样。
触发器则表示当碰撞发生时触发事件。添加触发器只需要在Collider的监视器窗口勾选IsTrigger选项即可。在Unity3d中,主要通过如图26所示的接口来处理碰撞器和触发器的碰撞检测:
第20页
基于Unity3D的三维虚拟电脑组装实验系统
图26 Unity中的碰撞器接口 具体来讲碰撞器还可分为三类。
静态碰撞器(Static Collider)指的是没有附加刚体而附加了碰撞器的对象。这类对象会保持静止或很轻微的移动。
刚体碰撞器(Rigidbody Collider)指的是附加了刚体的对象。
运动学刚体碰撞器(Kinematic Rigidbody Collider)指的是在刚体组件中勾选了IsKinematic属性的碰撞器。它将不受物理力的影响。
碰撞检测发生时不同碰撞器发送给Collison类对象的消息如图27所示:
图27 碰撞检测时发送信息表
触发器触发时不同碰撞器发送给Collision类对象的消息如图28所示:
图28触发器触发时发送信息表
由于需要检测玩家鼠标所在的屏幕点与场景物体之间的碰撞,而鼠标无法添加碰撞器,
所以这里需要使用到射线法来进行碰撞检测。它的原理是以当前鼠标点为起点,垂直于屏幕
第21页
基于Unity3D的三维虚拟电脑组装实验系统
向里画一条一定长度的射线,将这条射线穿过的物体进行标记。本实验用到的射线碰撞检测代码如图29所示:
图29 射线检测源代码
场景中的每一个电脑组件都附加了三个脚本ObjectMoveControl、Hit、DistanceDetect分别来控制移动、旋转和距离检测。它们的关系如图30:
图30 电脑组件的控制
4.9 场景音乐和按钮音乐
Unity中可以通过给一个游戏对象添加AudioSource来添加音乐文件,支持MP3、ogg等常见的音乐类型文件,AudioSource可以控制音乐的播放以及单边音效等效果。 音乐类型的文件在导入的时候,需要设置该音乐文件时一个2D音乐还是3D音乐。二者的区别在于,2D音乐无论“听者”的位置距离声源有多远,声音的大小都是不变的。3D音
第22页
基于Unity3D的三维虚拟电脑组装实验系统
乐则类似现实世界中的音乐,当你离声源越近时听到的声音就越大。在本实验中,由于是给整个程序添加一个舒缓的背景音乐,所以勾选2D音乐就可以了。
上面提到“听者”的概念,在一个环境里有了声音,却没有人来听,那声音的存在就没有意义了,在Unity中也是一样。为了听到声音,需要在场景里添加一个Audio Listener。它通常作为组件添加在场景的主摄像机上。
在本系统中,我们在主场景中创建了一个名为Audio Source的空物体,并未它添加Audio Source组件,并把导入的背景音乐文件赋值到监视器里的Audio Clip上。进行到这里的时候,需要注意的是,由于背景音乐是全局的,也就是说在整个游戏的运行过程中,音乐都要存在,而Unity在加载新场景的时候,会将上一个场景内的所有物体全部销毁。为了保持音乐文件不被销毁,需要用到Unity提供的DontDestroyOnLoad()接口。这样音乐就不会被销毁了。
有的用户可能更喜欢安静一点的实验环境,所以还需要添加一个对音乐开关的控制。Audio Source组件中的Mute属性就控制着声源文件的开关。用NGUI制作一个按钮,但点击事件发生时,访问Audio Source的Mute属性并改变它即可。实现的源代码如图31所示:
图31 背景音乐的控制
按钮的音乐控制比较简单,使用NGUI提供的组件UIPlaySound即可。组件在监视器里的赋值情况如图32所示:
图32 NGUI UIPlaySound赋值
第23页
相关推荐: