跳到主要内容

CursorManager

重要 注意 提醒

Coding Style wiki


CursorManagerCursorSystem游标管理器 (MonoBehaviour 单例),管理 Inspector 上配置的 CursorState 状态列表,并在 Update 驱动动态游标的序列帧动画;可通过 Samples 导入 CursorManager Prefab 拖拽至启动场景,或由 Cursors 门面自动创建。

命名空间OxGKit.CursorSystem
类型[DisallowMultipleComponent] public class CursorManager : MonoBehaviour
源码CursorManager.cs
using OxGKit.CursorSystem;

提醒 CursorManager 的实例方法与 Cursors 静态门面一一对应 (单例的获取方法为 internal),建议一律通过 Cursors 调用,无需自行持有实例引用。

快速上手

using OxGKit.CursorSystem;

// CursorManager 由 Cursors 门面自动查找或创建 (单例)
Cursors.InitInstance();

// 在 Inspector 配置 Cursor States 后,即可按名称切换
Cursors.SetCursorState("Loading");

通用规则

单例与生命周期

  1. 首次通过 Cursors 访问时,会自动查找场景上的 CursorManager;找不到则自动创建 [CursorManager] 节点。
  2. Awake 时会自动整理至 OxGKit 容器节点下并 DontDestroyOnLoad 常驻,同时将当前状态初始为列表第一条。
  3. Start 时会重置渲染 (应用默认状态);UpdateIgnore Time Scale 设置驱动当前状态的动态游标动画。
  4. OnEnable 会重置回默认状态;OnDisable 会移除游标渲染 (恢复系统游标)。

Inspector 成员

成员说明
Ignore Time Scale动态游标动画是否忽略 Time.timeScale (默认 true,使用 Time.unscaledDeltaTime 驱动)。
List Cursor StatesCursorState 状态列表,第一条即为默认状态 (内置一条 Default 状态,frameRate 为 30)。

方法总览

方法说明
SetIgnoreScale设置动态游标动画是否忽略 Time.timeScale。
GetCurrentCursorLockState获取当前游标锁定模式。
SetCursorLockState设置游标锁定模式。
IsCursorVisible检查游标是否显示。
SetCursorVisible设置游标显示开关。
SetScaleToAllCursors设置所有游标状态的缩放比例并重置渲染。
GetAllCursorStates获取所有游标状态。
GetCursorState获取指定名称的游标状态。
GetCurrentCursorState获取当前游标状态。
SetCursorState按名称切换游标状态。
ResetCursorState重置回默认状态 (列表第一条)。
ResetRender重置当前游标状态的渲染。
RemoveCursorRender移除游标渲染 (恢复系统游标)。

SetIgnoreScale

public void SetIgnoreScale(bool ignore)

设置动态游标动画更新是否忽略 Time.timeScale (默认 true,使用 Time.unscaledDeltaTime 驱动)。

GetCurrentCursorLockState

public CursorLockMode GetCurrentCursorLockState()

获取当前游标锁定模式 (即 Cursor.lockState)。

SetCursorLockState

public void SetCursorLockState(CursorLockMode cursorLockMode)

设置游标锁定模式 (NoneLockedConfined)。

IsCursorVisible

public bool IsCursorVisible()

检查返回游标当前是否显示 (即 Cursor.visible)。

SetCursorVisible

public void SetCursorVisible(bool visible)

设置游标显示开关 (即 Cursor.visible)。

SetScaleToAllCursors

public void SetScaleToAllCursors(Vector2 scale)

设置所有游标状态的缩放比例并重置渲染 (缩放仅在 scalingEnabled + ForceSoftware 时生效)。

GetAllCursorStates

public CursorState[] GetAllCursorStates()

获取所有已配置的游标状态 (CursorState)。

GetCursorState

public CursorState GetCursorState(string stateName)

获取指定名称的游标状态,找不到返回 null

GetCurrentCursorState

public CursorState GetCurrentCursorState()

获取当前游标状态。

SetCursorState

public bool SetCursorState(string stateName)

按名称切换游标状态并重置渲染,切换成功返回 true;找不到该名称返回 false

ResetCursorState

public void ResetCursorState()

重置游标状态为默认状态 (列表第一条) 并重置渲染。

ResetRender

public void ResetRender()

重置当前游标状态的渲染。

RemoveCursorRender

public void RemoveCursorRender()

移除游标渲染 (将当前状态置空并恢复系统默认游标);若要恢复自定义游标渲染,请调用 ResetCursorState 重新初始并重置渲染。


CursorState

游标状态 (可序列化,嵌套于 CursorManager),定义单一游标状态的渲染类型、贴图、热点与动画参数;可在 Inspector 上配置,也可通过 Cursors.GetCursorState 获取后在运行时动态调整 (例如指定从 AssetBundle 加载的贴图)。

类型[Serializable] public class CursorState
源码CursorManager.cs

成员

成员说明
public string stateName状态名称 (运行时切换的依据)。
public RenderType renderType静态或动态游标类型,默认 Static
public CursorMode cursorModeCursor 渲染模式 (Auto / ForceSoftware),默认 Auto
public bool scalingEnabled缩放开关,默认 false (缩放仅支持 ForceSoftware 渲染模式)。
public Vector2 scale缩放比例,默认 (1, 1) (需启用 scalingEnabled 才会生效)。
public Vector2 hotspot游标热点位置,默认 (0, 0)
public Texture2D staticCursorTexture静态游标贴图。
public List<Texture2D> dynamicCursorTextures动态游标序列帧。
public bool isLoop动态游标是否循环播放,默认 false
public PlayMode playMode动态游标播放模式,默认 Normal
public int frameRate动态游标播放速率 (FPS),字段默认 0 (需大于 0 动画才会播放)。

RenderType

定义静态或动态游标类型。

public enum RenderType
{
Static, // 静态游标
Dynamic // 动态游标 (序列帧动画)
}

PlayMode

定义动画的播放模式。

public enum PlayMode
{
Normal, // 顺放
Reverse, // 倒放
PingPong, // 顺放 -> 倒放
PingPongReverse // 倒放 -> 顺放
}

注意 未开启 isLoop 时,Normal / Reverse 播放至最后一帧即停止;PingPong / PingPongReverse 则完成一次来回后停止。

方法总览

方法说明
GetStateName获取状态名称。
SetStateName设置状态名称。
SetRenderType设置渲染类型 (静态/动态)。
SetCursorMode设置 Cursor 渲染模式。
SetCursorScale设置缩放比例。
SetCursorOffset设置游标热点位置。
SetStaticCursor设置静态游标贴图并立即应用渲染。
SetDynamicCursor替换动态游标序列帧并重置动画。
SetFrameRate设置播放速率。
SetLoop设置循环开关。
ResetRender按渲染类型重置渲染。
DriveUpdate驱动动态游标动画更新 (由 CursorManager 自动调用)。

GetStateName

public string GetStateName()

获取状态名称。

SetStateName

public void SetStateName(string stateName)

设置状态名称。

SetRenderType

public void SetRenderType(RenderType renderType)

设置渲染类型 (RenderType 静态/动态)。

SetCursorMode

public void SetCursorMode(CursorMode cursorMode)

设置 Cursor 渲染模式 (Auto / ForceSoftware)。

SetCursorScale

public void SetCursorScale(Vector2 scale)

设置缩放比例 (需启用 scalingEnabledForceSoftware 模式才会生效)。

SetCursorOffset

public void SetCursorOffset(Vector2 offset)

设置游标热点位置 (hotspot)。

SetStaticCursor

public void SetStaticCursor(Texture2D t2d = null)

设置静态游标贴图并立即应用渲染t2d 传入 null 时,直接以当前 staticCursorTexture 重新应用 (ForceSoftware 模式下若启用缩放,会应用缩放后的贴图)。

// 运行时动态指定贴图 (例如从 AssetBundle 加载)
var cursorState = Cursors.GetCursorState("Default");
cursorState.SetStaticCursor(tex);

SetDynamicCursor

public void SetDynamicCursor(Texture2D[] t2ds)

替换动态游标序列帧并重置动画参数 (从头播放)。

// 运行时替换序列帧与参数调整
var cursorState = Cursors.GetCursorState("Loading");
cursorState.SetDynamicCursor(texture2ds);
cursorState.SetFrameRate(12);
cursorState.SetLoop(true);
cursorState.ResetRender();

注意 SetStaticCursor / SetDynamicCursor 不会变更 renderType;若要切换该状态的渲染类型,请调用 SetRenderType 后再 ResetRender

SetFrameRate

public void SetFrameRate(int frameRate)

设置动态游标播放速率 (FPS)。

SetLoop

public void SetLoop(bool isLoop)

设置动态游标循环开关。

ResetRender

public void ResetRender()

按渲染类型重置渲染 (Static 重新应用静态贴图;Dynamic 重置动画参数重新播放)。

DriveUpdate

public void DriveUpdate(float dt)

驱动动态游标的序列帧动画更新,由 CursorManagerUpdate 自动调用 (一般无需自行调用)。