Guest User

Untitled

a guest
Jul 21st, 2022
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.52 KB | None | 0 0
  1. using AC;
  2. using UnityEngine;
  3. using Rewired;
  4.  
  5. public enum ControlState
  6. {
  7.     DIRECT,
  8.     POINT_CLICK
  9. }
  10.  
  11. public class ControlSwitcher : MonoBehaviour
  12. {
  13.     Rewired.Player player;
  14.  
  15.     [SerializeField] private ControlState _state;
  16.     public ControlState State { get => _state; set => _state = value; }
  17.  
  18.     public BoxCollider2D[] SceneColliders;
  19.     public Animator Animator;
  20.     public bool Direct = false;
  21.     public float dirNormalized = 0f;
  22.  
  23.     public delegate void Delegate_OnSwitchControlType();
  24.     public static event Delegate_OnSwitchControlType OnSwitchToDirectControl;
  25.     public static event Delegate_OnSwitchControlType OnSwitchToPointAndClick;
  26.  
  27.  
  28.     private void Awake()
  29.     {
  30.         player = ReInput.players.GetPlayer(0);
  31.     }
  32.  
  33.     private void OnEnable()
  34.     {
  35.         EventManager.OnSetPlayer += UpdateSceneColliders;
  36.         EventManager.OnInitialiseScene += UpdateSceneColliders;
  37.  
  38.         EventManager.OnInitialiseScene += EventManager_OnInitialiseScene;
  39.         EventManager.OnAfterChangeScene += EventManager_OnAfterChangeScene;
  40.  
  41.         EventManager.OnEnterGameState += EventManager_OnEnterGameState;
  42.  
  43.         player.controllers.AddLastActiveControllerChangedDelegate(OnControllerChange);
  44.     }
  45.  
  46.     private void OnDisable()
  47.     {
  48.         EventManager.OnSetPlayer -= UpdateSceneColliders;
  49.         EventManager.OnInitialiseScene -= UpdateSceneColliders;
  50.        
  51.         EventManager.OnInitialiseScene -= EventManager_OnInitialiseScene;
  52.         EventManager.OnAfterChangeScene -= EventManager_OnAfterChangeScene;
  53.  
  54.         EventManager.OnEnterGameState -= EventManager_OnEnterGameState;
  55.  
  56.         player.controllers.RemoveLastActiveControllerChangedDelegate(OnControllerChange);
  57.     }
  58.  
  59.     private void EventManager_OnEnterGameState(GameState gameState)
  60.     {
  61.         if (gameState == GameState.Cutscene)
  62.         {
  63.             DisableColliders();
  64.         }
  65.         else if (gameState == GameState.Normal)
  66.         {
  67.             if (Direct)
  68.             {
  69.                 EnableColliders();
  70.             }
  71.             else
  72.             {
  73.                 DisableColliders();
  74.             }
  75.         }
  76.     }
  77.  
  78.     private void EventManager_OnInitialiseScene()
  79.     {
  80.         InputMethodSwitcher();
  81.     }
  82.  
  83.     private void EventManager_OnAfterChangeScene(LoadingGame loadingGame)
  84.     {
  85.         InputMethodSwitcher();
  86.     }
  87.  
  88.     private void InputMethodSwitcher()
  89.     {
  90.         Rewired.Controller controller = GameInputManager.instance.LastActiveController();
  91.  
  92.         if (controller != null)
  93.         {
  94.             if (controller is Joystick || controller is Keyboard)
  95.             {
  96.                 SwitchToDirect();
  97.             }
  98.             else if (controller is Mouse)
  99.             {
  100.                 SwitchToPointAndClick();
  101.             }
  102.         }
  103.     }
  104.  
  105.     void OnControllerChange(Rewired.Player player, Controller controller)
  106.     {
  107.         switch (controller.type)
  108.         {
  109.             case ControllerType.Joystick:
  110.             case ControllerType.Keyboard:
  111.                 SwitchToDirect();
  112.                 break;
  113.  
  114.             case ControllerType.Mouse:
  115.                 SwitchToPointAndClick();
  116.                 break;
  117.         }
  118.     }
  119.  
  120.     private void UpdateSceneColliders()
  121.     {
  122.         SceneColliders = GameObject.Find("_CollisionCubes").GetComponentsInChildren<BoxCollider2D>();
  123.     }
  124.  
  125.     private void UpdateSceneColliders(AC.Player p)
  126.     {
  127.         SceneColliders = GameObject.Find("_CollisionCubes").GetComponentsInChildren<BoxCollider2D>();
  128.     }
  129.  
  130.     // If playing in "Point and Click" mode disable all the wall colliders
  131.     // used when playing in "Direct" mode
  132.     private void DisableColliders()
  133.     {
  134.         for (int i = 0; i < SceneColliders.Length; i++)
  135.         {
  136.             SceneColliders[i].isTrigger = true;
  137.         }
  138.     }
  139.  
  140.     // If playing in "Direct" mode enable all the wall colliders
  141.     private void EnableColliders()
  142.     {
  143.         for (int i = 0; i < SceneColliders.Length; i++)
  144.         {
  145.             SceneColliders[i].isTrigger = false;
  146.         }
  147.     }
  148.  
  149.     private void SwitchToPointAndClick()
  150.     {
  151.         GlobalVariables.SetBooleanValue(0, false);
  152.         Animator.SetBool("DirectControl", false);
  153.  
  154.         DisableColliders();
  155.  
  156.         KickStarter.settingsManager.movementMethod = MovementMethod.PointAndClick;
  157.         KickStarter.settingsManager.hotspotDetection = HotspotDetection.MouseOver;
  158.         KickStarter.settingsManager.inputMethod = InputMethod.MouseAndKeyboard;
  159.  
  160.         Direct = false;
  161.         KickStarter.menuManager.keyboardControlWhenPaused = false;
  162.         KickStarter.playerCursor.ForceOffCursor = false;
  163.  
  164.         _state = ControlState.POINT_CLICK;
  165.         OnSwitchToPointAndClick?.Invoke();
  166.     }
  167.  
  168.     private void SwitchToDirect()
  169.     {
  170.         if (KickStarter.stateHandler.IsInGameplay()) KickStarter.player.Halt();
  171.  
  172.         GlobalVariables.SetBooleanValue(0, true);
  173.         Animator.SetBool("DirectControl", true);
  174.  
  175.         if (KickStarter.stateHandler.gameState != GameState.Cutscene) EnableColliders();
  176.  
  177.         KickStarter.settingsManager.movementMethod = MovementMethod.Direct;
  178.         KickStarter.settingsManager.hotspotDetection = HotspotDetection.PlayerVicinity;
  179.         KickStarter.settingsManager.inputMethod = InputMethod.KeyboardOrController;
  180.  
  181.         Direct = true;
  182.         KickStarter.menuManager.keyboardControlWhenPaused = true;
  183.         KickStarter.playerCursor.ForceOffCursor = true;
  184.  
  185.         _state = ControlState.DIRECT;
  186.         OnSwitchToDirectControl?.Invoke();
  187.     }
  188. }
  189.  
Advertisement
Add Comment
Please, Sign In to add comment