因此,我仍然不是最擅长的事情,但是我正在尝试将此脚本用于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;
}
}
}
答案 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;如果您跳了起来,将冻结空中的动作,然后在空中移动:
要解决此问题,请将另一个设置为现有速度,或者使输入操作一个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
,具体取决于所需的功能(如果需要跳出悬崖后跳的能力)