以前曾经问过,但没有一个答案解决了我的问题,因为问题总是略有不同。
我有一个在空格键上跳下来的角色。当空格键按下的时间更长时,我希望它能够进行更高的跳跃,最大值是正常跳跃高度的两倍。
这是我到目前为止所提出的:
void FixedUpdate () {
if (Input.GetKeyDown(KeyCode.Space) && myRB.velocity.y == 0)
{
timeHeld = 1;
}
if (Input.GetKey(KeyCode.Space) && myRB.velocity.y == 0)
{
myRB.AddForce(Vector3.up * 20,ForceMode2D.Impulse);
timeHeld += Time.deltaTime;
myRB.mass = myRB.mass - timeHeld/10;
}
if (Input.GetKeyUp(KeyCode.Space))
{
myRB.mass = 1;
}
}
由于跳跃必须发生在keydown(而不是keyup)上,我无法增加跳跃上添加的力,因为力已经在keydown上施加。因此,我在考虑降低刚体的质量。
如果我继续按住空格键,上面的代码“有效”:角色跳跃(最小高度),降落,再次跳跃,但现在高一点,等等。但这显然不是我想要的。
答案 0 :(得分:2)
这可以通过制作跳跃发生的时间范围轻松完成; 在此时间范围内,您可以通过按住空格键来施加向上的力。一旦到达时间段结束或按下按钮结束;你限制向上的速度直到角色降落。 结束跳跃后,让重力走自己的路。
至于编码部分,我建议你在跳跃时启动一个例程。
这里有一些代码可以帮助你入门;
IEnumerator Jumper()
{
if (maxjumpduration!=jumpduration)
{
jumpduration = jumpduration + 0.1f;
yield return new WaitForSeconds(0.1f);
}
else
{
jumpduration = 0;
StopCoroutine(Jumper());
}
}
至于你想要的事实也有规律的跳跃;如果按空格键被认为是常规跳跃或受控跳跃,则确定另一个时间框架;在最初的时间范围内,你仍在决定它是什么样的跳跃;你执行跳转的一小部分,直到得出结论然后你把它发送到正确的方法。
我为你添加了一些基础工作但是尝试自己完成代码;
{
private bool shortjump = false;
private bool checkphase = false;
private bool hitground = false;
private Rigidbody player = new Rigidbody();
private bool jumping = false;
Vector3 sharedjumpforce = new Vector3();
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Initialjump();
}
if (Input.GetKeyUp(KeyCode.Space))
{
if (jumping)
{
shortjump = true;
}
}
if (jumping)
{
if (hitground)
{
jumping = false;
}
}
}
void Initialjump()
{
if (jumping = false)
{
checkphase = true;
jumping = true;
player.AddForce(sharedjumpforce);
Invoke("Standardorcontrolledjump", 0.2f);
}
}
void Standardorcontrolledjump()
{
checkphase = false;
if (shortjump)
{
}
else
{
}
}
}
答案 1 :(得分:1)
我不明白你为什么要放
&& myRB.velocity.y == 0
你想让它减少它的质量而你在空中不是。假设在施加初始力之后减小质量确实允许Rigidbody更高,(重力减弱,我不确定Unity中是否发生这种情况)
你为什么不试试这个
void FixedUpdate () {
// apply force the instant button is pressed. That is only once
if (Input.GetKeyDown(KeyCode.Space) && myRB.velocity.y == 0)
{
myRB.AddForce(Vector3.up * 20,ForceMode2D.Impulse);
timeHeld = 1;
}
// keep subtracting from mass while its held
if (Input.GetKey(KeyCode.Space))
{
timeHeld += Time.deltaTime;
myRB.mass = myRB.mass - timeHeld/10;
}
if (Input.GetKeyUp(KeyCode.Space))
{
myRB.mass = 1;
}
}