using System; using Code.Infrastructure.Camera; using Code.Infrastructure.Camera.CameraStates; using Code.Infrastructure.Generators; using Code.Infrastructure.Input; using Cysharp.Threading.Tasks; using R3; using UnityEngine; using UnityEngine.InputSystem; namespace Code.Game.Gameplay.Player { [State(typeof(CameraMode),typeof(CameraStateMachineContext), ManualInherit = true)] public partial class OpenMovementCameraState : BaseCameraState { public void SetTarget(Transform target) { _target = target; Context.cameraLoadedData.Camera.transform.position = _target.position; Context.cameraLoadedData.Camera.transform.rotation = _target.rotation; } private IDisposable _disposable; public void SetPlayer(PlayerMovementController playerMovementController) { } private Transform _target; private Vector2 _mouseDelta; private Vector2 _rotation = Vector2.zero; private float _sensitivityX = 0.1f; private float _sensitivityY = 0.1f; private float _slideStupidity = 1f; private bool _isSliding; public OpenMovementCameraState(CameraStateMachineContext context) : base(context) { } public override CameraMode MyState => CameraMode.OpenMovement; public override UniTask EnterState() { return UniTask.CompletedTask; } public override UniTask ExitState() { _disposable.Dispose(); return UniTask.CompletedTask; } public override void Update() { } public override void LateUpdate() { if (_target is null) return; var camTransform = Context.cameraLoadedData.Camera.transform; camTransform.position = _target.position; var mouseDeltaX = _mouseDelta.x * _sensitivityX; var mouseDeltaY = _mouseDelta.y * _sensitivityY; if (_isSliding) { mouseDeltaX = Mathf.Clamp(mouseDeltaX, -_slideStupidity, _slideStupidity); mouseDeltaY = Mathf.Clamp(mouseDeltaY, -_slideStupidity, _slideStupidity); } _rotation.x += mouseDeltaX; _rotation.y -= mouseDeltaY; _rotation.y = Mathf.Clamp(_rotation.y, -90f, 90f); camTransform.localRotation = Quaternion.Euler(_rotation.y, _rotation.x, 0f); } } }