繁体   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