让我的游戏对象正确地向前移动和跳跃

本文关键字:移动 跳跃 正确地 我的 游戏 对象 | 更新日期: 2023-09-27 18:13:09

我有一个问题,我的gameObject几乎没有跳跃。我认为这与moveDirection有关,因为当我注释掉p.velocity = moveDirection时,跳跃工作。

有什么建议吗?

using UnityEngine;
using System.Collections;
public class Controller : MonoBehaviour 
{    
    public float jumpHeight = 8f;
    public Rigidbody p;    
    public float speed = 1;
    public float runSpeed = 3;
    public Vector3 moveDirection = Vector3.zero;
    // Use this for initialization
    void Start () 
    {
        p = GetComponent<Rigidbody>();
        p.velocity = Vector3.zero;
    }
    // Update is called once per frame
    void Update () 
    {
        if (Input.GetKeyDown (KeyCode.Space)) 
        {
            p.AddForce(new Vector3(0, jumpHeight, 0), ForceMode.Impulse);
        }
        Move ();   
    }
    void Move ()
    {
        if(Input.GetKey(KeyCode.D))
        {
            transform.Rotate(Vector3.up, Mathf.Clamp(180f * Time.deltaTime, 0f, 360f));
        }
        if(Input.GetKey(KeyCode.A))
        {
            transform.Rotate(Vector3.up, -Mathf.Clamp(180f * Time.deltaTime, 0f, 360f));
        }
        moveDirection = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));
        moveDirection = transform.TransformDirection(moveDirection);
        if(Input.GetKey(KeyCode.LeftShift))
        {
            moveDirection *= runSpeed;
        }
        else
        {
            moveDirection *= speed;
        }
        p.velocity = moveDirection;
    }
}

让我的游戏对象正确地向前移动和跳跃

尝试为您的jumpheight变量使用更高的值。

因为在同一帧内完成AddForce(...)之后,你用moveDirection覆盖了速度。您应该添加到当前速度中,而不是像这样完全覆盖它:

Vector3 velocity = p.velocity;
p.velocity = velocity + moveDirection;

这就是为什么Unity警告不要直接干扰速度,你最好为你的运动做另一个AddForce(...):

p.AddForce(moveDirection * Time.deltaTime);
编辑:

我不喜欢偏离OP的问题太远,但是你的新问题可能是因为你在moveDirection上做了太多的事情,我甚至不明白为什么,但它应该在很大程度上看起来像这样:

moveDirection = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical")).normalized;
float _speed = Input.GetKey(KeyCode.LeftShift) ? runspeed : speed;
p.AddForce(moveDirection * _speed * Time.deltaTime);

好吧,我知道怎么修复它了。而不是那些MoveDirection变量我把它改成

if(Input.GetKey(KeyCode.W)) {
        transform.position += transform.forward * Time.deltaTime * speed;
    }
    if(Input.GetKey(KeyCode.S)) {
        transform.position -= transform.forward * Time.deltaTime * speed;
    }

,现在可以正常运行了