【Unity3DRPG入门学习笔记第六卷】SetCursor 设置鼠标指针

在上一卷使用了 UnityEvent,还用了序列化,在编辑器界面拖拽绑定事件对象,不太好维护,本卷换一种方式实现,先看 MouseManager.cs 中的更改

using System;
public event Action<Vector3> m_OnMouseClicked;  // 鼠标点击事件

MouseManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class MouseManager : MonoBehaviour
{
    [Header("鼠标控制移动参数")]
    private RaycastHit m_HitInfo;                   // 射线击中信息
    private static MouseManager m_Instance;         // 单例对象

    public event Action<Vector3> m_OnMouseClicked;  // 鼠标点击事件
    public Texture2D m_Point, m_Doorway, m_Attack, m_Target, m_Arrow;   // 鼠标指针纹理

    // --- private -------------------------------------
    private MouseManager() { }

    private void Awake()
    {
        m_Instance = this;  // 初始化单例
    }

    private void Update()
    {
        SetCursorTexture(); // 切换鼠标贴图
        MouseControl();     // 鼠标控制
    }

    // --- public --------------------------------------
    public static MouseManager GetInstance()
    {
        if (m_Instance == null)
            m_Instance = new MouseManager();
        return m_Instance;
    }


    // --- private -------------------------------------
    /// <summary>
    /// @brief 切换鼠标贴图
    /// </summary>
    private void SetCursorTexture()
    {
        // 获取相机到鼠标点击点的射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out m_HitInfo))
        {
            // 更换鼠标纹理
            switch (m_HitInfo.collider.gameObject.tag)
            {
                case "Ground":
                    Cursor.SetCursor(m_Target, new Vector2(16, 16), CursorMode.Auto);
                    break;
            }
        }
    }

    /// <summary>
    /// @brief 鼠标控制
    /// </summary>
    private void MouseControl()
    {
        // 如果在边界内点击了左键
        if (Input.GetMouseButtonDown(0) && m_HitInfo.collider != null)
        {
            if (m_HitInfo.collider.gameObject.CompareTag("Ground")) // 如果是地面
                m_OnMouseClicked?.Invoke(m_HitInfo.point);          // 如果对象不为空,则调用所有已注册的回调
        }
    }
}

PlayerController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class PlayerController : MonoBehaviour
{
    private NavMeshAgent m_Agent;   // 导航网格动力源

    private void Awake()
    {
        m_Agent = GetComponent<NavMeshAgent>();
    }

    private void Start()
    {
        // 添加事件调用的方法
        MouseManager.GetInstance().m_OnMouseClicked += MoveToTarget;
    }

    private void Update()
    {
        
    }

    /// <summary>
    /// @brief 移动到目标点
    /// </summary>
    /// <param name="target"></param>
    public void MoveToTarget(Vector3 target)
    {
        m_Agent.destination = target;
    }
}

本卷演示



The End.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值