Skip to content

Instantly share code, notes, and snippets.

@nkjzm
Last active November 4, 2019 18:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nkjzm/628fb02260bc60597584679beafb2c5e to your computer and use it in GitHub Desktop.
Save nkjzm/628fb02260bc60597584679beafb2c5e to your computer and use it in GitHub Desktop.
VRアプリ向けになっているEventSystemをEditor上からも操作できる形に組み替えるデバッグ用スクリプト
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