OnCollisionStay在2D运动脚本中不起作用

时间:2019-07-14 11:38:05

标签: c# unity3d

因此,我仍然不是最擅长的事情,但是我正在尝试将此脚本用于2D运动,但是由于某些原因,跳转无法正常进行。一直说OnCollisionEnter函数“已声明但从未使用过”。有人可以告诉我我做错了什么吗?谢谢

如果我删除(Collect col)部分,它说“在这种情况下不能使用void”。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RonyWalking : MonoBehaviour
{
Rigidbody2D rigid;
SpriteRenderer sprite;
public bool isJumping;
public float spd = 2.0f;


// Start is called before the first frame update
void Start()
{
    rigid = GetComponent<Rigidbody2D>();
    sprite = GetComponent<SpriteRenderer>();
}

// Update is called once per frame
void Update()
{
    if(Input.GetKey("d")){rigid.velocity = new Vector2(spd, 0);}
    else if(Input.GetKey("a")){rigid.velocity = new Vector2(-spd, 0);}

    if(Input.GetKeyDown("w") && isJumping == false)
    {
        rigid.velocity = new Vector2(0, 5);
        isJumping = true;

    }

    void OnCollisionStay(Collision col)
    {
    isJumping = false;
    }

}
}

1 个答案:

答案 0 :(得分:0)

使用2D物理时,您需要使用2D lifecycle methods;

void OnCollisionStay2D(Collision2D col) 
{
    isJumping = false;
}

并且您不应该将此方法放在Update方法中...它应该在类级别:

public class RonyWalking
{

    void Update() 
    {
        // ...
    }

    void OnCollisionStay2D(Collision2D col) 
    {
        // ...
    }
}

不用担心“已声明但从未使用过”,这可能是因为您没有引用该方法的特定代码,但是Unity会引发“自动”调用它的事件


我在阅读代码时看到的另一件事,可能对您来说是无意的行为,是单击左/右时,将UP的速度设置为0,单击时将LEFT / RIGHT的速度设置为0;如果您跳了起来,将冻结空中的动作,然后在空中移动:

  1. 单击D;速度= 2,0
  2. 单击W;速度= 0,5
  3. 角色现在将向上移动,直到再次输入
  4. 单击D;速度= 2,0,并且角色在空中时将继续移动,因为在侧向移动时,上/下速度设置为0

enter image description here

要解决此问题,请将另一个设置为现有速度,或者使输入操作一个Vector,然后将其应用到运动代码的末尾:

Vector2 existingMovement = rigid.velocity;

if (Input.GetKey(KeyCode.D)) 
    existningMovement.x = spd;
else if (Input.GetKey(KeyCode.A))
    existningMovement.x = -spd;

if (Input.GeyKeyDown(KeyCode.W) && !isJumping) 
{
    existningMovement.y = 5f;
    isJumping = true;
}

此外,我认为您可能对OnCollisionStay有一些意外的行为;我认为,它将触发您与地面碰撞的每个帧。但是我认为它也可能会在您跳后触发一帧或两帧,因为角色的物理状态不会立即离开碰撞,所以即使您跳了跳,isJumping也会设置为false,你在空中又跳了一次。

我建议您使用OnCollisionExit2D(Collision2D col)来设置isJumping = true,或者使用OnCollisionEnter2D(Collision2D col)并将其设置为isJumping = false,具体取决于所需的功能(如果需要跳出悬崖后跳的能力)