using System; using BITKit.Entities.Player; using BITKit.PlayerCamera; using Cinemachine; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Interactions; namespace BITKit.Entities { [CustomType(typeof(IPlayerCameraService))] public class EntityCamera : EntityPlayerBehavior, IPlayerCameraService { [Header(Constant.Header.Components)] [SerializeField] private CinemachineVirtualCameraBase aliveCamera; [SerializeField] private CinemachineVirtualCameraBase deathCamera; [Header(Constant.Header.Reference)] [SerializeReference, SubclassSelector] public IReference _onSetAlive; private readonly ValidHandle _cameraActivatedHandle = new(); public override void OnAwake() { var heal = UnityEntity.Get(); heal.OnSetAlive += OnSetAlive; _cameraActivatedHandle.AddListener(x => { WorldCameraManager.IsCameraActivated = x; IsCameraActivated = x; OnCameraActivated?.Invoke(x); }); } public override void OnStart() { base.OnStart(); _cameraActivatedHandle.Invoke(); } public override void OnUpdate(float deltaTime) { if (WorldCameraManager.ActiveCamera is null) return; base.OnUpdate(deltaTime); _cameraActivatedHandle.SetElements(this, (CinemachineVirtualCameraBase)WorldCameraManager.ActiveCamera == aliveCamera); CameraRotation = WorldCameraManager.ActiveCamera.State.RawOrientation; CameraPosition = WorldCameraManager.ActiveCamera.State.RawPosition; } private void OnSetAlive(bool alive) { aliveCamera.enabled = alive; deathCamera.enabled = alive is false; } public bool IsCameraActivated { get; private set; } public event Action OnCameraActivated; public Quaternion CameraRotation { get; private set; } public Vector3 CameraPosition { get; private set; } } }