94 lines
3.1 KiB
C#
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;
|
|
|
|
}
|
|
} |