2017-01-01 8 views
0

Я хотел бы добавить прослушиватель событий для изменений в Cursor.lockState в моей единственной игре WebGL.Как создать прослушиватель событий для Cursor.lockstate?

Если курсор заблокирован, я хотел бы приостановить игру. Если я обнаружу, что курсор был разблокирован, я хотел бы сделать паузу.

Вот то, что я до сих пор

using UnityEngine; 
using System.Collections; 

public class Pause : MonoBehaviour { 

public RotateCamera rotateCamera; 
public GameObject pauseMenu; 
private bool paused; 

void Update() 
{ 
    if (paused) 
    { 
     if (Input.GetMouseButtonDown(0)) 
     { 
      UnpauseGame(); 
      return; 
     } 
    } 
    if (Cursor.lockState == CursorLockMode.Locked) 
    { 
     Debug.Log("CursorLockMode = Locked"); 
     UnpauseGame(); 
     return; 
    } 
    if (Cursor.lockState == CursorLockMode.Confined) 
    { 
     Debug.Log("CursorLockMode = Confined"); 
     UnpauseGame(); 
     return; 
    } 

    if (Cursor.lockState == CursorLockMode.None && paused == false) 
    { 
     Debug.Log("CursorLockMode = None"); 
     PauseGame(); 
    } 
} 

public void PauseGame() 
{ 
    Cursor.lockState = CursorLockMode.None; 
    Cursor.visible = true; 
    paused = true; 
    pauseMenu.SetActive(true); 
} 

public void UnpauseGame() 
{ 
    Cursor.lockState = CursorLockMode.Locked; 
    Cursor.visible = false; 
    paused = false; 
    pauseMenu.SetActive(false); 
} 
} 

Проблема заключается в том

  • При попытке возобновите игру с кнопки мыши игра мгновенно останавливается сама. Я считаю, что скрипт обнаруживает, что cursor.lockstate разблокирован и мгновенно переустанавливает игру.

Чтобы исправить это, я думаю, мне нужно создать событие, которое прослушивает изменения в состоянии блокировки и вызывает метод. Вместо метода, называемого каждым кадром.

ответ

0

Мне кажется, мне нужно создать событие, которое прослушивает изменения в замке и вызывает метод. Вместо метода, который вызывается каждый кадр .

Это просто. Не используйте API Cursor. Оберните другой класс вокруг него, затем используйте свойство getter и setter для реализации простой системы событий. Ознакомьтесь с учебным курсом Unity's Events и Delegates here.

Обертка AdvanceCursor.cs:

public class AdvanceCursor 
{ 
    //Not needed but included just because Cursor has a pulbic constructor 
    private Cursor cursor; 

    public AdvanceCursor() 
    { 
     cursor = new Cursor(); 
    } 

    public static CursorLockMode lockState 
    { 
     set 
     { 
      Cursor.lockState = value; 

      //Notify Event 
      if (OnLockStateChanged != null) 
      { 
       OnLockStateChanged(value); 
      } 
     } 

     get { return Cursor.lockState; } 
    } 

    public static bool visible 
    { 
     set 
     { 
      Cursor.visible = value; 

      //Notify Event 
      if (OnVisibleChanged != null) 
      { 
       OnVisibleChanged(value); 
      } 
     } 

     get { return Cursor.visible; } 
    } 

    public static void SetCursor(Texture2D texture, Vector2 hotspot, CursorMode cursorMode) 
    { 
     Cursor.SetCursor(texture, hotspot, cursorMode); 

     //Notify Event 
     if (OnTextureChanged != null) 
     { 
      OnTextureChanged(texture, hotspot, cursorMode); 
     } 
    } 

    /////////////////////////////////////////////EVENTS////////////////////////////////// 

    //Event For LockState 
    public delegate void cursorLockStateAction(CursorLockMode lockMode); 
    public static event cursorLockStateAction OnLockStateChanged; 

    //Event For visible 
    public delegate void cursorVisibleAction(bool visible); 
    public static event cursorVisibleAction OnVisibleChanged; 

    //Event For Texture Change 
    public delegate void cursorTextureAction(Texture2D texture, Vector2 hotspot, CursorMode cursorMode); 
    public static event cursorTextureAction OnTextureChanged; 
} 

ПРИМЕНЕНИЕ:

Просто подписаться на события.

public class CursorTest: MonoBehaviour 
{ 
    void Start() 
    { 
     AdvanceCursor.lockState = CursorLockMode.Locked; 
     AdvanceCursor.visible = true; 
     //AdvanceCursor.SetCursor(...); 
    } 

    //Subscribe to Events 
    void OnEnable() 
    { 
     AdvanceCursor.OnLockStateChanged += OnCursorLockStateChanged; 
     AdvanceCursor.OnVisibleChanged += OnCursorVisibleChanged; 
     AdvanceCursor.OnTextureChanged += OnCursorTextureChange; 
    } 

    //Un-Subscribe to Events 
    void OnDisable() 
    { 
     AdvanceCursor.OnLockStateChanged -= OnCursorLockStateChanged; 
     AdvanceCursor.OnVisibleChanged -= OnCursorVisibleChanged; 
     AdvanceCursor.OnTextureChanged -= OnCursorTextureChange; 
    } 

    void OnCursorLockStateChanged(CursorLockMode lockMode) 
    { 
     Debug.Log("Cursor State changed to: " + lockMode.ToString()); 
    } 

    void OnCursorVisibleChanged(bool visible) 
    { 
     Debug.Log("Cursor Visibility is now: " + visible); 
    } 

    void OnCursorTextureChange(Texture2D texture, Vector2 hotspot, CursorMode cursorMode) 
    { 
     Debug.Log("Cursor Texture Changed!"); 
    } 
} 
+0

привет, спасибо за ваш ответ. Мне нужно напрямую контролировать Cursor.lockState. Причина в том, что Cursor.lockState модифицируется браузером/Unity webGL, я не могу полагаться на него, чтобы использовать ваше предлагаемое свойство SetCursor. Мне нужно было знать, есть ли способ добавить событие/делегат в Cursor.lockstate. – Jim

+0

«Я не могу полагаться на это, чтобы использовать предлагаемое свойство« SetCursor ». Я не понимаю ваш комментарий. Вопрос о lockState. Я добавил видимый и SetCursor в качестве бонуса. Три функции должны инициировать событие. Какая у вас проблема с этим решением? – Programmer