簡體   English   中英

(Unity - C#) 按鈕觸發其他事件的問題

[英](Unity - C#) Problems with buttons triggering other events

我正在開發一款 2D 手機游戲,玩家應該在屏幕上點擊 go 向上。 我最近剛剛添加了一個暫停按鈕,我注意到當我單擊該按鈕時,它會被視為在屏幕上的點擊,因此播放器會上升。 基本上,在我按下暫停按鈕的同一時刻,玩家跳躍,然后游戲在他在半空中時凍結。 有沒有辦法讓按鈕不被視為點擊?

下面是讓他移動的玩家腳本部分:

            if (Input.GetMouseButtonDown (0) && isDead == false && isKnifeDead == false && UiStartScript.uiInstance.firstClickUi == true) {
            rb.velocity = Vector2.up * velocity;
        }

這是暫停按鈕的 UI 腳本的一部分:

public void PauseGame()
{
    Time.timeScale = 0;
}

我的事件系統:事件系統

我的按鈕:按鈕

嘿,伙計,希望這會有所幫助。

在 U. 我腳本添加公共 GameObject PlayerConrtollerScript; 在您的 UI 腳本中,在 class Pausgame() 下添加此代碼。 GameObject.PlayerControllerScript.SetActive = false;

未暫停時,您需要添加到具有時間的腳本中。 時間刻度=1; 添加此代碼。 GameObject.PlayerControllerScript.SetActive = true;

添加上述代碼后。 不要忘記使用 U.I 腳本將玩家游戲 object 從您的層次結構添加到 Inspector 中,當您向下滾動到 U.I 腳本時,該空間將可用於添加游戲 object。

希望它對您有用,如果您遇到困難,請告訴我。 我會盡力幫助你。

這將阻止您的播放器在暫停期間四處移動。

一個不需要代碼的簡單方法是刪除關於檢測屏幕上的點擊的代碼,而是放置一個覆蓋整個屏幕的按鈕(隱形按鈕)。

該按鈕事件將觸發屏幕移動。

您可以在頂部添加額外的按鈕,Unity 將自動放棄來自下方任何其他按鈕的點擊。

通過這種方式,您可以開始添加 UI,而無需簽入應考慮的代碼。

這是我已經完成的方法。 我使用事件系統和 Canvas 創建了一系列技巧來利用鼠標輸入,您不需要使用更新功能來進行基本游戲。

這是我的示例項目: Github 上的 TapAndJump

檢查名為“單擊面板”和“暫停按鈕”的游戲對象以及相應的鏈接方法。

JumpWithTap.cs

using UnityEngine;

public class JumpWithTap : MonoBehaviour
{
    [SerializeField] private UIHandler uiHandler;
    [SerializeField] private float jumpPower = 5f;
    
    private Rigidbody2D rb2D;
    private int counter;

    #region Class Logic
    public void Jump()
    {
        rb2D.velocity = Vector2.up * jumpPower;
        uiHandler.SetNumberToCounter(++counter);
    }
    #endregion

    #region MonoBehaviour API
    private void Awake()
    {
        rb2D = GetComponent<Rigidbody2D>();
    }
    #endregion
}

UIHandler.cs

using UnityEngine;
using UnityEngine.UI;

public class UIHandler : MonoBehaviour
{
    [SerializeField] private Text counterText;
    [SerializeField] private Text pauseText;
    [SerializeField] private Image clickPanel;

    private bool isPaused = false;
    public bool IsPaused
    {
        get { return isPaused; }
        set 
        {
            pauseText.gameObject.SetActive(value);
            isPaused = value; 
        }
    }

    #region Class Logic
    public void SetNumberToCounter(int number) => counterText.text = number.ToString();

    public void DisableClickPanel() => clickPanel.raycastTarget = !clickPanel.raycastTarget;


    public void PauseGame()
    {
        IsPaused = !IsPaused;
        DisableClickPanel();
        // Time.timeScale = IsPaused == true ? 0 : 1; // If you want keep the Physics (ball fall) don't stop the time.
    }
    #endregion
}

我以您的代碼示例等為指導; 可以自由修改和請求任何問題。

暫無
暫無

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

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