turning slowly, waiting for standing animation when standing
This commit is contained in:
@@ -5,8 +5,6 @@ public class Bed : BaseInteractableObject
|
|||||||
{
|
{
|
||||||
public override void Interact(Player player)
|
public override void Interact(Player player)
|
||||||
{
|
{
|
||||||
Debug.Log("rotate player");
|
|
||||||
player.Rotate(_playerArrivePoint.transform.forward);
|
|
||||||
Debug.Log("Sitting");
|
Debug.Log("Sitting");
|
||||||
player.SetPlayerState(ActionStates.Sitting);
|
player.SetPlayerState(ActionStates.Sitting);
|
||||||
}
|
}
|
||||||
|
|||||||
+50
-20
@@ -3,9 +3,10 @@ using System.Collections.Generic;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.AI;
|
using UnityEngine.AI;
|
||||||
|
|
||||||
public enum Tasks { Move, Interact };
|
public enum Tasks { Move, Interact, Rotate };
|
||||||
public enum TaskStatus { Waiting, InProgress, Complete };
|
public enum TaskStatus { Waiting, InProgress, Complete };
|
||||||
public enum ActionStates { Idle, Walking, Sleeping, Sitting, Standing };
|
public enum ActionStates { Idle, Walking, Sleeping, Sitting, Standing };
|
||||||
|
|
||||||
public class Player : MonoBehaviour
|
public class Player : MonoBehaviour
|
||||||
{
|
{
|
||||||
public static Player Instance { get; private set; }
|
public static Player Instance { get; private set; }
|
||||||
@@ -30,9 +31,9 @@ public class Player : MonoBehaviour
|
|||||||
private const string WALK = "Walk";
|
private const string WALK = "Walk";
|
||||||
private const string WALK_VELOCITY = "WalkVelocity";
|
private const string WALK_VELOCITY = "WalkVelocity";
|
||||||
|
|
||||||
|
private bool _isInAnimation = false;
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (Instance != null)
|
if (Instance != null)
|
||||||
{
|
{
|
||||||
Debug.Log("There's more than one player instance");
|
Debug.Log("There's more than one player instance");
|
||||||
@@ -55,6 +56,16 @@ public class Player : MonoBehaviour
|
|||||||
|
|
||||||
private void Update()
|
private void Update()
|
||||||
{
|
{
|
||||||
|
if (_isInAnimation)
|
||||||
|
{
|
||||||
|
if (!isAnimationStatePlaying(0, "SitToStand"))
|
||||||
|
{
|
||||||
|
_isInAnimation = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_currentTask == null || _currentTask.Status == TaskStatus.Complete)
|
if (_currentTask == null || _currentTask.Status == TaskStatus.Complete)
|
||||||
{
|
{
|
||||||
_tasks.TryDequeue(out _currentTask);
|
_tasks.TryDequeue(out _currentTask);
|
||||||
@@ -65,7 +76,15 @@ public class Player : MonoBehaviour
|
|||||||
Debug.Log($"Current task {_currentTask.Task}");
|
Debug.Log($"Current task {_currentTask.Task}");
|
||||||
switch (_currentTask.Task)
|
switch (_currentTask.Task)
|
||||||
{
|
{
|
||||||
|
case Tasks.Rotate:
|
||||||
|
_currentTask.UpdateStatus(Rotate(_currentTask.TagretObject._playerArrivePoint.forward));
|
||||||
|
break;
|
||||||
case Tasks.Move:
|
case Tasks.Move:
|
||||||
|
if (_currentState == ActionStates.Sitting)
|
||||||
|
{
|
||||||
|
SetPlayerState(ActionStates.Standing);
|
||||||
|
return;
|
||||||
|
}
|
||||||
_navAgent.SetDestination(_currentTask.TagretObject._playerArrivePoint.position);
|
_navAgent.SetDestination(_currentTask.TagretObject._playerArrivePoint.position);
|
||||||
_currentTask.UpdateStatus(MoveToPoint());
|
_currentTask.UpdateStatus(MoveToPoint());
|
||||||
break;
|
break;
|
||||||
@@ -75,6 +94,7 @@ public class Player : MonoBehaviour
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
AddTask(new PlayerTasks(Tasks.Move, _currentTask.TagretObject));
|
AddTask(new PlayerTasks(Tasks.Move, _currentTask.TagretObject));
|
||||||
|
AddTask(new PlayerTasks(Tasks.Rotate, _currentTask.TagretObject));
|
||||||
AddTask(_currentTask);
|
AddTask(_currentTask);
|
||||||
_currentTask = null;
|
_currentTask = null;
|
||||||
}
|
}
|
||||||
@@ -86,37 +106,43 @@ public class Player : MonoBehaviour
|
|||||||
private TaskStatus MoveToPoint()
|
private TaskStatus MoveToPoint()
|
||||||
{
|
{
|
||||||
SetPlayerState(ActionStates.Walking);
|
SetPlayerState(ActionStates.Walking);
|
||||||
|
|
||||||
var worldDeltaPosition = _navAgent.nextPosition - transform.position;
|
var worldDeltaPosition = _navAgent.nextPosition - transform.position;
|
||||||
_groundDeltaPosition.x = Vector3.Dot(transform.right, worldDeltaPosition);
|
_groundDeltaPosition.x = Vector3.Dot(transform.right, worldDeltaPosition);
|
||||||
_groundDeltaPosition.y = Vector3.Dot(transform.forward, worldDeltaPosition);
|
_groundDeltaPosition.y = Vector3.Dot(transform.forward, worldDeltaPosition);
|
||||||
|
|
||||||
Vector2 velocity = (Time.deltaTime > 1e-5f) ? _groundDeltaPosition / Time.deltaTime : Vector2.zero;
|
Vector2 velocity = (Time.deltaTime > 1e-5f) ? _groundDeltaPosition / Time.deltaTime : Vector2.zero;
|
||||||
_animator.SetFloat(WALK_VELOCITY, velocity.y);
|
_animator.SetFloat(WALK_VELOCITY, velocity.y);
|
||||||
|
|
||||||
return pathComplete(_navAgent.destination) ? TaskStatus.Complete : TaskStatus.InProgress;
|
return pathComplete(_navAgent.destination) ? TaskStatus.Complete : TaskStatus.InProgress;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool pathComplete(Vector3 destination)
|
private bool pathComplete(Vector3 destination)
|
||||||
|
{
|
||||||
|
if (Vector3.Distance(destination, _navAgent.transform.position) <= _navAgent.radius)
|
||||||
{
|
{
|
||||||
if (Vector3.Distance(destination, _navAgent.transform.position) <= _navAgent.radius)
|
if (!_navAgent.hasPath || _navAgent.velocity.sqrMagnitude == 0f)
|
||||||
{
|
{
|
||||||
if (!_navAgent.hasPath || _navAgent.velocity.sqrMagnitude == 0f)
|
SetPlayerState(ActionStates.Idle);
|
||||||
{
|
return true;
|
||||||
SetPlayerState(ActionStates.Idle);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Rotate(Vector3 target)
|
return false;
|
||||||
{
|
}
|
||||||
Quaternion rotation = Quaternion.LookRotation(target);
|
|
||||||
transform.rotation = rotation;
|
public TaskStatus Rotate(Vector3 target)
|
||||||
|
{
|
||||||
|
var targetRot = Quaternion.LookRotation(target);
|
||||||
|
Quaternion rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(target), 10 * Time.deltaTime);
|
||||||
|
rotation.x = 0;
|
||||||
|
transform.rotation = rotation;
|
||||||
|
if (targetRot == transform.rotation)
|
||||||
|
{
|
||||||
|
return TaskStatus.Complete;
|
||||||
|
}
|
||||||
|
return TaskStatus.InProgress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private TaskStatus InteractWithObject(BaseInteractableObject interactableObject)
|
private TaskStatus InteractWithObject(BaseInteractableObject interactableObject)
|
||||||
{
|
{
|
||||||
@@ -126,8 +152,11 @@ public class Player : MonoBehaviour
|
|||||||
|
|
||||||
public void SetPlayerState(ActionStates newState)
|
public void SetPlayerState(ActionStates newState)
|
||||||
{
|
{
|
||||||
if(newState== _currentState)
|
if (newState == _currentState)
|
||||||
{ return; }
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_isInAnimation = true;
|
||||||
switch (newState)
|
switch (newState)
|
||||||
{
|
{
|
||||||
case ActionStates.Idle:
|
case ActionStates.Idle:
|
||||||
@@ -145,10 +174,11 @@ public class Player : MonoBehaviour
|
|||||||
_animator.SetBool(SIT_DOWN, false);
|
_animator.SetBool(SIT_DOWN, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
_currentState = newState;
|
_currentState = newState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool isAnimationStatePlaying(int animLayer, string stateName)
|
bool isAnimationStatePlaying(int animLayer, string stateName)
|
||||||
{
|
{
|
||||||
if (_animator.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName) &&
|
if (_animator.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName) &&
|
||||||
|
|||||||
Reference in New Issue
Block a user