我正在进行2D游戏。我的问题是,在玩游戏时,如果玩家持有跳跃并且在BoxCollider2D下,玩家将不会掉落直到他们释放跳跃。
我的播放器GameObject包含一个精灵渲染器,一个带有重力的动态刚体2d和一个boxcollider2d。
以下是我的动作脚本:
1:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JumpScript : MonoBehaviour {
[Range(1, 10)]
public float jumpVelocity;
[Range(0,10)]
public float speed;
private bool jumpQueue = false;
private bool boolin=false;
void Update()
{
//Friggin fall, loser
//Jumping
///*
if (Input.GetButton("Jump")&& GetComponent<Rigidbody2D> ().velocity.y==0)
{
GetComponent<Rigidbody2D>().velocity = Vector2.up * jumpVelocity;
}
//*/
//jumpQueue?
/*
if(Input.GetButtonDown("Jump"))
{
jumpQueue = true;
}*/
//Right Movement
if (Input.GetKey(KeyCode.D))
{
GetComponent<Rigidbody2D>().velocity = new Vector2(1*speed, GetComponent<Rigidbody2D>().velocity.y);
boolin = true;
}
if(Input.GetKeyUp(KeyCode.D))
{
GetComponent<Rigidbody2D>().velocity = new Vector2(0, GetComponent<Rigidbody2D>().velocity.y);
boolin = false;
}
//Left Movement
if (Input.GetKey(KeyCode.A))
{
GetComponent<Rigidbody2D>().velocity = new Vector2(-1*speed, GetComponent<Rigidbody2D>().velocity.y);
boolin = true;
}
if (Input.GetKeyUp(KeyCode.A))
{
GetComponent<Rigidbody2D>().velocity = new Vector2(0, GetComponent<Rigidbody2D>().velocity.y);
boolin = false;
}
//No movement?
if (Input.GetKey(KeyCode.D) && Input.GetKey(KeyCode.A))
{
GetComponent<Rigidbody2D>().velocity = new Vector2(0, GetComponent<Rigidbody2D>().velocity.y);
boolin = false;
}
//Time to handle animation, boios.
Rigidbody2D rb = GetComponent<Rigidbody2D>();
bool schwomp = false;
bool schwift = false;
if(rb.velocity.y>0)
{
schwomp = true;
}
if(rb.velocity.y<0)
{
schwift = true;
}
Animator anim = GetComponent<Animator>();
if (boolin)
{
anim.SetInteger("Boolin", 1);
/*if (!anim.GetBool("expand"))
{
anim.SetBool("expand", true);
anim.Play("running");
}*/
}
else
{
anim.SetInteger("Boolin", 0);
/*
if(anim.GetBool("expand"))
{
anim.SetBool("expand", false);
anim.Play("Idle");
}*/
}
if(schwomp)
{
//anim.SetInteger("Boolin", 2);
}
if(schwift)
{
//anim.SetInteger("Boolin", 3);
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
公共类BetterJumper:MonoBehaviour {
public float fallMultiplier = 2.5f;
public float lowJumpMultiplier = 2f;
Rigidbody2D rb;
void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if(rb.velocity.y<0)
{
rb.velocity += Vector2.up*Physics2D.gravity.y*(fallMultiplier-1)*Time.deltaTime;
}
else if(rb.velocity.y>0&&!Input.GetButton("Jump"))
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
}
}
}
提前非常感谢你!
答案 0 :(得分:3)
您正在使用Input.GetKey()
,每帧都会轮询密钥。这意味着你越久抓住越多的速度。你已经有效地建造了一个喷气背包而不是一个跳跃力。
你应该使用Input.GetKeyDown()
只会在按下一个键时触发一次,然后必须释放并再次按下才能重新触发。然后,您需要使用RigidBody.AddForce()
应用一个足够强大的垂直力来使角色跳跃,而不是连续添加到速度。
此外,当脚本唤醒或启动时,您应该真正缓存GetComponent<Rigidbody2D>()
调用的结果,这样您就不会连续调用它;这些调用中的每一个都需要处理时间。此外,您应该使用FixedUpdate()
作为物理。
public class ExampleClass : MonoBehaviour {
public float thrust;
public Rigidbody rb; // make the rigidbody variable available anywhere in the class
void Start() {
// cache the rigidbody component to the variable once on start
rb = GetComponent<Rigidbody>();
}
void FixedUpdate() {
// use the variable reference from now on rather than making GetComponent calls
rb.AddForce(transform.up * thrust);
}
}
答案 1 :(得分:0)
苏维埃的回答很好地解释了这一点,但还有更多你需要知道的事情。你直接操纵速度,它会超越任何力的作用,包括重力(尽管你手动应用它)。请参阅documentation。
正如Soviut的回答所示,你应该施加力量和冲动,让物理引擎确定速度。你应该直接设置速度的唯一时间是你正在构建一个故意具有不切实际的物理模拟(即复古平台)。即使在这种情况下,请记住,这样做会产生更多的工作,因为你需要考虑每一个创造运动的小事。这意味着你基本上重新发明了物理引擎。