Anonymous
Как я могу исправить эту проблему, когда игрок движется не в правильном направлении?
Сообщение
Anonymous » 08 ноя 2024, 23:03
Я пытаюсь создать сценарий C# Unity motion с новой системой ввода. Я столкнулся с проблемой, из-за которой игрок не движется в том направлении, в котором я смотрю. Система также использует Cinemachine для камеры от третьего лица и боевых камер. Все остальное работает правильно.
СКРИПТ:
Код: Выделить всё
using UnityEngine;
public class ThirdPersonCam : MonoBehaviour
{
private DeviceControls controls;
[Header("Objects")]
public GameObject thirdPersonCam;
public GameObject combatCam;
[Header("Camera")]
public CameraStyle currentStyle;
public Transform orientation;
public Transform player;
public Transform playerObj;
public Rigidbody rb;
public float rotationSpeed;
public Transform combatLookAt;
[Header("Movement")]
public float moveSpeed;
float horizontalInput;
float verticalInput;
Vector3 moveDirection;
[Header("Grounded")]
public float playerHeight;
public LayerMask whatIsGround;
bool grounded;
public float groundDrag;
[Header("Jumping")]
public float jumpForce;
public float jumpCooldown;
public float airMultiplier;
bool readyToJump;
public enum CameraStyle
{
Basic,
Combat
}
private void Awake()
{
controls = new DeviceControls();
controls.Gameplay.Jump.performed += ctx => { Jump(); };
}
private void Start()
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
rb.freezeRotation = true;
readyToJump = true;
AimCancel();
}
private void Update()
{
Vector3 viewDir = player.position - new Vector3(transform.position.x, player.position.y, transform.position.z);
orientation.forward = viewDir.normalized;
grounded = Physics.Raycast(transform.position, Vector3.down, playerHeight * 0.5f + 0.2f, whatIsGround);
if (grounded) rb.drag = groundDrag;
else rb.drag = 0;
MyInput();
SpeedControl();
if (currentStyle == CameraStyle.Basic)
{
moveDirection = orientation.forward * verticalInput + orientation.right * horizontalInput;
if (moveDirection != Vector3.zero) playerObj.forward = Vector3.Slerp(playerObj.forward, moveDirection.normalized, Time.deltaTime * rotationSpeed);
}
else if (currentStyle == CameraStyle.Combat)
{
Vector3 dirToCombatLookAt = combatLookAt.position - new Vector3(transform.position.x, player.position.y, transform.position.z);
orientation.forward = dirToCombatLookAt.normalized;
playerObj.forward = dirToCombatLookAt.normalized;
}
}
private void FixedUpdate()
{
MovePlayer();
}
private void MyInput()
{
horizontalInput = Input.GetAxis("Horizontal");
verticalInput = Input.GetAxis("Vertical");
}
private void MovePlayer()
{
if (grounded) rb.AddForce(moveDirection.normalized * moveSpeed * 10f, ForceMode.Force);
else if (!grounded) rb.AddForce(moveDirection.normalized * moveSpeed * 10f * airMultiplier, ForceMode.Force);
}
private void SpeedControl()
{
Vector3 flatVel = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
if (flatVel.magnitude > moveSpeed)
{
Vector3 limitedVel = flatVel.normalized * moveSpeed;
rb.velocity = new Vector3(limitedVel.x, rb.velocity.y, limitedVel.z);
}
}
private void Jump()
{
if (readyToJump && grounded)
{
readyToJump = false;
rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);
Invoke(nameof(ResetJump), jumpCooldown);
}
else return;
}
private void ResetJump()
{
readyToJump = true;
}
private void SwitchCameraStyle(CameraStyle newStyle)
{
thirdPersonCam.SetActive(false);
combatCam.SetActive(false);
if (newStyle == CameraStyle.Basic) thirdPersonCam.SetActive(true);
if (newStyle == CameraStyle.Combat) combatCam.SetActive(true);
currentStyle = newStyle;
}
private void AimStart()
{
SwitchCameraStyle(CameraStyle.Combat);
}
private void AimCancel()
{
SwitchCameraStyle(CameraStyle.Basic);
}
public void OnEnable()
{
controls.Enable();
}
public void OnDisable()
{
controls.Disable();
}
}
Я пытался изменить некоторые параметры в моей функции Update(), но мои изменения значений не повлияли на результат.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... ct-directi
1731096194
Anonymous
Я пытаюсь создать сценарий C# Unity motion с новой системой ввода. Я столкнулся с проблемой, из-за которой игрок не движется в том направлении, в котором я смотрю. Система также использует Cinemachine для камеры от третьего лица и боевых камер. Все остальное работает правильно. [b]СКРИПТ:[/b] [code]using UnityEngine; public class ThirdPersonCam : MonoBehaviour { private DeviceControls controls; [Header("Objects")] public GameObject thirdPersonCam; public GameObject combatCam; [Header("Camera")] public CameraStyle currentStyle; public Transform orientation; public Transform player; public Transform playerObj; public Rigidbody rb; public float rotationSpeed; public Transform combatLookAt; [Header("Movement")] public float moveSpeed; float horizontalInput; float verticalInput; Vector3 moveDirection; [Header("Grounded")] public float playerHeight; public LayerMask whatIsGround; bool grounded; public float groundDrag; [Header("Jumping")] public float jumpForce; public float jumpCooldown; public float airMultiplier; bool readyToJump; public enum CameraStyle { Basic, Combat } private void Awake() { controls = new DeviceControls(); controls.Gameplay.Jump.performed += ctx => { Jump(); }; } private void Start() { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; rb.freezeRotation = true; readyToJump = true; AimCancel(); } private void Update() { Vector3 viewDir = player.position - new Vector3(transform.position.x, player.position.y, transform.position.z); orientation.forward = viewDir.normalized; grounded = Physics.Raycast(transform.position, Vector3.down, playerHeight * 0.5f + 0.2f, whatIsGround); if (grounded) rb.drag = groundDrag; else rb.drag = 0; MyInput(); SpeedControl(); if (currentStyle == CameraStyle.Basic) { moveDirection = orientation.forward * verticalInput + orientation.right * horizontalInput; if (moveDirection != Vector3.zero) playerObj.forward = Vector3.Slerp(playerObj.forward, moveDirection.normalized, Time.deltaTime * rotationSpeed); } else if (currentStyle == CameraStyle.Combat) { Vector3 dirToCombatLookAt = combatLookAt.position - new Vector3(transform.position.x, player.position.y, transform.position.z); orientation.forward = dirToCombatLookAt.normalized; playerObj.forward = dirToCombatLookAt.normalized; } } private void FixedUpdate() { MovePlayer(); } private void MyInput() { horizontalInput = Input.GetAxis("Horizontal"); verticalInput = Input.GetAxis("Vertical"); } private void MovePlayer() { if (grounded) rb.AddForce(moveDirection.normalized * moveSpeed * 10f, ForceMode.Force); else if (!grounded) rb.AddForce(moveDirection.normalized * moveSpeed * 10f * airMultiplier, ForceMode.Force); } private void SpeedControl() { Vector3 flatVel = new Vector3(rb.velocity.x, 0f, rb.velocity.z); if (flatVel.magnitude > moveSpeed) { Vector3 limitedVel = flatVel.normalized * moveSpeed; rb.velocity = new Vector3(limitedVel.x, rb.velocity.y, limitedVel.z); } } private void Jump() { if (readyToJump && grounded) { readyToJump = false; rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z); rb.AddForce(transform.up * jumpForce, ForceMode.Impulse); Invoke(nameof(ResetJump), jumpCooldown); } else return; } private void ResetJump() { readyToJump = true; } private void SwitchCameraStyle(CameraStyle newStyle) { thirdPersonCam.SetActive(false); combatCam.SetActive(false); if (newStyle == CameraStyle.Basic) thirdPersonCam.SetActive(true); if (newStyle == CameraStyle.Combat) combatCam.SetActive(true); currentStyle = newStyle; } private void AimStart() { SwitchCameraStyle(CameraStyle.Combat); } private void AimCancel() { SwitchCameraStyle(CameraStyle.Basic); } public void OnEnable() { controls.Enable(); } public void OnDisable() { controls.Disable(); } } [/code] Я пытался изменить некоторые параметры в моей функции Update(), но мои изменения значений не повлияли на результат. Подробнее здесь: [url]https://stackoverflow.com/questions/79171413/how-could-i-fix-this-issue-where-the-player-does-not-move-in-the-correct-directi[/url]