using System; using System.Collections.Generic; using UnityEngine; namespace MoleMole { public class CameraManager { private uint _mainCameraRuntimeID; private uint _inlevelCameraRuntimeID; private Dictionary _cameraDict; public bool controlledRotateKeepManual { get; set; } private CameraManager() { _cameraDict = new Dictionary(); _mainCameraRuntimeID = 0u; _inlevelCameraRuntimeID = 0u; } public void InitAtAwake() { } public void InitAtStart() { Singleton.Instance.CreateCamera(1u); Singleton.Instance.CreateCamera(2u); Singleton.Instance.GetMainCamera().gameObject.SetActive(false); Singleton.Instance.GetInLevelUICamera().gameObject.SetActive(false); } public uint CreateCamera(uint cameraType) { BaseMonoCamera baseMonoCamera = null; GameObject gameObject = UnityEngine.Object.Instantiate(Miscs.LoadResource(CameraData.GetPrefabResPath(cameraType))); baseMonoCamera = gameObject.GetComponent(); uint nextRuntimeID = Singleton.Instance.GetNextRuntimeID(2); RegisterCameraData(cameraType, baseMonoCamera, nextRuntimeID); switch (cameraType) { case 1u: ((MonoMainCamera)baseMonoCamera).Init(nextRuntimeID); break; case 2u: ((MonoInLevelUICamera)baseMonoCamera).Init(nextRuntimeID); break; default: throw new Exception("Invalid Type or State!"); } return baseMonoCamera.GetRuntimeID(); } public uint CreateCamera(uint cameraType, uint followEntityRuntimeID, uint followMode) { BaseMonoCamera baseMonoCamera = null; return baseMonoCamera.GetRuntimeID(); } public void RegisterCameraData(uint cameraType, BaseMonoCamera camera, uint runtimeID) { _cameraDict.Add(runtimeID, camera); switch (cameraType) { case 1u: _mainCameraRuntimeID = runtimeID; break; case 2u: _inlevelCameraRuntimeID = runtimeID; break; } } public void Core() { } public List GetAllCameras() { List list = new List(); list.AddRange(_cameraDict.Values); return list; } public BaseMonoCamera GetCameraByRuntimeID(uint runtimeID) { return _cameraDict[runtimeID]; } public MonoMainCamera GetMainCamera() { return (MonoMainCamera)_cameraDict[_mainCameraRuntimeID]; } public MonoInLevelUICamera GetInLevelUICamera() { return (MonoInLevelUICamera)_cameraDict[_inlevelCameraRuntimeID]; } public BaseMonoCamera GetCameraByFollowEntityRuntimeID(uint entityRuntimeID) { return Singleton.Instance.GetMainCamera(); } public bool RemoveCameraByRuntimeID(uint runtimeID) { Singleton.Instance.TryRemoveActor(runtimeID); UnityEngine.Object.Destroy(_cameraDict[runtimeID].gameObject); return _cameraDict.Remove(runtimeID); } public void RemoveAllCameras() { List list = new List(); foreach (KeyValuePair item in _cameraDict) { list.Add(item.Key); } foreach (uint item2 in list) { RemoveCameraByRuntimeID(item2); } } public void EnableBossCamera(uint targetId) { BaseMonoEntity monsterByRuntimeID = Singleton.Instance.GetMonsterByRuntimeID(targetId); if (monsterByRuntimeID != null) { MonoMainCamera mainCamera = Singleton.Instance.GetMainCamera(); mainCamera.followState.TransitBaseState(mainCamera.followState.followAvatarAndBossState); mainCamera.followState.followAvatarAndBossState.bossTarget = monsterByRuntimeID; if (!mainCamera.followState.isCameraLocateRatioUserDefined) { mainCamera.SetCameraLocateRatio(0.735f); } } } public void DisableBossCamera() { MonoMainCamera mainCamera = Singleton.Instance.GetMainCamera(); mainCamera.followState.TransitBaseState(mainCamera.followState.followAvatarState, true); if (!mainCamera.followState.isCameraLocateRatioUserDefined) { mainCamera.SetCameraLocateRatio(0.535f); } } public void EnableCrowdCamera() { MonoMainCamera mainCamera = Singleton.Instance.GetMainCamera(); mainCamera.followState.TransitBaseState(mainCamera.followState.followAvatarAndCrowdState); } public void DisableCrowdCamera() { MonoMainCamera mainCamera = Singleton.Instance.GetMainCamera(); mainCamera.followState.TransitBaseState(mainCamera.followState.followAvatarState, true); } } }