本文将对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方法是向底层手柄相关代码中发送消息