Unity3D Движение куда смотрит камера
Есть код:
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(PlayerMove))]
public class UnitEditor : Editor
{
public override void OnInspectorGUI()
{
}
}
[RequireComponent(typeof(Rigidbody))]
public class PlayerMove : MonoBehaviour
{
#region ПЕРЕМННЫЕ
[SerializeField] private float _speed = 5f;
private Rigidbody _rb;
private Vector3 _normal;
private float _horizontalAxis;
private float _verticalAxis;
public GameObject MainCamera;
#endregion
#region ФУНКЦИИ
private void Awake()
{
_rb = GetComponent<Rigidbody>();
}
private void Update()
{
_horizontalAxis = Input.GetAxis("Horizontal");
_verticalAxis = Input.GetAxis("Vertical");
Debug.Log(transform.forward.x);
}
private void FixedUpdate()
{
Move(new Vector3(-_verticalAxis, 0, _horizontalAxis));
}
public void Move(Vector3 direction)
{
Vector3 directionAlongSurface = Project(direction.normalized);
Vector3 offset = Vector3.Scale(directionAlongSurface * _speed * Time.deltaTime, MainCamera.transform.forward);
_rb.MovePosition(_rb.position + offset);
}
public Vector3 Project(Vector3 forward)
{
return forward - Vector3.Dot(forward, _normal) * _normal;
}
private void OnCollisionEnter(Collision collision)
{
foreach (var contact in collision.contacts)
{
var normal = contact.normal;
if (IsGround(normal))
{
_normal = normal;
break;
}
}
}
private bool IsGround(Vector3 normal)
{
if (normal.x > 0.5) return false;
if (normal.z > 0.5) return false;
if (normal.y < 0.1) return false;
return true;
}
private void OnDrawGizmos()
{
Gizmos.color = Color.white;
Gizmos.DrawLine(transform.position, transform.position + _normal * 3);
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position, transform.position + Project(transform.forward));
}
#endregion
}
Что нужно добавить для того чтобы поворот камеры учитывался и игрок двигался куда смотрит камера. Заранее спасибо
Ответы (1 шт):
Автор решения: Overlord
→ Ссылка
Используйте transform.forward:
private void FixedUpdate()
{
Move(_verticalAxis, _horizontalAxis);
}
public void Move(float vertical, float horizontal)
{
Vector2 direction = new Vector2(horizontal, vertical);
direction.Normalize();
Vector3 movePosition = Vector3.Normalize(direction.x * transform.right + direction.y * transform.forward);
movePosition *= _Speed * Time.fixedDeltaTime;
movePosition += transform.position;
_rigidbody.MovePosition(movePosition);
}