将 Texture2D 设置为"None"当默认值为其他内容时


public void OnPointerEnter(PointerEventData data)
{
Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
}

我在游戏中的每个 UI 上都设置了此方法(和退出方法(。但是,当我将其设置为 null 时,它会转到 DEFAULT 光标。现在有了 Unity,我已经转到了项目设置,并为用户设置了一个自定义光标。但是,当用户转到UI时,我希望光标Texture2D为"None",将其设置为null仅将其设置为我开始使用的自定义光标。

我知道我可以执行"void Start(("并简单地将光标设置为我的自定义光标,并将默认光标设置为"无",但由于此脚本在我的游戏中的每个 UI 上运行,因此将我的默认设置设置为自定义脚本并使用 c# 在某些情况下将其设置为"无"更有意义。

我同意HumanWrites的观点。当您在"玩家设置"菜单中设置默认光标时,您将覆盖 Unity None 光标,实际上在构建后它不存在。 如果我要使用自定义默认光标并使用 unity none 光标作为 UI 焦点光标,我会在 MainController 中设置光标,或者在任何 UI 中设置一次光标。喜欢这个:

[SerializeField]
private Texture2D cursorTexture;
private static bool defaultCursorNotSet = true;
private void Awake()
{
if (defaultCursorNotSet)
{
defaultCursorNotSet = false;
SetCustomCursor();
}
}
public void OnPointerEnter(PointerEventData data)
{
SetNoneCursor();
}
public void OnPointerExit(PointerEventData data)
{
SetCustomCursor();
}
private void SetNoneCursor()
{
Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
}
private void SetCustomCursor()
{
Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto);
}

即使您可以在静态方法中加载自定义Tuxture,也可以这样做:

public class CursorHandler : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
private static Texture2D cursorTexture;
static CursorHandler()
{
cursorTexture = ...
SetCustomCursor();
}
public void OnPointerEnter(PointerEventData data)
{
SetNoneCursor();
}
public void OnPointerExit(PointerEventData data)
{
SetCustomCursor();
}
private static void SetNoneCursor()
{
Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
}
private static void SetCustomCursor()
{
Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto);
}
}

更新的答案:

你想做什么是不可能的。

您需要将播放器设置中的 DefaultCursor 设置为"无",然后在要使用自定义光标时显式设置光标,从而允许 SetCursor(null, Vector2.zero, CursorMode.Auto( 引用系统指针光标。

创建 CursorManager 脚本并从需要更新光标的任何 UI 元素访问该脚本可能是值得的。 在该脚本中,您可以编写如下方法:

public Texture2D GetCursor(string aCursor) {
switch (aCursor) {
case "none":
return null;
case "custompointer":
return ...
// Rest of implementation goes here
}
}

然后,为 UI 元素提供对该脚本的引用,并在需要时调用该方法。

public void OnPointerEnter(PointerEventData data)
{
Cursor.SetCursor(CursorManager.GetCursor("none"), Vector2.zero, CursorMode.Auto);
}

原始答案(不起作用(:

下面的方法不起作用,因为虽然您可以通过代码设置 PlayerSettings.defaultCursor,但它不能在运行时更新或更改。 它将在构建时设置 defaultCursor。

在 OnPointerEnter 方法上,您希望使用默认系统游标,您需要在当前 SetCursor 调用之前加上 PlayerSettings.defaultCursor 赋值。 我还没有测试过这个,但以下内容应该有效。

PlayerSettings.defaultCursor = null;
Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);

然后,将 PlayerSettings.defaultCursor 设置为 OnPointerExit 方法上的自定义默认光标 Texture2D。

最新更新