Files
Hasebe/Assets/Code/OfficeGame/Player/OpenMovementCameraState.cs
T
2026-09-25 00:42:08 +03:00

94 lines
3.1 KiB
C#

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;
}
}