默认样式

修改鼠标指针的默认样式,最简单的方式就是在 Unity 的项目设置中直接修改。步骤如下:

  1. 选择需要使用的图片,更改图片格式为 Cursor;

    image.png

  2. 打开 Project Settings,在 Player Settings 中修改 Default Cursor 为这张图片即可。

    image.png

  3. 运行游戏,鼠标就生效了。

    20240926-1441-24.7500997.mp4

动态样式

如果想在不同状态下显示不同的光标效果,或者设置鼠标点击的热点位置,则需要通过代码进行修改:

Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto);

其中第一个参数为 Texture2D,第二个参数为鼠标热点的偏移量(距离图片左上角的偏移量)。

如果需要在指向某一 GameObject 时,鼠标指针产生不同的效果,那需要实现额外的接口代码:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Test· : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerUpHandler, IPointerDownHandler
{
    public Button _button;
    public Texture2D cursorTexture; //进入物体时的图标

    //进入物体时效果
    void OnMouseEnter()
    {
        Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto);
    }
    
    //离开物体后重置
    void OnMouseExit()
    {
        Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
    }
}

将此脚本挂载在被触发的物体上,同时将不同状态的图标绑定在脚本中对应的变量上即可。

如果要相应 UI 上的事件,如按钮点击,则向点击的响应事件上添加相应逻辑即可。

public class Test2 : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerUpHandler, IPointerDownHandler
{ 
  	public Button _button;
    public Texture2D cursorTexture1; //聚焦时效果
    public Texture2D cursorTexture2; //点按的效果
    public Texture2D cursorTexture3; //点击的效果

    private void Awake()
    {
        _button.onClick.AddListener(Cursor.SetCursor(cursorTexture3, Vector2.zero, CursorMode.Auto));
    }
    
    //鼠标聚焦时效果
    public void OnPointerEnter(PointerEventData eventData)
    {
        Cursor.SetCursor(cursorTexture1, Vector2.zero, CursorMode.Auto);
    }
    
    //鼠标离开后重置
    public void OnPointerExit(PointerEventData eventData)
    {
        Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
    }
    
    //鼠标点按效果
    public void OnPointerDown(PointerEventData eventData)
    {
        Cursor.SetCursor(cursorTexture2, Vector2.zero, CursorMode.Auto);
    }
    
    //鼠标释放后重置
    public void OnPointerUp(PointerEventData eventData)
    {
        Cursor.SetCursor(cursorTexture1, Vector2.zero, CursorMode.Auto);
    }
}