(Unity, 2D, c#)我如何让玩家在需要再次按下按钮之前放手?



这是一个奇怪的问题…我不知道该怎么解释。我正在为我的游戏制作一个窗台悬挂机制,你可以按任意一个方向到达窗台,但你也可以按的方向从窗台上下来。这意味着当你试图爬上边缘时,他会立刻掉下来。设定一个固定的等待时间也让人感觉不舒服。我认为它会把轴设为0直到按钮松开,但问题是如果它是0,按钮就松开了。这是我解决不了的难题。

这是检测按左或右方向键的移动的代码。

mx = Input.GetAxisRaw("Horizontal");
//Detects if the left or right arrow keys are pressed, and turns it into a number.

这是一些代码,检测运动,而你挂。已经有一个问题…有一个"如果悬挂"。这句话应该限制你的移动,直到你放手或跳跃,但由于移动也应该让你摆脱悬挂,这使得这一点没有意义。我真的可以使用不同的按钮,比如将其限制为跳跃按钮或向下键(因为这使用了不同的变量),但我想看看是否有可能解决这个问题。

if (IsGrabbing == true)
{
rb.velocity = new Vector2(0f, 0f);
rb.gravityScale = 0f;
// mx2 detects vertical movement. This is still a problem, if you're pressing down before you hang, it'll instantly hang instead of waiting for another press, but it's not as bad because you don't press down to hang on a ledge
if (mx != 0 || mx2 < 0)
{
//Just the code that makes you let go and unable to hang, this is reset when you land.
IsGrabbing = false;
anim.SetBool("IsHanging", false);
redXSize = 10f;
redYSize = 10f;
greenXSize = 0f;
greenYSize = 0f;
rb.gravityScale = 5f;
}

我已经尝试了很多东西,很多"我试过让游戏崩溃。有人知道如何解决这个问题吗?如果需要,我会提供所有的代码。

编辑:在回复的帮助下,我找到了解决方案!需要像这样设置一个标志,默认情况下它为false。然而,它也只检查它是否为假,并且else语句意味着它为真,更不用说将其设置为真的唯一方法无论如何都绕过了该门。这样就得到了所需的结果!同时,当"当"循环似乎打破了它,在每次检查中添加一个不这样做的条件,而抓取似乎修复了它。谢谢,大家好!
if (IsGrabbing == true)
{
if (mx != 0 && InitiateGrab == false)
{
InitiateGrab = false;
}
else
{
InitiateGrab = true;
}
rb.velocity = new Vector2(0f, 0f);
rb.gravityScale = 0f;
if (mx != 0 && InitiateGrab == true || mx2 < 0 && InitiateGrab == true)
{
IsGrabbing = false;
InitiateGrab = false;
anim.SetBool("IsHanging", false);
anim.SetBool("IsRising", false);
redXSize = 10f;
redYSize = 10f;
greenXSize = 0f;
greenYSize = 0f;
rb.gravityScale = 5f;
}
}

既然你没有代码。具体的细节我不能帮你,但我仍然理解你的要求,我仍然可以帮助你。这是"样品"。我将在你的情况下使用的代码:

bool isHanging = false;
void Update()
{
if (Input.GetKeyDown("space") && !isHanging)
{
isHanging = true;
// Use ur code to hang onto the ledge.
} else if (Input.GetKeyDown("space") && !isHanging)
{
isHanging = false;
// Use ur code to get off the ledge.
}
}
bool CheckIfHanging()
{
if(isHanging) { return false; }
else return true;
}

本质上,这会导致切换效果,当你按下空格键并且足够靠近窗台时,你将bool设置为true,你挂在窗台上并想要离开它,你将isHanging设置为false,并运行你的代码跳下窗台。这确实会使我们的控件变成一个切换控件。如果你正在寻找"按"控制,你抓住一个键来抓住窗台,然后在你按下的时候放手,然后试试这个:

void Update()
{
if (Input.GetKeyDown("space"))
{
// Hang onto ledge
} else if (Input.GetKeyUp("space"))
{
// Let go of ledge.
}
}

希望我能帮上忙!(注:下次请把你的代码放在里面,这样我可以帮助你更多!)

快速更新我的答案,因为你发布了你的代码。也许试着把你的移动代码改成这样

bool isHanging = false;
int speed; [SerializeField]
void MoveCharacter()
{
if (isHanging) return;
else  mx = speed * Input.GetAxisRaw("Horizontal");
}

本质上,这仍然允许你用方向键移动,但如果你挂起了,它会停止你的移动代码。同样从你之前的评论,你说你显然不能使用输入。为你的左/右箭头GetKeyDown/Up ?如果是这种情况,我建议使用KeyCode,它应该有键盘中所有btns的输入。

bool HangLedge()
{
if (!isHanging && Input.GetKeyDown(KeyCode.DownArrow)) return true;
else if (!isHanging && Input.GetKeyDown(KeyCode.DownArrow)) return false;
}
// Set ur ledge code and movement code to take this bool, and run the code when it's either false/true.

希望我能澄清!

相关内容

  • 没有找到相关文章

最新更新