本文将对Qcom VR SDK中手柄相关的代码做简单的讲解。
//--------------------------------------------------------------------------------------------- //Controller Apis //--------------------------------------------------------------------------------------------- /// <summary> /// Controllers the start tracking. /// </summary> /// <returns>The start tracking.</returns> /// <param name="desc">Desc.</param> //--------------------------------------------------------------------------------------------- public override int ControllerStartTracking(string desc) { return SvrControllerStartTracking(desc); } /// <summary> /// Controllers the stop tracking. /// </summary> /// <param name="handle">Handle.</param> //--------------------------------------------------------------------------------------------- public override void ControllerStopTracking(int handle) { SvrControllerStopTracking(handle); } /// <summary> /// Dumps the state. /// </summary> /// <param name="state">State.</param> //--------------------------------------------------------------------------------------------- private void dumpState(SvrControllerState state) { String s = "{" + state.rotation + "}\n"; s += "[" + state.position + "]\n"; s += "<" + state.timestamp + ">\n"; Debug.Log (s); } /// <summary> /// Controllers the state of the get. /// </summary> /// <returns>The get state.</returns> /// <param name="handle">Handle.</param> //--------------------------------------------------------------------------------------------- public override SvrControllerState ControllerGetState(int handle) { SvrControllerState state = new SvrControllerState(); SvrControllerGetState (handle, ref state); //dumpState (state); return state; } /// <summary> /// Controllers the send event. /// </summary> /// <param name="handle">Handle.</param> /// <param name="what">What.</param> /// <param name="arg1">Arg1.</param> /// <param name="arg2">Arg2.</param> //--------------------------------------------------------------------------------------------- public override void ControllerSendMessage(int handle, SvrController.svrControllerMessageType what, int arg1, int arg2) { SvrControllerSendMessage (handle, (int)what, arg1, arg2); } /// <summary> /// Controllers the query. /// </summary> /// <returns>The query.</returns> /// <param name="handle">Handle.</param> /// <param name="what">What.</param> /// <param name="mem">Mem.</param> /// <param name="size">Size.</param> //--------------------------------------------------------------------------------------------- public override object ControllerQuery(int handle, SvrController.svrControllerQueryType what) { int memorySize = 0; IntPtr memory = IntPtr.Zero; object result = null; System.Type typeOfObject = null; switch(what) { case SvrController.svrControllerQueryType.kControllerBatteryRemaining: { typeOfObject = typeof(int); memorySize = System.Runtime.InteropServices.Marshal.SizeOf (typeOfObject); memory = System.Runtime.InteropServices.Marshal.AllocHGlobal (memorySize); } break; } int writtenBytes = SvrControllerQuery (handle, (int)what, memory, memorySize); if (memorySize == writtenBytes) { result = System.Runtime.InteropServices.Marshal.PtrToStructure (memory, typeOfObject); } if (memory != IntPtr.Zero) { Marshal.FreeHGlobal (memory); } return result; }
在SvrPluginAndroid脚本中
ControllerStartTracking和ControllerStopTracking分别负责手柄的连接和停止。
ControllerGetState方法返回的是当前手柄的状态。
ControllerSendMessage方法是向底层手柄相关代码中发送消息