kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

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よりも計算量的にも効率いいらしい。なるほど。

Dictionary.TryGetValue メソッド (System.Collections.Generic)

EventクラスがUnityEventを継承している

永続的にシーンにコールバックを追加できるらしい。
わざわざ毎回Callbackをセットしなくてもいいのか。便利。

確かにSteamControllerが有効になった時にいつでもCallbackが呼び出せるようにしておかないとだめか。
呼び出しはInvoke()で呼べる。

Unity - マニュアル: UnityEvent
Unity - スクリプトリファレンス: UnityEvent

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に認識されたときに行われる部分までいきました。

以上です。