【问题标题】:Making a ball jump just once只跳一次球
【发布时间】:2016-12-10 01:07:09
【问题描述】:

我正在开发一个统一项目,该项目类似于统一页面上的滚球项目教程,基本上我希望球只跳一次,为此我已经实现了逻辑,但是有些失败,我想不通。

这是我的代码

public bool inAir = false;


void OnCollisionEnter(Collision other){
    if (other.gameObject.tag=="Terrain") 
        inAir = false;
        else
        inAir = true;
    }

void FixedUpdate () {
    float moveHorizontal = Input.GetAxis ("Horizontal");
    float moveVertical = Input.GetAxis ("Vertical");

    Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);

    rb.AddForce (movement * speed);
    Debug.Log (inAir);

    if (Input.GetKeyDown ("space") && !inAir){
        rb.AddForce(new Vector3(0,jump,0));
    }

}

恢复:我刚刚添加了一个 inAir 变量,该变量在开始时设置为 false,因为球从地板开始,然后如果该对象与另一个对象发生碰撞,我检查碰撞输入我将标签更改为 Terrain inAir 为假,否则为真,然后在 FixedUpdate 结束时检查键是否为空格,如果球不在空中,则在这种情况下球可以跳跃

发生了什么:变量inAir总是为假,if总是进入第一个,一直保持为假,从来不进入else,那么这里出了什么问题?

【问题讨论】:

  • 它永远不会与其他任何东西发生碰撞?
  • 您可能希望在玩家跳跃后将inAir 设置为true(就在第二次AddForce 调用之后)。

标签: c# unity3d unity5


【解决方案1】:

不要在OnCollisionEnter 函数中将inAir 设置为truefalse,而是也实现OnCollisionExit,然后在这两个函数中设置它。这个比较靠谱。

public bool inAir = false;

void OnCollisionEnter(Collision other)
{
    if (other.gameObject.tag == "Terrain")
        inAir = false;
}

void OnCollisionExit(Collision other)
{
    if (other.gameObject.tag == "Terrain")
        inAir = true;
}

【讨论】:

  • 效果很好,谢谢朋友,您更改了值,但我得到了答案:D
  • 是的,刚刚注意到了。修复它,不客气!
猜你喜欢
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 2021-12-26
  • 2013-05-23
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多