我想在我的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);
}
}
问题是
要解决这个问题,我想我需要创建一个事件来监听锁定状态的变化并调用该方法。而不是每帧都调用该方法。
答案 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!");
}
}