【问题标题】:Game character won't double jump c#游戏角色不会双跳c#
【发布时间】:2015-12-02 18:24:44
【问题描述】:

我正在尝试统一创建一个 2D 平台游戏,当我尝试制作角色二段跳时,它不会工作。我想知道是否可以得到任何帮助。

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

    public float maxSpeed = 3;
    public float speed = 50f;
    public float jumpPower = 150f;

    public bool grounded;
    public bool canDoubleJump;

    private Rigidbody2D rb2d;
    private Animator anim;

    void Start ()
    {
        rb2d = gameObject.GetComponent<Rigidbody2D>();
        anim = gameObject.GetComponent<Animator>();
    }


    void Update ()
    {

        anim.SetBool("Grounded", grounded);
        anim.SetFloat("Speed", Mathf.Abs(rb2d.velocity.x));

        if(Input.GetAxis("Horizontal") < -0.1f)
        {
            transform.localScale = new Vector3(-1, 1, 1);
        }

        if(Input.GetAxis("Horizontal") > 0.1f)
        {
            transform.localScale = new Vector3(1, 1, 1);
        }

        if(Input.GetButton("Jump"))
        {
            if(grounded)
            {
                rb2d.AddForce(Vector2.up * jumpPower);
                canDoubleJump = true;
            }
            else
            {
                if (canDoubleJump)
                {
                    canDoubleJump = false;
                    rb2d.velocity = new Vector2(rb2d.velocity.x, 0);
                    rb2d.AddForce(Vector2.up * jumpPower);

                }
            }
        }

    }

    void FixedUpdate()
    {
        Vector3 easeVelocity = rb2d.velocity;
        easeVelocity.y = rb2d.velocity.y;
        easeVelocity.z = 0.0f;
        easeVelocity.x *= 0.75f;

        float h = Input.GetAxis("Horizontal");

        //fake friction / easing x speed
        if(grounded)
        {
            rb2d.velocity = easeVelocity;
        }


        //moving player
        rb2d.AddForce((Vector2.right * speed) * h);

        //limiting speed
        if(rb2d.velocity.x > maxSpeed)
        {
            rb2d.velocity = new Vector2(maxSpeed, rb2d.velocity.y);
        }

        if(rb2d.velocity.x < -maxSpeed)
        {
            rb2d.velocity = new Vector2(-maxSpeed, rb2d.velocity.y);
        }
    }
}

【问题讨论】:

  • 你不应该把jumpPower加倍来进行二段跳吗?
  • 不完全是,不。 “双跳”不是“跳两倍高”,而是“在空中再跳”。双跳(传统上)甚至可以在从平台上掉下来之后进行。也就是说,在添加跳跃速度之前应该将垂直速度归零。
  • 会不会是 2D 盒子碰撞器,干扰了脚本? @Draco18s
  • 不确定,您没有准确指出“不起作用”指的是什么。你的意思是你第二次点击“跳跃”然后什么都没有发生?
  • @Draco18s 是的,这正是问题所在

标签: c# 2d platform


【解决方案1】:

问题在于您正在检查 Jump 按钮当前是否处于按下状态。 按下和释放按钮通常发生在多个帧上(即 Update() 在按钮按下的持续时间)。

有两种方法可以解决此问题。

最简单(也可能是最好的)是进行这种更改:

if(Input.GetButtonDown("Jump"))

GetButtonDown 仅在第一次按下按钮的帧中返回 true,在释放并再次按下之前返回 false。

另一个是包含第二个变量,该变量会阻止第二个块的激活,直到按钮被释放。这不太理想,但显示了GetButtonDown 的幕后情况。

var isButtonDown = false;

Update() {
        if(Input.GetButton("Jump"))
        {
            if(grounded)
            {
                rb2d.AddForce(Vector2.up * jumpPower);
                canDoubleJump = true;
                isButtonDown = true;
            }
            else if(!isButtonDown)
            {
                if (canDoubleJump)
                {
                    canDoubleJump = false;
                    rb2d.velocity = new Vector2(rb2d.velocity.x, 0);
                    rb2d.AddForce(Vector2.up * jumpPower);

                }
            }
        }
        else {
            isButtonDown = false;
        }
    }

请注意,这并没有解决双跳能力通常包含的“从平台上跳下来一次”。我将把它作为练习留给读者。

【讨论】:

  • 哇,好的,谢谢。非常感谢您的帮助! :)
  • 不客气。顺便说一句,下次包含Unity 标签。毕竟,您使用的是 Unity,而 Unity 是此处可识别的标签。也不要忘记将此标记为已接受的答案!左上角的复选标记。 ;)
  • @Draco18s 请不要使用 Unity 标签,请使用 Unity3d 标签。 Unity 用于 IoC 框架,而不是游戏引擎。
  • 哦,谢谢@RonBeyer!我不知道,我以前用过Unity 不知道!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多