(Unity - C#) 按钮触发其他事件的问题

时间:2021-02-09 01:21:39

标签: c# unity3d mobile 2d

我正在开发一款 2D 手机游戏,玩家可以点击屏幕向上移动。我最近刚刚添加了一个暂停按钮,我注意到当我单击该按钮时,它会被视为点击屏幕,因此播放器会上升。基本上,在我按下暂停按钮的同一时刻,玩家跳跃,然后游戏在他在半空中时冻结。有没有办法让我的按钮不算是轻按?

这是让他移动的玩家脚本部分:

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

这是暂停按钮的 UI 脚本部分:

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

我的事件系统: EventSystem

我的按钮: Button

3 个答案:

答案 0 :(得分:0)

嘿,伙计,希望这会有所帮助。

在 U. I 脚本中添加 公共游戏对象 PlayerConrtollerScript; 在您的 U.I 脚本中,在 Pausgame() 类下 添加此代码。 GameObject.PlayerControllerScript.SetActive = false;

取消暂停时,您需要添加到具有 时间。时间刻度 =1; 添加此代码。 GameObject.PlayerControllerScript.SetActive = true;

添加上述代码后。不要忘记使用 U.I 脚本将玩家游戏对象从您的层次结构添加到检查器中,当您向下滚动到您的 U.I 脚本时,该空间将可用于添加游戏对象。

希望它对您有用,如果您遇到困难,请告诉我。我会尽力帮助你。

这将阻止您的播放器在暂停期间四处移动。

答案 1 :(得分:0)

一个不需要代码的简单方法是删除有关检测屏幕点击的代码,而是放置一个覆盖整个屏幕的按钮(不可见按钮)。

那个按钮事件会触发屏幕移动。

您可以在顶部添加额外的按钮,Unity 将自动丢弃下方任何其他按钮的点击。

通过这种方式,您可以开始添加 UI,而无需检查应考虑的代码。

答案 2 :(得分:-1)

这是我完成的方法。我使用事件系统和画布创建了一些技巧来利用鼠标输入,您不需要使用更新功能来进行基本的游戏。

这是我的示例项目:TapAndJump on Github

<块引用>

检查名为“单击面板”和“暂停按钮”的游戏对象,然后 各自的链接方法。

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
}

我以您的代码示例等为指导;可以自由修改和请求任何问题。

相关问题