123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- /****************************************************************************
- * Copyright 2019 Nreal Techonology Limited. All rights reserved.
- *
- * This file is part of NRSDK.
- *
- * https://www.nreal.ai/
- *
- *****************************************************************************/
- namespace NRKernal
- {
- using UnityEngine;
- #if UNITY_EDITOR
- /// <summary> A controller for handling nr emulators. </summary>
- public class NREmulatorController : MonoBehaviour
- {
- /// <summary> regular speed. </summary>
- public float HeadMoveSpeed = 1.0f;
- /// <summary> How sensitive it with mouse. </summary>
- public float HeadRotateSpeed = 1.0f;
- /// <summary> The default controller panel. </summary>
- public GameObject DefaultControllerPanel;
- /// <summary> The image default. </summary>
- public GameObject ImageDefault;
- /// <summary> The image application. </summary>
- public GameObject ImageApp;
- /// <summary> The image confirm. </summary>
- public GameObject ImageConfirm;
- /// <summary> The image home. </summary>
- public GameObject ImageHome;
- /// <summary> The image left. </summary>
- public GameObject ImageLeft;
- /// <summary> The image right. </summary>
- public GameObject ImageRight;
- /// <summary> The image up. </summary>
- public GameObject ImageUp;
- /// <summary> The image down. </summary>
- public GameObject ImageDown;
- /// <summary> The width. </summary>
- private const int kWidth = 2;
- /// <summary> The height. </summary>
- private const int kHeight = 2;
- /// <summary> The touch action. </summary>
- private TouchActionState m_TouchAction;
- /// <summary> The touch action current frame. </summary>
- private int m_TouchActionCurFrame;
- /// <summary> Target for the. </summary>
- private GameObject m_Target;
- /// <summary> Values that represent touch action states. </summary>
- enum TouchActionState
- {
- /// <summary> An enum constant representing the idle option. </summary>
- Idle,
- /// <summary> An enum constant representing the left option. </summary>
- Left,
- /// <summary> An enum constant representing the right option. </summary>
- Right,
- /// <summary> An enum constant representing the up option. </summary>
- Up,
- /// <summary> An enum constant representing the down option. </summary>
- Down,
- };
- void Start()
- {
- DontDestroyOnLoad(this);
- m_Target = new GameObject("NREmulatorControllerTarget");
- m_Target.transform.rotation = Quaternion.identity;
- DontDestroyOnLoad(m_Target);
- }
- void LateUpdate()
- {
- UpdateControllerRotateByInput();
- if (NRInput.EmulateVirtualDisplayInEditor)
- {
- DefaultControllerPanel.SetActive(false);
- UpdateVirtualControllerButtons();
- }
- else
- {
- DefaultControllerPanel.SetActive(true);
- UpdateDefaultControllerButtons();
- }
- }
- private void UpdateDefaultControllerButtons()
- {
- if (Input.GetMouseButtonDown(0))
- {
- SetConfirmButton(true);
- ImageConfirm.SetActive(true);
- }
- if (Input.GetMouseButtonUp(0))
- {
- SetConfirmButton(false);
- ImageConfirm.SetActive(false);
- }
- if (Input.GetMouseButtonDown(1))
- {
- SetAppButton(true);
- ImageApp.SetActive(true);
- }
- if (Input.GetMouseButtonUp(1))
- {
- SetAppButton(false);
- ImageApp.SetActive(false);
- }
- if (Input.GetMouseButtonDown(2))
- {
- SetHomeButton(true);
- ImageHome.SetActive(true);
- }
- if (Input.GetMouseButtonUp(2))
- {
- SetHomeButton(false);
- ImageHome.SetActive(false);
- }
- if (m_TouchAction != TouchActionState.Idle)
- {
- UpdateTouchAction();
- }
- else
- {
- if (Input.GetKeyDown(KeyCode.LeftArrow))
- {
- ImageLeft.SetActive(true);
- m_TouchAction = TouchActionState.Left;
- }
- else if (Input.GetKeyDown(KeyCode.RightArrow))
- {
- ImageRight.SetActive(true);
- m_TouchAction = TouchActionState.Right;
- }
- else if (Input.GetKeyDown(KeyCode.UpArrow))
- {
- ImageUp.SetActive(true);
- m_TouchAction = TouchActionState.Up;
- }
- else if (Input.GetKeyDown(KeyCode.DownArrow))
- {
- ImageDown.SetActive(true);
- m_TouchAction = TouchActionState.Down;
- }
- else if (Input.GetKeyUp(KeyCode.DownArrow)
- | Input.GetKeyUp(KeyCode.UpArrow)
- | Input.GetKeyUp(KeyCode.RightArrow)
- | Input.GetKeyUp(KeyCode.LeftArrow))
- {
- EditorControllerProvider.SetControllerIsTouching(false);
- }
- }
- }
- private void UpdateVirtualControllerButtons()
- {
- EditorControllerProvider.SetControllerButtonState(ControllerButton.APP, 0);
- EditorControllerProvider.SetControllerButtonState(ControllerButton.HOME, 0);
- EditorControllerProvider.SetControllerButtonState(ControllerButton.TRIGGER, 0);
- EditorControllerProvider.SetControllerIsTouching(true);
- EditorControllerProvider.SetControllerTouchPoint(NRVirtualDisplayer.GetEmulatorScreenTouch().x, NRVirtualDisplayer.GetEmulatorScreenTouch().y);
- }
- private void UpdateTouchAction()
- {
- EditorControllerProvider.SetControllerIsTouching(true);
- const int kActionMaxFrame = 20;
- float touchx = 0;
- float touchy = 0;
- if (m_TouchAction == TouchActionState.Left)
- {
- touchy = kHeight / 2;
- touchx = 0.1f * kWidth + ((float)(kActionMaxFrame - m_TouchActionCurFrame) / kActionMaxFrame) * (0.8f * kWidth);
- }
- else if (m_TouchAction == TouchActionState.Right)
- {
- touchy = kHeight / 2;
- touchx = 0.1f * kWidth + ((float)m_TouchActionCurFrame / kActionMaxFrame) * (0.8f * kWidth);
- }
- else if (m_TouchAction == TouchActionState.Up)
- {
- touchx = kWidth / 2;
- touchy = 0.1f * kHeight + ((float)(kActionMaxFrame - m_TouchActionCurFrame) / kActionMaxFrame) * (0.8f * kHeight);
- }
- else if (m_TouchAction == TouchActionState.Down)
- {
- touchx = kWidth / 2;
- touchy = 0.1f * kHeight + ((float)m_TouchActionCurFrame / kActionMaxFrame) * (0.8f * kHeight);
- }
- EditorControllerProvider.SetControllerTouchPoint(touchx - 1f, touchy - 1f);
- if (m_TouchActionCurFrame == kActionMaxFrame)
- {
- m_TouchActionCurFrame = 0;
- m_TouchAction = TouchActionState.Idle;
- ImageLeft.SetActive(false);
- ImageRight.SetActive(false);
- ImageUp.SetActive(false);
- ImageDown.SetActive(false);
- }
- m_TouchActionCurFrame++;
- }
- private void UpdateControllerRotateByInput()
- {
- if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
- {
- float mouse_x = Input.GetAxis("Mouse X") * HeadRotateSpeed;
- float mouse_y = Input.GetAxis("Mouse Y") * HeadRotateSpeed;
- Quaternion q = Quaternion.Euler(-mouse_y, mouse_x, 0);
- m_Target.transform.rotation = m_Target.transform.rotation * q;
- }
- EditorControllerProvider.SetControllerRotation(m_Target.transform.rotation);
- }
- /// <summary> Sets application button. </summary>
- /// <param name="touch"> True to touch.</param>
- public void SetAppButton(bool touch)
- {
- if (touch)
- {
- EditorControllerProvider.SetControllerTouchPoint(0f, 0f);
- EditorControllerProvider.SetControllerIsTouching(true);
- EditorControllerProvider.SetControllerButtonState(ControllerButton.APP, 1);
- }
- else
- {
- EditorControllerProvider.SetControllerButtonState(ControllerButton.APP, 0);
- EditorControllerProvider.SetControllerIsTouching(false);
- }
- }
- /// <summary> Sets home button. </summary>
- /// <param name="touch"> True to touch.</param>
- public void SetHomeButton(bool touch)
- {
- if (touch)
- {
- EditorControllerProvider.SetControllerTouchPoint(0f, 0f);
- EditorControllerProvider.SetControllerIsTouching(true);
- EditorControllerProvider.SetControllerButtonState(ControllerButton.HOME, 1);
- }
- else
- {
- EditorControllerProvider.SetControllerButtonState(ControllerButton.HOME, 0);
- EditorControllerProvider.SetControllerIsTouching(false);
- }
- }
- /// <summary> Sets confirm button. </summary>
- /// <param name="touch"> True to touch.</param>
- public void SetConfirmButton(bool touch)
- {
- if (touch)
- {
- EditorControllerProvider.SetControllerTouchPoint(0f, 0f);
- EditorControllerProvider.SetControllerIsTouching(true);
- EditorControllerProvider.SetControllerButtonState(ControllerButton.TRIGGER, 1);
- }
- else
- {
- EditorControllerProvider.SetControllerButtonState(ControllerButton.TRIGGER, 0);
- EditorControllerProvider.SetControllerIsTouching(false);
- }
- }
- }
- #endif
- }
|