FirstPerson Camera
This commit is contained in:
1 parent
f0bb83c869
commit
ee8bd4799a
10 files changed
+38
-151
No files matched your search
@@ -1,15 +0,0 @@
|
||||
using TinyGoose.Tremble;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Code.Game.OfficeGame.Location
|
||||
{
|
||||
[BrushEntity(type: BrushType.Trigger)]
|
||||
public class LocationCameraTrigger : MonoBehaviour, IOnImportFromMapEntity
|
||||
{
|
||||
private int _id;
|
||||
public void OnImportFromMapEntity(MapBsp mapBsp, BspEntity entity)
|
||||
{
|
||||
gameObject.layer = LayerMask.NameToLayer("CameraZone");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8664bf69f30d4f558a6ab68b65c0ab8f
|
||||
timeCreated: 1790280158
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 630e34c01f57474894fcdb9490d516d9
|
||||
timeCreated: 1790332570
|
||||
@@ -1,14 +0,0 @@
|
||||
using TinyGoose.Tremble;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Code.Game.OfficeGame.Location
|
||||
{
|
||||
[PointEntity(category: "Utility", trenchBroomName: "LocationTransitionPoint")]
|
||||
public class LocationTransitionPoint : MonoBehaviour
|
||||
{
|
||||
public LocationIDs locationID;
|
||||
[NoTremble] [DoNotSerialize]
|
||||
public LocationIDs selfLocationID;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d3fe671e3d374beb9c03247bc7252cf3
|
||||
timeCreated: 1790332908
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 91456def45ba47a7bb82f0b9f97a6101
|
||||
timeCreated: 1790335988
|
||||
@@ -1,62 +0,0 @@
|
||||
using Code.Infrastructure.Camera;
|
||||
using Code.Infrastructure.Camera.CameraStates;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using LitMotion;
|
||||
using LitMotion.Extensions;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Code.OfficeGame.Player
|
||||
{
|
||||
[Infrastructure.Generators.State(typeof(CameraMode), typeof(CameraStateMachineContext), ManualInherit = true)]
|
||||
public partial class LocationTransitionState : BaseCameraState
|
||||
{
|
||||
public void SetTarget(Transform target)
|
||||
{
|
||||
_target = target;
|
||||
Context.cameraLoadedData.Camera.transform.position = _target.position;
|
||||
Context.cameraLoadedData.Camera.transform.rotation = _target.rotation;
|
||||
}
|
||||
|
||||
private Transform _target;
|
||||
private float _smoothTime = 0.15f;
|
||||
private Vector3 _velocity;
|
||||
|
||||
public LocationTransitionState(CameraStateMachineContext context) : base(context)
|
||||
{
|
||||
}
|
||||
|
||||
public override CameraMode MyState => CameraMode.LocationTransition;
|
||||
|
||||
public override UniTask EnterState()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override async UniTask ExitState()
|
||||
{
|
||||
await UniTask.WaitUntil(() => _target);
|
||||
|
||||
var taskPosition = LMotion
|
||||
.Create(Context.cameraLoadedData.Camera.transform.position, _target.position, 0.5f)
|
||||
.BindToPosition(Context.cameraLoadedData.Camera.transform)
|
||||
.ToUniTask();
|
||||
|
||||
var taskRotation = LMotion
|
||||
.Create(Context.cameraLoadedData.Camera.transform.rotation, _target.rotation, 0.5f)
|
||||
.BindToRotation(Context.cameraLoadedData.Camera.transform)
|
||||
.ToUniTask();
|
||||
|
||||
await UniTask.WhenAll(taskPosition, taskRotation);
|
||||
|
||||
_target = null;
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
}
|
||||
|
||||
public override void LateUpdate()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed824cfd1fc54e00bc51298e87d21197
|
||||
timeCreated: 1790339775
|
||||
@@ -1,38 +1,55 @@
|
||||
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
|
||||
{
|
||||
[Infrastructure.Generators.State(typeof(CameraMode), typeof(CameraStateMachineContext), ManualInherit = true)]
|
||||
public partial class OpenMovementCameraState : BaseCameraState
|
||||
[State(typeof(CameraMode),typeof(CameraStateMachineContext), ManualInherit = true)]
|
||||
public partial class CleanerCameraState : BaseCameraState
|
||||
{
|
||||
public void SetTarget(Transform target)
|
||||
{
|
||||
_target = target;
|
||||
Context.cameraLoadedData.Camera.transform.position = _target.position + _offset;
|
||||
Context.cameraLoadedData.Camera.transform.rotation = Quaternion.Euler(_rotationOffset);
|
||||
Context.cameraLoadedData.Camera.transform.position = _target.position;
|
||||
Context.cameraLoadedData.Camera.transform.rotation = _target.rotation;
|
||||
}
|
||||
|
||||
|
||||
private Transform _target;
|
||||
private Vector3 _offset = new(0f, 3.5f, -6f);
|
||||
private Vector3 _rotationOffset = new(30f, 0, 0);
|
||||
private int _cameraZoneMask = LayerMask.GetMask("CameraZone");
|
||||
private Vector2 _mouseDelta;
|
||||
private Vector2 _rotation = Vector2.zero;
|
||||
|
||||
public OpenMovementCameraState(CameraStateMachineContext context) : base(context)
|
||||
private float _sensitivityX = 0.1f;
|
||||
private float _sensitivityY = 0.1f;
|
||||
private float _slideStupidity = 1f;
|
||||
private bool _isSliding;
|
||||
|
||||
public CleanerCameraState(CameraStateMachineContext context) : base(context)
|
||||
{
|
||||
}
|
||||
|
||||
private void LookCancelled(InputAction.CallbackContext obj) => _mouseDelta = Vector2.zero;
|
||||
private void LookPerformed(InputAction.CallbackContext obj) => _mouseDelta = obj.ReadValue<Vector2>();
|
||||
|
||||
public override CameraMode MyState => CameraMode.OpenMovement;
|
||||
|
||||
public override UniTask EnterState()
|
||||
{
|
||||
Context.InputService.BindActionPerformed((int)ActionMappings.OpenMovement, (int)OpenMovementActions.Watchment, LookPerformed);
|
||||
Context.InputService.BindActionCancelled((int)ActionMappings.OpenMovement, (int)OpenMovementActions.Watchment, LookCancelled);
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public override UniTask ExitState()
|
||||
{
|
||||
Context.InputService.UnbindActionPerformed((int)ActionMappings.OpenMovement, (int)OpenMovementActions.Watchment, LookPerformed);
|
||||
Context.InputService.UnbindActionCancelled((int)ActionMappings.OpenMovement, (int)OpenMovementActions.Watchment, LookCancelled);
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
@@ -40,53 +57,29 @@ namespace Code.Game.Gameplay.Player
|
||||
{
|
||||
}
|
||||
|
||||
private const float ZoneSearchRadius = 3f;
|
||||
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);
|
||||
camTransform.position = _target.position;
|
||||
|
||||
if (count == 0)
|
||||
var mouseDeltaX = _mouseDelta.x * _sensitivityX;
|
||||
var mouseDeltaY = _mouseDelta.y * _sensitivityY;
|
||||
|
||||
if (_isSliding)
|
||||
{
|
||||
if (Physics.CheckSphere(desired, 0.01f, _cameraZoneMask, QueryTriggerInteraction.Collide))
|
||||
camTransform.position = desired;
|
||||
return;
|
||||
mouseDeltaX = Mathf.Clamp(mouseDeltaX, -_slideStupidity, _slideStupidity);
|
||||
mouseDeltaY = Mathf.Clamp(mouseDeltaY, -_slideStupidity, _slideStupidity);
|
||||
}
|
||||
|
||||
var best = camTransform.position;
|
||||
var bestSqr = float.MaxValue;
|
||||
_rotation.x += mouseDeltaX;
|
||||
_rotation.y -= mouseDeltaY;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
_rotation.y = Mathf.Clamp(_rotation.y, -90f, 90f);
|
||||
|
||||
camTransform.position = best;
|
||||
camTransform.localRotation = Quaternion.Euler(_rotation.y, _rotation.x, 0f);
|
||||
}
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9e592628c3fe45bf9659d1050680c296
|
||||
timeCreated: 1785846388
|
||||
guid: ff3e1673b49d4a4ab9a7017656796b6e
|
||||
timeCreated: 1792340121
|
||||
Reference in new issue
Block a user