C# 如何为Cursor.lockstate创建事件侦听器?

C# 如何为Cursor.lockstate创建事件侦听器?,c#,unity3d,unity-webgl,C#,Unity3d,Unity Webgl,我想在unity WebGL游戏中添加一个事件侦听器,用于更改Cursor.lockState 如果光标被锁定,我想取消游戏暂停。如果我检测到光标已解锁,我想暂停 这是我到目前为止所拥有的 using UnityEngine; using System.Collections; public class Pause : MonoBehaviour { public RotateCamera rotateCamera; public GameObject pauseMenu; private

我想在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被解锁,并立即重新暂停游戏
为了解决这个问题,我想我需要创建一个事件来侦听锁状态的更改并调用该方法。而不是每帧调用一个方法

我想我需要创建一个事件来侦听锁中的更改 状态并调用该方法。而不是每次调用该方法 框架

这很简单。不要直接使用API。围绕它包装另一个类,然后使用属性getter和setter实现一个简单的事件系统。查看Unity的事件和代理教程

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

嗨,谢谢你的回复。我需要直接监视Cursor.lockState。原因是浏览器/Unity webGL正在修改Cursor.lockState,我不能依靠它来使用建议的“SetCursor”属性。我需要知道是否有一种方法可以将事件/委托添加到Cursor.lockstate。“我不能依靠它来使用您建议的‘SetCursor’属性。”我不理解您的评论。问题是关于洛克州。我添加了visible和SetCursor作为奖励。这三个函数应该触发一个事件。这个解决方案有什么问题?