可开启门(Openable_Door)
发表于2016-11-02
导语
SteamVR_Unity_Toolkit工具包API详解:Openable_Door
可开启门(Openable_Door)
概述
这个类继承自VRTK_InteractableObject,和一般的交互物体一样,可以用手柄触碰,抓取和使用
在VRTK_InteractableObject中,只是为使用逻辑设置了一些相关的参数,并没有具体到场景中来实现功能,这重写了父类的StartUsing方法,设置了自己的一些旋转参数,并在Update中每帧根据参数的值,来实现door对象的旋转。
门板(Panel)是门(door)的子对象,门的Transform的位置在门板的一侧边缘,这样我门在脚本中控制门对象的旋转时,场景中呈现出来的就是门板绕着一侧旋转,这样就和真实场景中门的旋转一致。
场景中的door对象的box collider比渲染在画面里的门要厚一点,这样手柄只要在门的附近,就可以使用它。
Inspector可见参数
flipped: 如果勾选,那么参数sideFlip为1,默认是不勾选,sideFlip为-1
rotated: 用于脚本中判断参数 side的值
内置参数
sideFlip: 翻转标志
side 方位标志
smooth: 平滑旋转门,每秒270度
doorOpenAngle: 开门的角度是围绕door的y轴旋转-90度
open: 如果当前手柄的使用目的是开门,为true,否则为false
defaultRotation: 门初始(关门)的世界旋转角度
openRotation: 下一次使用时门的目标世界旋转角度
用sideFilip与side相乘来判断开门的方向,得到1则门朝里开,得到-1则门朝外推
公有方法
StartUsing/1
public override void StartUsing()
Parameters
GameObject -
Returns
none
调用父类的StartUsing方法,并且重写父类StartUsing方法,设置开门方向,设置开门旋转角度的四元数。除了这两个作用,主要是更新参数open的值
open=!open;
私有/保护方法
Start/0
protected override void Start ()
Parameters
none
Returns
none
调用父类的Start方法,并且重写父类Start方法,设门关闭三维形式旋转为当前对象Transform的旋转,同时调用SetRotation方法,设置下次门被使用的时候的目标旋转角度。根据flipped勾选情况为参数sideFlip赋值。
Update/0
protected override void Update()
Parameters
none
Returns
none
调用父类的Update方法,并且重写父类的Update方法。每帧检测参数open的值,旋转门从当前位置到目标旋转角度,速度是每秒smooth度,乘上Time.deltaTime,转换为每帧旋转的角度。结合前面StartUsing方法中对open的设置,可以这样理解门开关的流程。
Update/0
private void SetRotation()
Parameters
none
Returns
none
设置门的开启后旋转角度,只围绕y轴旋转。角度是设置好的(doorOpenAngle = -90f;),主要是判断旋转的方向,根据sideFlip*side的结果来判断是拉门还是推门。sideFlidp和side的值只会从1和-1中取,所以只要两者值正负一致,门都会围绕自己的y轴旋转doorOpenAngle,两者不一致时就会旋转-doorOpenAngle。
SetDoorRotation/1
private void SetDoorRotation()
Parameters
Vector3 - 手柄当前的世界坐标
Returns
none
方法会根据手柄的位置和rotated来设置side值,最终都是用来控制门开启的方向。
当rotated和flipped都不勾选的时候
手柄在门旋转轴的右侧时,门会朝外开,即实现推门的效果
手柄在门旋转轴的左侧时,门会朝里开,即实现拉门的效果
当rotated勾选,flipped不勾选的时候
手柄在门的里侧时,门会朝外开,即实现推门的效果
手柄在门的外侧时时,门会朝里开,即实现推门的效果
如果勾选了filpped,那么上述效果就是相反的