この記事は Unity Assets Advent Calendar 2016 24日目の記事になります。
今日は俺のこの手を光って唸らせる。
Ultimate VFX 2.6.2 (Dec 20, 2016)
HoloLensで自分の手の位置を認識する
Microsoft HoloLens Hand Tracking https://t.co/FgNGAjnfXs @YouTubeさんから
— ゆーじ (@yuujii) 2016年12月24日
- HandPositionスクリプトを空のManagarゲームオブジェクトにアタッチ。
- シーンにCubeを配置。Scaleは0.01にしてInspectorでHandObjectに設定しておく。
HandPosition.cs
using UnityEngine;
using System.Collections;
using UnityEngine.VR.WSA.Input;
public class HandPosition : MonoBehaviour {
private Vector3 initPos;
public GameObject HandObject;
void Start() {
InteractionManager.SourceUpdated += InteractionManager_SourceUpdated;
}
void InteractionManager_SourceUpdated(InteractionSourceState state) {
Vector3 handPosition;
if (state.source.kind == InteractionSourceKind.Hand && state.properties.location.TryGetPosition(out handPosition)) {
HandObject.transform.position = initPos + handPosition;
}
}
}
HoloLensのハンドジェスチャーで手を光らせる
Microsoft HoloLens: Shining Finger https://t.co/3mLX9H6KZn @YouTubeさんから
— ゆーじ (@yuujii) 2016年12月24日
Ultimate VFXに含まれるよさげなエフェクトのプレハブをCubeの子に入れて完成。
HandPosition.csはAir-Tapを認識するようにし、HandObjectに指定したゲームオブジェクトの表示非表示をON/OFFするようにする。
HandPosition.cs(改)
using UnityEngine;
using System.Collections;
using UnityEngine.VR.WSA.Input;
public class HandPosition : MonoBehaviour {
private Vector3 initPos;
public GameObject HandObject;
void Start() {
InteractionManager.SourceUpdated += InteractionManager_SourceUpdated;
InteractionManager.SourceLost += InteractionManager_SourceLost;
InteractionManager.SourcePressed += InteractionManager_SourcePressed;
InteractionManager.SourceReleased += InteractionManager_SourceReleased;
}
void InteractionManager_SourceUpdated(InteractionSourceState state) {
Vector3 handPosition;
if (state.source.kind == InteractionSourceKind.Hand && state.properties.location.TryGetPosition(out handPosition)) {
HandObject.transform.position = initPos + handPosition;
}
}
void InteractionManager_SourceLost(InteractionSourceState state) {
ShiningFinger(false);
}
void InteractionManager_SourcePressed(InteractionSourceState state) {
ShiningFinger(true);
}
void InteractionManager_SourceReleased(InteractionSourceState state) {
ShiningFinger(false);
}
void ShiningFinger(bool isActive) {
HandObject.SetActive(isActive);
}
}