我对统一和编程非常陌生,所以这可能是一个非常愚蠢的问题
我试图让我的玩家在地图上水平和垂直移动,但我的代码不能这样工作。当我按下向上和向下键时,播放器也会水平移动。我应该改变什么?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
Rigidbody2D _rb;
float _walkSpeed;
float _inputHorizontal;
float _inputVertical;
float _walkSpeedVertical;
// Start is called before the first frame update
void Start()
{
_rb = gameObject.GetComponent<Rigidbody2D>();
_walkSpeed = 5.5f;
_walkSpeedVertical = 6.5f;
}
// Update is called once per frame
void Update()
{
_inputHorizontal = Input.GetAxisRaw("Horizontal");
if (_inputHorizontal != 0)
{
_rb.AddForce(new Vector2(_inputHorizontal * _walkSpeed, 0f));
}
_inputVertical = Input.GetAxisRaw("Vertical");
if (_inputVertical != 0)
{
_rb.AddForce(new Vector2(_inputVertical * _walkSpeedVertical, 0f));
}
if (_inputVertical + _inputHorizontal == 0)
{
_rb.velocity = Vector2.zero;
}
}
}
您的代码中有很多问题。首先,如果您要施加力,您应该在FixedUpdate中执行,而不是在Update中执行。其次,你的
_rb.AddForce(new Vector2(_inputVertical * _walkSpeedVertical, 0f));
垂直轴的 写得不正确,因为您仅在 X 轴上分配了值的 Vector2。这就是为什么你的玩家总是水平移动。
enter code here void FixedUpdate()
{
_inputHorizontal = Input.GetAxisRaw("Horizontal");
_inputVertical = Input.GetAxisRaw("Vertical");
Vector2 movement = new Vector2(_inputHorizontal * _walkSpeed, _inputVertical * _walkSpeedVertical);
if (_inputHorizontal != 0 || _inputVertical != 0)
{
_rb.AddForce(movement);
}
else
{
_rb.velocity = Vector2.zero;
}
}
通过将其更改为此,您可以根据水平和垂直输入定义您的运动,从而形成方向向量。您可能需要 addForce 将其乘以某个速度值和 Time.deltaTime,以实现帧速率的独立性。希望有帮助。