using System; using System.Collections; using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.InputSystem; // ReSharper disable once CheckNamespace namespace BlueWaterProject { [DefaultExecutionOrder(-1)] public class GameManager : Singleton { // 섬 안의 플레이어 모드 선택 [field: Title("InIsland Data")] [field: SerializeField] public GlobalValue.InIslandPlayerMode IslandPlayerMode { get; private set; } [field: Required("Viking Prefab을 넣어주세요.")] [field: SerializeField] public GameObject InIslandPlayerPrefab { get; private set; } [field: SerializeField] public List CrewmatePrefabList { get; private set; } [field: SerializeField] public List CurrentCrewmateList { get; set; } public IInIslandPlayer CurrentInIslandPlayer { get; set; } // Player [field: Title("Player")] [field: SerializeField] public ShipPlayer ShipPlayer { get; private set; } [field: SerializeField] public InShipPlayer InShipPlayer { get; private set; } // Game Data [Title("Game Data")] [Range(0f, 1f)] [SerializeField] private float slowSpeed = 0.1f; private const string IN_ISLAND_PLAYER_NAME = "InIslandPlayer"; // Game State [field: Title("Game State")] [field: SerializeField] public bool IsInShipMode { get; set; } [field: SerializeField] public bool IsDredgeMode { get; set; } [field: SerializeField] public bool IsTakeAim { get; set; } [field: SerializeField] public bool IsShipDeckMode { get; set; } [field: SerializeField] public bool IsConversation { get; set; } [field: SerializeField] public bool IsInteraction { get; set; } [field: SerializeField] public GlobalValue.PlayerMode CurrentPlayerMode { get; set; } private void Init() { ShipPlayer = FindAnyObjectByType(); InShipPlayer = FindAnyObjectByType(); } protected override void OnAwake() { Init(); } private void Start() { Cursor.lockState = CursorLockMode.Confined; } public IEnumerator ApplySlowMotion(float targetTimeScale, float duration) { var startScale = Time.timeScale; var time = 0f; while (time < duration) { Time.timeScale = Mathf.Lerp(startScale, targetTimeScale, time / duration); Time.fixedDeltaTime = 0.02f * Time.timeScale; time += Time.unscaledDeltaTime; yield return null; } Time.timeScale = targetTimeScale; } public void SlowSpeedMode() { Time.timeScale = slowSpeed; Time.fixedDeltaTime = 0.02f * Time.timeScale; } public void DefaultSpeedMode() { Time.timeScale = 1f; Time.fixedDeltaTime = 0.02f; } public void SetCurrentInIslandPlayer(IInIslandPlayer inIslandPlayer) { PlayerInput currentPlayerInput; if (CurrentInIslandPlayer != null) { currentPlayerInput = CurrentInIslandPlayer.Transform.GetComponent(); if (currentPlayerInput != null) { currentPlayerInput.enabled = false; } } CurrentInIslandPlayer = inIslandPlayer; InIslandCamera.Inst.SetTarget(inIslandPlayer.Transform); currentPlayerInput = CurrentInIslandPlayer.Transform.GetComponent(); if (currentPlayerInput != null) { currentPlayerInput.enabled = true; } } #region Player Mode State switch public void SwitchDredgeMode(bool isOn) { if (isOn) { SwitchTakeAim(false); SwitchInShipMode(false); SwitchShipDeckMode(false); CameraManager.Inst.CamDredgeMode(); IsDredgeMode = true; CurrentPlayerMode = GlobalValue.PlayerMode.DREDGE; } else if (IsDredgeMode) { IsDredgeMode = false; } } public void SwitchShipDeckMode(bool isOn) { if (isOn) { SwitchTakeAim(false); SwitchInShipMode(false); SwitchDredgeMode(false); CameraManager.Inst.CamShipDeckMode(); IsShipDeckMode = true; CurrentPlayerMode = GlobalValue.PlayerMode.IN_DECK; } else if (IsShipDeckMode) { CameraManager.Inst.CamDredgeMode(); IsInShipMode = false; } } public void SwitchTakeAim(bool isOn) { if (isOn) { SwitchInShipMode(false); SwitchShipDeckMode(false); SwitchDredgeMode(false); CameraManager.Inst.CamTakeAim(true); Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; IsTakeAim = true; CurrentPlayerMode = GlobalValue.PlayerMode.TAKE_AIM; } else if (IsTakeAim) { CameraManager.Inst.CamTakeAim(false); Cursor.visible = true; Cursor.lockState = CursorLockMode.Confined; IsTakeAim = false; } UiManager.Inst.AimOnOff(isOn); } public void SwitchInShipMode(bool isOn) { if (isOn) { SwitchTakeAim(false); SwitchShipDeckMode(false); SwitchDredgeMode(false); CameraManager.Inst.CamInShipMode(); IsInShipMode = true; CurrentPlayerMode = GlobalValue.PlayerMode.IN_SHIP; InShipPlayer.ProximitySelector.enabled = true; } else if (IsInShipMode) { CameraManager.Inst.CamDredgeMode(); IsInShipMode = false; InShipPlayer.ProximitySelector.enabled = false; } } #endregion } }