2017-01-01 29 views
0

我想在我的統一WebGL遊戲中添加一個事件監聽器來更改Cursor.lockState。如何爲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

我想我需要創建一個事件來監聽鎖 狀態的變化並調用該方法。而不是每個 幀被調用的方法。

這很簡單。請勿直接使用Cursor API。圍繞它包裝另一個類,然後使用屬性getter和setter來實現一個簡單的事件系統。查看Unity的活動和代表教程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