0

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

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

4

1 回答 1

0

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

这很简单。不要Cursor直接使用 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!");
    }
}
于 2017-01-01T16:13:35.100 回答