C# 如何为Cursor.lockstate创建事件侦听器?
我想在unity WebGL游戏中添加一个事件侦听器,用于更改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
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被解锁,并立即重新暂停游戏
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作为奖励。这三个函数应该触发一个事件。这个解决方案有什么问题?