using Code.Infrastructure.Camera; using Code.Infrastructure.Camera.CameraStates; using Cysharp.Threading.Tasks; using UnityEngine; namespace Code.Game.Gameplay.Player { [Infrastructure.Generators.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 + _offset; Context.cameraLoadedData.Camera.transform.rotation = Quaternion.Euler(_rotationOffset); } private Transform _target; private Vector3 _offset = new(0f, 4.3f, -6f); private Vector3 _rotationOffset = new(30f, 0, 0); private float _smoothTime = 0.15f; private Vector3 _velocity; private int _cameraZoneMask = LayerMask.GetMask("CameraZone"); public OpenMovementCameraState(CameraStateMachineContext context) : base(context) { } public override CameraMode MyState => CameraMode.OpenMovement; public override UniTask EnterState() { return UniTask.CompletedTask; } public override UniTask ExitState() { return UniTask.CompletedTask; } public override void Update() { } private const float ZoneSearchRadius = 0.5f; private static readonly Collider[] _zoneBuffer = new Collider[8]; public override void LateUpdate() { if (_target is null) return; var camTransform = Context.cameraLoadedData.Camera.transform; var desired = _target.position + _offset; var smoothed = Vector3.SmoothDamp( camTransform.position, desired, ref _velocity, _smoothTime); int count = Physics.OverlapSphereNonAlloc( camTransform.position, ZoneSearchRadius, _zoneBuffer, _cameraZoneMask, QueryTriggerInteraction.Collide); if (count == 0) { if (Physics.CheckSphere(smoothed, 0.01f, _cameraZoneMask, QueryTriggerInteraction.Collide)) camTransform.position = smoothed; return; } var best = camTransform.position; var bestSqr = float.MaxValue; for (int i = 0; i < count; i++) { var p = _zoneBuffer[i].ClosestPoint(smoothed); var sqr = (p - smoothed).sqrMagnitude; if (sqr < bestSqr) { bestSqr = sqr; best = p; } } camTransform.position = best; } // if (_target is null) return; // // var camTransform = Context.cameraLoadedData.Camera.transform; // // var camTargetPosition = _target.position + _offset; // // if (Physics.CheckSphere(camTargetPosition, 0.01f, _cameraZoneMask)) // camTransform.position = camTargetPosition; } }