Last active
November 4, 2019 18:29
-
-
Save nkjzm/628fb02260bc60597584679beafb2c5e to your computer and use it in GitHub Desktop.
VRアプリ向けになっているEventSystemをEditor上からも操作できる形に組み替えるデバッグ用スクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Linq; | |
using System.Threading.Tasks; | |
using UnityEditor; | |
using UnityEngine; | |
using UnityEngine.EventSystems; | |
using UnityEngine.SceneManagement; | |
using UnityEngine.UI; | |
/// <summary> | |
/// エディタ上でのアプリ起動時に自動実行されるデバッグ用スクリプト | |
/// VRアプリ向けになっているEventSystemをEditor上からも操作できる形に組み替える | |
/// </summary> | |
public class ReplaceEventSystems | |
{ | |
const float InitialHeight = 1.6f; | |
/// <summary> 初期化メソッド </summary> | |
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] | |
static void Init() | |
{ | |
// VR用シーンでなさそうならreturn | |
if (GameObject.FindObjectOfType<OVRCameraRig>() == null) { return; } | |
Replace(); | |
// [①/②]のどちらかをコメントアウトして使ってください | |
// ① 毎秒監視したい場合 | |
ReplaceAsync(); | |
// ② シーン初期値のみの呼び出しで良い場合 | |
// SceneManager.sceneLoaded += OnSceneLoaded; | |
} | |
/// <summary> シーン読み込み完了時に呼び出されるメソッド </summary> | |
static void OnSceneLoaded(Scene scene, LoadSceneMode mode) | |
{ | |
Replace(); | |
} | |
/// <summary> シーン上のVR向け設定を変換するメソッド </summary> | |
static void Replace() | |
{ | |
// カメラ位置の調整 | |
var ovrManager = GameObject.FindObjectOfType<OVRManager>(); | |
if (ovrManager != null && ovrManager.trackingOriginType == OVRManager.TrackingOrigin.FloorLevel) | |
{ | |
Camera.main.transform.position += Vector3.up * InitialHeight; | |
} | |
// カメラにキーボード操作用コンポーネントを追加(必要なければ消してください) | |
// Camera.main.gameObject.AddComponent<EditorCamera>(); | |
ReplaceEventSystem(); | |
} | |
/// <summary> EventSystemに関するシーン上のVR向け設定を変換するメソッド </summary> | |
static void ReplaceEventSystem() | |
{ | |
// OVRInputModuleを無効 かつ StandaloneInputModuleを有効に | |
var eventSystem = GameObject.FindObjectOfType<EventSystem>(); | |
if (eventSystem.GetComponent<StandaloneInputModule>() == null) | |
{ | |
eventSystem.GetComponent<OVRInputModule>().enabled = false; | |
eventSystem.gameObject.AddComponent<StandaloneInputModule>(); | |
Debug.Log("変換成功: OVRInputModule -> StandaloneInputModule"); | |
} | |
// Project中の全Canvasコンポーネントの中からAssets以下でないもの(=Hierarchy上のもの)を全て習得 | |
var canvases = Resources.FindObjectsOfTypeAll<Canvas>() | |
.Where(c => AssetDatabase.GetAssetOrScenePath(c).Contains(".unity")).ToArray(); | |
// GraphicRaycasterがあれば有効に、なければ追加 | |
// OVRRaycasterは競合しないので特にdisableにしていない | |
foreach (var canvas in canvases) | |
{ | |
var raycasters = canvas.gameObject.GetComponents<GraphicRaycaster>().ToList(); | |
if (raycasters.Exists(r => r.GetType() == typeof(GraphicRaycaster))) | |
{ | |
raycasters.ForEach(r => r.enabled = true); | |
} | |
else | |
{ | |
canvas.gameObject.AddComponent<GraphicRaycaster>(); | |
Debug.Log($"変換成功: GraphicRaycaster added to {canvas.name}"); | |
} | |
} | |
} | |
/// <summary> 非同期でシーン上を監視する変換メソッド </summary> | |
static async Task ReplaceAsync() | |
{ | |
// アプリが実行中のみループ | |
while (Application.isPlaying) | |
{ | |
ReplaceEventSystem(); | |
// 1秒に1回実行する | |
await Task.Delay(1000); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment