【问题标题】:How can I get my player to jump?如何让我的玩家跳跃?
【发布时间】:2016-08-19 13:11:33
【问题描述】:

我一直试图让我的玩家向前跳一会儿,但我被卡住了。我查看了其他答案并尝试了它们,但后来我无法让它按我想要的方式工作。我尝试了几种不同的方法,但它们都没有按照他们应该的方式工作。大多数时候弹跳的距离不一样,有时当玩家落地时,玩家会向前滑动,这不是我想要的。我想让我的角色像 Crossy road 一样跳跃。这是我尝试过的一件事:

using UnityEngine;
using System.Collections;

public class MovePlayer : MonoBehaviour
{   
    Vector3 endPos;
    int numBackwards = 0;
    bool jumping = false;
    public Rigidbody rigidBody;
    //public Collider theCollider;

    void Start()
    {
        rigidBody = GetComponent<Rigidbody> ();
    }

    // Update is called once per frame
    void Update()
    {
        rigidBody.freezeRotation = true;

        endPos = gameObject.transform.position;
        if (!jumping)
        {
            if (Input.GetButtonDown("up") && gameObject.transform.position == endPos) {
                if (numBackwards < 0)
                {
                    numBackwards++;
                } 
                else
                {
                    UpdateScore.score++;
                }
                transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
                transform.Translate(Vector3.forward * 110 * Time.deltaTime, Space.World);
            } 
            else if (Input.GetButtonDown("down") && gameObject.transform.position == endPos)
            {
                transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
                transform.Translate(-Vector3.forward * 110 * Time.deltaTime, Space.World);
                numBackwards--;
            }
            else if (Input.GetButtonDown("left") && gameObject.transform.position == endPos)
            {
                transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
                transform.Translate(Vector3.left * 110 * Time.deltaTime, Space.World);
            }
            else if (Input.GetButtonDown("right") && gameObject.transform.position == endPos)
            {
                transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
                transform.Translate(Vector3.right * 110 * Time.deltaTime, Space.World);
            }
        }
    }

    void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.CompareTag("Ground"))
            jumping = false;
    }

    void OnCollisionExit(Collision other)
    {
        if (other.gameObject.CompareTag("Ground"))
            jumping = true;
    }
}

这不起作用,因为几乎所有跳跃的大小都不同,我需要它们保持一致。我尝试的另一件事是:

public float distance;      
public float fspeed;
public float uspeed;

//PRIVATE
private Rigidbody rigidBody;


void Awake()
{
    rigidBody = GetComponent<Rigidbody>();
    rigidBody.freezeRotation = true;
}

void FixedUpdate()
{
    if (Physics.Raycast(transform.position, -Vector3.up, distance + 0.1F))
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            rigidBody.AddForce(new Vector3(0, uspeed, fspeed));
        }

        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            rigidBody.AddForce(new Vector3(0, uspeed, -fspeed));
        }

        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            rigidBody.AddForce(new Vector3(fspeed, uspeed, 0));
        }

        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            rigidBody.AddForce(new Vector3(-fspeed, uspeed, 0));
        }
    }
}

这也不起作用,当玩家着陆时它会向前滑动。我尝试的最后一件事是使用带有跳跃和空闲的动画,我不知道为什么它不起作用,但这也不起作用。我想知道的是,我不能让我的球员每次都跳相同的距离而不滑动的最佳方式是什么,或者我怎样才能修复我以前的方式,让他们按照我想要的方式工作。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    使用ForceModeImpulse 非常适合跳跃角色,使用质量看起来很逼真。而且它不是连续的。还需要较低的值以获得更好的效果。

    if (Input.GetKey(KeyCode.UpArrow))
    {
       rigidBody.AddForce(new Vector3(0, uspeed, fspeed), ForceMode.Impulse);
    }
    

    将强制模式参数留空会导致Force 默认为连续的ForceMode。这比惯性更容易导致滑动。

    用于在接触地面时忽略惯性滑动无效速度。

    void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.tag == "Ground")
        {
            jumping = false;
    
            rigidBody.velocity = Vector3.zero;
        }        
    }
    

    在输入之前检查!jumping 已经排除了跳空。

    【讨论】:

    • 我似乎无法让它工作你知道为什么它会导致它不起作用吗?
    • 它只是不动
    • 您只需将代码的第一部分用于不同的输入 4 次,最后一部分作为碰撞输入并使用您自己的碰撞退出。
    • 抱歉,这是一个愚蠢的错误,它运行良好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多