如何为Cursor.lockstate创建事件监听器?

时间:2017-01-01 14:47:15

标签: c# unity3d unity-webgl

我想在我的Unity 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已解锁并立即重新暂停游戏。

要解决这个问题,我想我需要创建一个事件来监听锁定状态的变化并调用该方法。而不是每帧都调用该方法。

1 个答案:

答案 0 :(得分: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;
}

<强> USAGE

只需订阅活动。

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!");
    }
}