本日はツールの調査枠です。
前回はキーボードの入力によって変更できるNavMesh-Simpleシーンで行える機能を見ていきました。
SceneUnderstandingはMRTKとは2020年末現在独立したツールであるため、アプリでの組み込みなどの勉強として本日はキーを押したときに動いている処理を調査します。
〇SampleInputManager
NavMesh-Simpleでのインプットは[SceneUnderstandingMenu]オブジェクトにアタッチされている[SampleInputManager]コンポーネントが担っています。
[SampleInputManager]コンポーネントの中で[AddDefaultCommands()](140行目あたり)というメソッドで処理が定義されています。
private void AddDefaultCommands() { // First batch of device-only commands if (suManager.QuerySceneFromDevice) { inputActions.Add(InputAction.Create("Update", KeyCode.None, "Displays the latest data.", async () => await SuManager.DisplayDataAsync())); inputActions.Add(InputAction.Create("Toggle Auto Refresh", KeyCode.None, "Turns automatic updates on or off", () => { SuManager.AutoRefresh = !SuManager.AutoRefresh; if (!SuManager.AutoRefresh) { SuManager.TimeElapsedSinceLastAutoRefresh = SuManager.AutoRefreshIntervalInSeconds; } })); } inputActions.Add(InputAction.Create("Toggle Scene Objects", KeyCode.Alpha1, "Show / hide processed scene objects", async () => { SuManager.RenderSceneObjects = !SuManager.RenderSceneObjects; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Toggle Labels", KeyCode.P, "Enable / Disable labels for scene objects", async () => { labeler.DisplayTextLabels = !labeler.DisplayTextLabels; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Scene Objects Quad", KeyCode.Alpha2, "Quad Mode", async () => { SuManager.SceneObjectRequestMode = RenderMode.Quad; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Scene Objects Mesh", KeyCode.Alpha3, "Mesh Mode", async () => { SuManager.SceneObjectRequestMode = RenderMode.Mesh; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Scene Objects Wireframe", KeyCode.Alpha4, "Wireframe Mode", async () => { SuManager.SceneObjectRequestMode = RenderMode.Wireframe; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Scene Objects Mask", KeyCode.None, "Mask Mode", async () => { SuManager.SceneObjectRequestMode = RenderMode.QuadWithMask; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Toggle Platforms", KeyCode.Alpha5, "Enable / Disable large horizontal surfaces", async () => { SuManager.RenderPlatformSceneObjects = !SuManager.RenderPlatformSceneObjects; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Toggle Background", KeyCode.Alpha6, "Enable / Disable background objects", async () => { SuManager.RenderBackgroundSceneObjects = !SuManager.RenderBackgroundSceneObjects; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Toggle Unknown", KeyCode.Alpha7, "Enable / Disable unknown objects", async () => { SuManager.RenderUnknownSceneObjects = !SuManager.RenderUnknownSceneObjects; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Toggle Inferred", KeyCode.Alpha8, "Enable / Disable completely inferred surfaces (requires refresh)", () => { SuManager.RequestInferredRegions = !SuManager.RequestInferredRegions; })); inputActions.Add(InputAction.Create("Toggle World", KeyCode.Alpha9, "Show or hide the world mesh", async () => { SuManager.RenderWorldMesh = !SuManager.RenderWorldMesh; await SuManager.DisplayDataAsync(); })); inputActions.Add(InputAction.Create("Mesh Coarse", KeyCode.None, "Low quality mesh", () => { SuManager.MeshQuality = SceneUnderstanding.SceneMeshLevelOfDetail.Coarse; })); inputActions.Add(InputAction.Create("Mesh Medium", KeyCode.None, "Medium quality mesh", () => { SuManager.MeshQuality = SceneUnderstanding.SceneMeshLevelOfDetail.Medium; })); inputActions.Add(InputAction.Create("Mesh Fine", KeyCode.None, "High quality mesh", () => { SuManager.MeshQuality = SceneUnderstanding.SceneMeshLevelOfDetail.Fine; })); inputActions.Add(InputAction.Create("Mesh Unlimited", KeyCode.None, "Unlimited quality mesh", () => { SuManager.MeshQuality = SceneUnderstanding.SceneMeshLevelOfDetail.Unlimited; })); inputActions.Add(InputAction.Create("Toggle MiniMap", KeyCode.M, "Show or hide the mini map", MiniMapToggle)); inputActions.Add(InputAction.Create("Toggle Ghost Mode", KeyCode.O, "Enable / Disable Ghost Mode (Scene Objects will be invisible but still occlude)", async () => { SuManager.IsInGhostMode = !SuManager.IsInGhostMode; await SuManager.DisplayDataAsync(); })); // Last batch of device-only commands if (suManager.QuerySceneFromDevice) { inputActions.Add(InputAction.Create("Increase Radius", KeyCode.None, "Increase the range used to query the environment", () => { float fTempFloat = SuManager.BoundingSphereRadiusInMeters + 5.0f; fTempFloat = Mathf.Clamp(fTempFloat, 5.0f, 100.0f); SuManager.BoundingSphereRadiusInMeters = fTempFloat; })); inputActions.Add(InputAction.Create("Decrease Radius", KeyCode.None, "Decrease the range used to query the environment", () => { float fTempFloat = SuManager.BoundingSphereRadiusInMeters - 5.0f; fTempFloat = Mathf.Clamp(fTempFloat, 5.0f, 100.0f); SuManager.BoundingSphereRadiusInMeters = fTempFloat; })); } inputActions.Add(InputAction.Create("Save Data", KeyCode.L, "Saves the current scene to storage", SaveData)); inputActions.Add(InputAction.Create("Toggle Help", KeyCode.H, "Shows or hides the help menu", menu.Toggle)); }
ここでは実行中に[SampleInputManager]コンポーネントのイベントである[inputAction]にデフォルトのイベントを追加しています。
〇ToggleSceneObject
[1]キーを入力することで発火するイベントです。
inputActions.Add(InputAction.Create("Toggle Scene Objects", KeyCode.Alpha1, "Show / hide processed scene objects", async () => { SuManager.RenderSceneObjects = !SuManager.RenderSceneObjects; await SuManager.DisplayDataAsync(); }));
ここではSuManager.RenderSceneObjectsのオンオフを切り替えています。
SuManagerとはSceneUnderstandingManagerコンポーネントに当たります。このRenderSceneObjectsのTrue・Falseを切り替えます。
[Header("Render Filters")] [Tooltip("Toggles display of all scene objects, except for the world mesh.")] public bool RenderSceneObjects = true;
これによりSceneUnderstandingManagerコンポーネントの533行目当たりの処理が実行されます。
// If requested, scene objects can be excluded from the generation, the World Mesh is considered // a separate object hence is not affected by this filter if (RenderSceneObjects == false && suObject.Kind != SceneUnderstanding.SceneObjectKind.World) { return false; }
ここはオブジェクトを作成する際に走るメソッドで、RenderSceneObjectsがfalseの場合SceneUnderstanding.SceneObject suObjectがfalseが返されます。
これによってメッシュが非表示になります。
〇Toggle Labels
[P]キーを入力することで壁や床、天井のラベル表示を切り替えます。
inputActions.Add(InputAction.Create("Toggle Labels", KeyCode.P, "Enable / Disable labels for scene objects", async () => { labeler.DisplayTextLabels = !labeler.DisplayTextLabels; await SuManager.DisplayDataAsync(); }));
ToggleSceneObject同様label.DysplayTextLabelsのオンオフが切り替えられています。
長くなってしまったので続きは次回行います。