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 int _cameraZoneMask = LayerMask.GetMask("CameraZone"); public OpenMovementCameraState(CameraStateMachineContext context) : base(context) { } public override CameraMode MyState => CameraMode.OpenMovement; public override UniTask EnterState() { Context.cameraLoadedData.Camera.transform.localRotation = Quaternion.Euler(_rotationOffset); return UniTask.CompletedTask; } public override UniTask ExitState() { return UniTask.CompletedTask; } public override void Update() { } private const float ZoneSearchRadius = 0.05f; 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; int count = Physics.OverlapSphereNonAlloc( camTransform.position, ZoneSearchRadius, _zoneBuffer, _cameraZoneMask, QueryTriggerInteraction.Collide); if (count == 0) { if (Physics.CheckSphere(desired, 0.01f, _cameraZoneMask, QueryTriggerInteraction.Collide)) camTransform.position = desired; return; } var best = camTransform.position; var bestSqr = float.MaxValue; for (int i = 0; i < count; i++) { var p = _zoneBuffer[i].ClosestPoint(desired); var sqr = (p - desired).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; } }