簡體   English   中英

(Unity,2D,C#)如何讓玩家在需要再次按下按鈕之前松開按鈕?

[英](Unity, 2D, C#) How can I make the player let go of a button before needing to press it again?

這是一個措辭奇怪的問題......我不知道如何解釋它。 我正在為我正在制作的游戲制作壁架懸掛機制,您按下任一方向即可進入壁架,但您也按下方向即可離開壁架。 這意味着當你試圖爬上窗台時,他會立即摔倒。 設定一個固定的等待時間也感覺不好……我在想它會將軸設置為 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;
        }

我嘗試了很多東西,我嘗試了很多“while”循環,只是讓游戲崩潰。 有誰知道如何解決這個問題? 如果需要,我會提供所有代碼。

編輯:在回復的幫助下,我找到了解決方案! 需要設置一個像這樣的標志,默認情況下它是假的。 但是,它也只檢查它是否為假,而 else 語句意味着它是真的,更不用說將它設置為真的唯一方法無論如何都會繞過該門。 這給出了所需的結果! 此外,雖然“while”循環似乎破壞了它,但在每次檢查中添加一個條件以在抓取時不執行它似乎可以修復它。 感謝大家!

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.
        }
    }

希望我能幫上忙! (PS請下次輸入你的代碼,以便我可以幫助你更多!)

自從您發布您的代碼以來,我的答案快速更新。 也許嘗試將您的運動代碼更改為這樣的

bool isHanging = false;
int speed; [SerializeField]

void MoveCharacter()
{
if (isHanging) return;
else  mx = speed * Input.GetAxisRaw("Horizontal");
}

從本質上講,這仍然允許您使用箭頭鍵移動,但如果您掛起,則基本上會停止您的移動代碼。 同樣從你之前的評論中,你說你顯然不能使用 Input.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.

希望我能澄清一下!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM