191 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			191 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								namespace SRDebugger.Services.Implementation
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    using System;
							 | 
						|||
| 
								 | 
							
								    using Internal;
							 | 
						|||
| 
								 | 
							
								    using SRF;
							 | 
						|||
| 
								 | 
							
								    using SRF.Service;
							 | 
						|||
| 
								 | 
							
								    using UI.Other;
							 | 
						|||
| 
								 | 
							
								    using UnityEngine;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    [Service(typeof (IDebugTriggerService))]
							 | 
						|||
| 
								 | 
							
								    public class DebugTriggerImpl : SRServiceBase<IDebugTriggerService>, IDebugTriggerService
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private PinAlignment _position;
							 | 
						|||
| 
								 | 
							
								        private TriggerRoot _trigger;
							 | 
						|||
| 
								 | 
							
								        private IConsoleService _consoleService;
							 | 
						|||
| 
								 | 
							
								        public bool IsEnabled
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get { return _trigger != null && _trigger.CachedGameObject.activeSelf; }
							 | 
						|||
| 
								 | 
							
								            set
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // Create trigger if it does not yet exist
							 | 
						|||
| 
								 | 
							
								                if (value && _trigger == null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    CreateTrigger();
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                if (_trigger != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    _trigger.CachedGameObject.SetActive(value);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public PinAlignment Position
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get { return _position; }
							 | 
						|||
| 
								 | 
							
								            set
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (_trigger != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    SetTriggerPosition(_trigger.TriggerTransform, value);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                _position = value;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        protected override void Awake()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            base.Awake();
							 | 
						|||
| 
								 | 
							
								            DontDestroyOnLoad(CachedGameObject);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            CachedTransform.SetParent(Hierarchy.Get("SRDebugger"), true);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            name = "Trigger";
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void OnError(IConsoleService console)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (_trigger != null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _trigger.ErrorNotifier.ShowErrorWarning();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private void CreateTrigger()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var prefab = Resources.Load<TriggerRoot>(SRDebugPaths.TriggerPrefabPath);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (prefab == null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                Debug.LogError("[SRDebugger] Error loading trigger prefab");
							 | 
						|||
| 
								 | 
							
								                return;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            _trigger = SRInstantiate.Instantiate(prefab);
							 | 
						|||
| 
								 | 
							
								            _trigger.CachedTransform.SetParent(CachedTransform, true);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            SetTriggerPosition(_trigger.TriggerTransform, _position);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            switch (Settings.Instance.TriggerBehaviour)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                case Settings.TriggerBehaviours.TripleTap:
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    _trigger.TripleTapButton.onClick.AddListener(OnTriggerButtonClick);
							 | 
						|||
| 
								 | 
							
								                    _trigger.TapHoldButton.gameObject.SetActive(false);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    break;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                case Settings.TriggerBehaviours.TapAndHold:
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    _trigger.TapHoldButton.onLongPress.AddListener(OnTriggerButtonClick);
							 | 
						|||
| 
								 | 
							
								                    _trigger.TripleTapButton.gameObject.SetActive(false);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    break;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                case Settings.TriggerBehaviours.DoubleTap:
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    _trigger.TripleTapButton.RequiredTapCount = 2;
							 | 
						|||
| 
								 | 
							
								                    _trigger.TripleTapButton.onClick.AddListener(OnTriggerButtonClick);
							 | 
						|||
| 
								 | 
							
								                    _trigger.TapHoldButton.gameObject.SetActive(false);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    break;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                default:
							 | 
						|||
| 
								 | 
							
								                    throw new Exception("Unhandled TriggerBehaviour");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            
							 | 
						|||
| 
								 | 
							
								            SRDebuggerUtil.EnsureEventSystemExists();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            UnityEngine.SceneManagement.SceneManager.activeSceneChanged += OnActiveSceneChanged;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (Settings.Instance.ErrorNotification)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _consoleService = SRServiceManager.GetService<IConsoleService>();
							 | 
						|||
| 
								 | 
							
								                _consoleService.Error += OnError;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        protected override void OnDestroy()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            UnityEngine.SceneManagement.SceneManager.activeSceneChanged -= OnActiveSceneChanged;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (_consoleService != null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                _consoleService.Error -= OnError;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            base.OnDestroy();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        private static void OnActiveSceneChanged(UnityEngine.SceneManagement.Scene s1, UnityEngine.SceneManagement.Scene s2)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            SRDebuggerUtil.EnsureEventSystemExists();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        
							 | 
						|||
| 
								 | 
							
								        private void OnTriggerButtonClick()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (_trigger.ErrorNotifier.IsVisible)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // Open into console if there is an error.
							 | 
						|||
| 
								 | 
							
								                SRDebug.Instance.ShowDebugPanel(DefaultTabs.Console);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                SRDebug.Instance.ShowDebugPanel();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static void SetTriggerPosition(RectTransform t, PinAlignment position)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var pivotX = 0f;
							 | 
						|||
| 
								 | 
							
								            var pivotY = 0f;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            var posX = 0f;
							 | 
						|||
| 
								 | 
							
								            var posY = 0f;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (position == PinAlignment.TopLeft || position == PinAlignment.TopRight || position == PinAlignment.TopCenter)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                pivotY = 1f;
							 | 
						|||
| 
								 | 
							
								                posY = 1f;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else if (position == PinAlignment.BottomLeft || position == PinAlignment.BottomRight || position == PinAlignment.BottomCenter)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                pivotY = 0f;
							 | 
						|||
| 
								 | 
							
								                posY = 0f;
							 | 
						|||
| 
								 | 
							
								            } else if (position == PinAlignment.CenterLeft || position == PinAlignment.CenterRight)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                pivotY = 0.5f;
							 | 
						|||
| 
								 | 
							
								                posY = 0.5f;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (position == PinAlignment.TopLeft || position == PinAlignment.BottomLeft || position == PinAlignment.CenterLeft)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                pivotX = 0f;
							 | 
						|||
| 
								 | 
							
								                posX = 0f;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else if (position == PinAlignment.TopRight || position == PinAlignment.BottomRight || position == PinAlignment.CenterRight)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                pivotX = 1f;
							 | 
						|||
| 
								 | 
							
								                posX = 1f;
							 | 
						|||
| 
								 | 
							
								            } else if (position == PinAlignment.TopCenter || position == PinAlignment.BottomCenter)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                pivotX = 0.5f;
							 | 
						|||
| 
								 | 
							
								                posX = 0.5f;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            t.pivot = new Vector2(pivotX, pivotY);
							 | 
						|||
| 
								 | 
							
								            t.anchorMax = t.anchorMin = new Vector2(posX, posY);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |