在水平和垂直轴上移动

问题描述 投票:0回答:1

我对统一和编程非常陌生,所以这可能是一个非常愚蠢的问题

我试图让我的玩家在地图上水平和垂直移动,但我的代码不能这样工作。当我按下向上和向下键时,播放器也会水平移动。我应该改变什么?

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;
        }
    }
}
c# unity-game-engine
1个回答
0
投票

您的代码中有很多问题。首先,如果您要施加力,您应该在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,以实现帧速率的独立性。希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.