70 lines
2.2 KiB
C#
70 lines
2.2 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class MovementBehaviour : MonoBehaviour {
|
|
[SerializeField] private float _movementSpeed = 10.0f;
|
|
|
|
[SerializeField] private float _rotationSpeed = 10.0f;
|
|
|
|
[Header("Player")] [SerializeField] private float _playerHeight = 1.0f;
|
|
|
|
[SerializeField] private float _playerRadius = 0.5f;
|
|
|
|
private Vector3 _desiredMovementDirection = Vector3.zero;
|
|
|
|
public Vector3 desiredMovementDirection {
|
|
get => _desiredMovementDirection;
|
|
set => _desiredMovementDirection = value;
|
|
}
|
|
|
|
public Vector3 desiredLookDirection {
|
|
get => _desiredMovementDirection;
|
|
set => _desiredMovementDirection = value;
|
|
}
|
|
|
|
private void Update() {
|
|
HandleMovement();
|
|
HandleRotation();
|
|
}
|
|
|
|
private void HandleMovement() {
|
|
Vector3 movement = _desiredMovementDirection.normalized;
|
|
float moveDistance = _movementSpeed * Time.deltaTime;
|
|
bool canMove = !Physics.CapsuleCast(transform.position, transform.position + Vector3.up * _playerHeight,
|
|
_playerRadius, movement, moveDistance);
|
|
|
|
if (!canMove) {
|
|
// Cannot goto movedir
|
|
|
|
Vector3 moveX = new Vector3(movement.x, 0, 0);
|
|
canMove = movement.x != 0 && !Physics.CapsuleCast(transform.position,
|
|
transform.position + Vector3.up * _playerHeight,
|
|
_playerRadius, moveX, moveDistance);
|
|
|
|
if (canMove) {
|
|
movement = moveX;
|
|
}
|
|
else {
|
|
Vector3 moveZ = new Vector3(0, 0, movement.z);
|
|
canMove = movement.z != 0 && !Physics.CapsuleCast(transform.position,
|
|
transform.position + Vector3.up * _playerHeight,
|
|
_playerRadius, moveZ, moveDistance);
|
|
|
|
if (canMove) {
|
|
movement = moveZ;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (canMove) {
|
|
// movement *= _movementSpeed * Time.deltaTime;
|
|
transform.position += movement * moveDistance;
|
|
}
|
|
}
|
|
|
|
private void HandleRotation() {
|
|
transform.forward =
|
|
Vector3.Slerp(transform.forward, _desiredMovementDirection, Time.deltaTime * _rotationSpeed);
|
|
}
|
|
} |