VR康复训练之逻辑推理部分(Unity/VR/C#)
本文基于Player,而非CameraRig
参考文章:https://blog.csdn.net/chh19941125/article/details/90027555
Player:这个预制件是整个系统的核心,大多数其他组件都依赖于player
InteractableExample:这个类是一个和手柄进行简单交互的类。会接收手柄发来的信息并作出反应。由于很多example类中很多方法没用上,挑选了我们所需要方法放在了Core文件中。
UI&Hints:这个显示了交互系统如何处理提示。并且如何使用它和Unity UI控件像按钮一样进行交互。
交互系统的简单介绍
交互系统的核心是Player,Hand和Interactable类。Player预制件为场景设置play对象和SteamVR摄像机。这个交互系统通过发送信息给场景中所有可以和手柄进行交互的对象,这个对象再对接收的信息作出反应。并可以设置对象附着到手柄上。为了接收手的信息只要添加Interactable组件到对象上,这个对象就可以根据手的信息作出相应的悬停监测。Player预制件也创建了一个用于模仿鼠标事件可以简单地用Unity UI控件控制的输入模式。交互系统也包括一个传统的第一人称摄像机,用键盘和鼠标控制。鼠标就类似人的一只手一样。当开发者没有VR头显时,这个模式就非常有用了。
Player类的功能介绍
Hand类的功能介绍
层次结构
Directional Light
平行光(方向光) ,最省资源,可以改变角度,可以看作太阳。
其他Light
Point Light:点光源(由一个点向四周发射光源) 可以改变位置 联想:灯泡
Spot Light:聚光灯(聚光/锥光) 最耗费资源 可以改变位置和角度 联想:手电
Area Light:区域光(创造灯光贴图烘焙时使用) 无法应用于实时光照
Study
StudyCore
private Interactable interactable; //交互public static bool flag = false; //UI交互部分
private TextMesh textMesh;//本体所带文本框public string beginText = null; //开始文本
public string processText = null; //过程中文本//Sound声音部分
public GameObject publicAudioSource;
private AudioSource audioSource; //音乐库
public AudioClip beginSound; //开始音乐
public AudioClip alreadySettedSuccessfully; //训练成功结束音乐private Hand.AttachmentFlags attachmentFlags = Hand.defaultAttachmentFlags &(~Hand.AttachmentFlags.SnapOnAttach) &(~Hand.AttachmentFlags.DetachOthers) &(~Hand.AttachmentFlags.VelocityMovement); //抓取实现效果
Awake
初始化
void Awake()
{interactable = this.GetComponent();//Sound初始化audioSource = publicAudioSource.GetComponent();Soundplayer(audioSource, beginSound);//UI初始化textMesh = GetComponentInChildren();//textMesh.fontSize = 240;textMesh.color = new Color32(248, 241, 22, 255);textMesh.text = beginText;
}
Interactable组件
所有交互最基础的组件(所有要交互的UI、物体必添加)。添加后相当于告诉系统,该物体可以与手柄进行交互。
ControllerHoverHighlight组件
LeftHand和RightHand表示左右手,其下的ControllerHoverHighlight组件,包含高亮效果的Material,更改其Material便可改变手柄高亮效果。
FireHapticsOnHightlight
勾选后,当手柄接触物体时,手柄高亮、触发震动。
还可以通过下列代码来控制手柄震动时长。
...GetComponent().controller.TriggerHapticPulse(500);
OnHandHoverBegin
当手柄接触到物体时(事件触发,一帧);
///
/// 触碰但未抓取
///
///
private void OnHandHoverBegin(Hand hand)
{if (textMesh != null){textMesh.color = new Color32(23, 219, 57, 255);textMesh.text = beginText;}
}
OnHandHoverEnd
悬停结束时调用(类似OnTriggerExit,一帧)
OnAttachedToHand
附加到手柄上时调用
///
/// 正在抓着物品
///
///
private void OnAttachedToHand(Hand hand)
{StudyFlag.studyFlag = true;Rigidbody rigidbodyOfAttachedObject = hand.currentAttachedObject.GetComponentInChildren();Transform transformOfAttachedObject = hand.currentAttachedObject.GetComponentInChildren();rigidbodyOfAttachedObject.drag = 10000;rigidbodyOfAttachedObject.angularDrag = 10000;if (textMesh != null){textMesh.color = new Color32(23, 219, 57, 255);textMesh.text = processText;}else{Soundplayer(audioSource, alreadySettedSuccessfully);Flag.operationCount++;}
}
OnDetachedFromHand
从手柄上分离时调用(一帧)
///
/// 放下物品
///
///
private void OnDetachedFromHand(Hand hand)
{Rigidbody rigidbodyOfAttachedObject = hand.currentAttachedObject.GetComponentInChildren();Transform transformOfAttachedObject = hand.currentAttachedObject.GetComponentInChildren();rigidbodyOfAttachedObject.drag = 1;rigidbodyOfAttachedObject.angularDrag = 1;
}
HandHoverUpdate
附加到手柄上时,每一帧都发送信息
private void HandHoverUpdate(Hand hand)
{GrabTypes startingGrabType = hand.GetGrabStarting();bool isGrabEnding = hand.IsGrabEnding(this.gameObject);if (interactable.attachedToHand == null && startingGrabType != GrabTypes.None){hand.HoverLock(interactable);hand.AttachObject(gameObject, startingGrabType, attachmentFlags);}else if (isGrabEnding){hand.DetachObject(gameObject);hand.HoverUnlock(interactable);}
}
标签:
相关文章
-
无相关信息