Estoy desarrollando un juego móvil en 2D en el que el jugador debe tocar la pantalla para subir. Acabo de agregar un botón de pausa recientemente y noté que cuando hago clic en el botón cuenta como un toque en la pantalla, por lo que el reproductor sube. Básicamente, en el mismo momento exacto en que presiono el botón de pausa, el jugador salta y luego el juego se congela mientras está en el aire. ¿Hay alguna forma en que pueda hacer que el botón no cuente como un toque?
Aquí está la parte del guión del jugador que lo hace moverse:
if (Input.GetMouseButtonDown (0) && isDead == false && isKnifeDead == false && UiStartScript.uiInstance.firstClickUi == true) { rb.velocity = Vector2.up * velocity; }
Aquí está la parte de la secuencia de comandos de la interfaz de usuario para el botón de pausa:
public void PauseGame() { Time.timeScale = 0; }
Mi sistema de eventos: sistema de eventos
Mi Botón: Botón
En la secuencia de comandos U. I, agregue GameObject PlayerConrtollerScript público; En su UI Script, bajo la clase Pausgame() Agregue este código. GameObject.PlayerControllerScript.SetActive = falso;
Cuando no está en pausa, debe agregar a su secuencia de comandos que tiene el Tiempo. escala de tiempo = 1; Agrega este código. GameObject.PlayerControllerScript.SetActive = verdadero;
Después de haber agregado el código mencionado anteriormente. No olvides agregar el objeto del juego del jugador de tu jerarquía al Inspector con el script U. I, el espacio estará disponible para agregar un objeto del juego cuando te desplaces hacia abajo hasta tu script U. I.
Eso evitará que su reproductor se mueva durante la pausa.
Una forma fácil y sin necesidad de código es eliminar el código sobre la detección del toque en la pantalla y en su lugar colocar un botón que cubra toda la pantalla (botón invisible).
Ese evento de botón activaría el movimiento de la pantalla.
Puede agregar botones adicionales en la parte superior y Unity descartará automáticamente el toque de cualquier otro botón a continuación.
De esta manera, puede comenzar a agregar UI por todas partes sin verificar el código que debe considerarse.
Este es el enfoque que he hecho. Creo un par de trucos usando Event System y Canvas para aprovechar la entrada del mouse, no necesitas el uso de las funciones de actualización para hacer el juego básico.
Aquí está mi proyecto de ejemplo: TapAndJump en Github
Verifique los GameObjects llamados "Panel de clic" y "Botón de pausa" y los métodos vinculados respectivos.
SaltarConTap.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 }
Me guié por su ejemplo de código y así sucesivamente; sea libre de modificar y solicitar cualquier problema.