Unity SteamVR Pluginのソースを読む Part1 導入
かずまです。
SteamVRPluginのソースを読みます。
そのメモです。
主にC#を理解できればいいかなってところです。
準備アセット
これです。
HTC Viveを持っていればこれをUnityに入れて動かすって感じです。
ここから気になったところをどんどん羅列して書いていく
SteamVR_Events.csでのイベント管理
// 189行目 static System.Collections.Generic.Dictionary<EVREventType, Event<VREvent_t>> systemEvents = new System.Collections.Generic.Dictionary<EVREventType, Event<VREvent_t>>(); public static Event<VREvent_t> System(EVREventType eventType) { Event<VREvent_t> e; if (!systemEvents.TryGetValue(eventType, out e)) { e = new Event<VREvent_t>(); systemEvents.Add(eventType, e); } return e; }
Calibrationが有効になっているときとか、なった瞬間とかいろんなシステム側のイベントクラスになっているみたい。
Dictionaryを取り出す時にTryGetValueを使ったほうがKeyNotFoundExceptionよりも計算量的にも効率いいらしい。なるほど。
EventクラスがUnityEventを継承している
永続的にシーンにコールバックを追加できるらしい。
わざわざ毎回Callbackをセットしなくてもいいのか。便利。
確かにSteamControllerが有効になった時にいつでもCallbackが呼び出せるようにしておかないとだめか。
呼び出しはInvoke()で呼べる。
SteamVR_TrackedObject.csでのトラッキングするオブジェクト
このスクリプトではMonoBehaviourを継承している。
そのためOnEnableやOnDisable()が使える。
この2つのメソッドはオブジェクトが有効になった時に呼び出されるCallcackになっている。
Unity - スクリプトリファレンス: MonoBehaviour.OnEnable()
// 74行目 newPosesAction.enabled = true;
newPosesActionは先程見たSteamEventsになる。
void Awake() { newPosesAction = SteamVR_Events.NewPosesAction(OnNewPoses); }
OnNewPosesというメソッドをActionに追加してオブジェクトを渡している。
ここの56行目あたりで、位置が取れそう。
var pose = new SteamVR_Utils.RigidTransform(poses[i].mDeviceToAbsoluteTracking); if (origin != null) { transform.position = origin.transform.TransformPoint(pose.pos); transform.rotation = origin.rotation * pose.rot; } else { transform.localPosition = pose.pos; transform.localRotation = pose.rot; }
ここのposeで値が取れそうな気がします。
次はSteam_Utils_SteamVR_Utils.RigidTransformを見ていこうと思いますが、
今日はここまで。
とりあえず、SteamControllerやTrackingするオブジェクトが
Steamに認識されたときに行われる部分までいきました。
以上です。