在上一卷使用了 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.

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

  1. 【Unity3DRPG入门学习笔记第五卷】MouseManager 鼠标控制人物移动

    创建一个空物体用来管理鼠标脚本 添加脚本 MouseManager.cs 示例代码: using System.Collections; using System.Collections.Generi ...

  2. 【Unity3DRPG入门学习笔记第七卷】Cinemachine Post Processing 摄像机跟踪和后处理

    一.相机跟随 1. 安装 Cinemachine 插件 2. 在 Hierarchy 面板中右键创建 Virtual Camera 3. 设置 Virtual Camera 参数 角色的中心默认在脚那 ...

  3. 【Unity3DRPG入门学习笔记第二卷】Build Level 熟悉基本工具

    一.更换默认天空盒 1. 隐藏 Scene 天空盒 2. 导入天空盒素材 选择素材的时候看是否支持 URP 下载导入素材即可 有时候下载连接有问题,选择在 Unity 中打开就可以- 默认导入应该也是 ...

  4. 量子计算入门学习笔记(六 量子测量-上 )

    经过了万恶的期末考试 之后,我们再次重新踏上量子学习的不归路(手动狗头)! 如果您是第一次观看我的博客,如果您也是和我一样刚入门量子力学或是量子计算相关的学习,纠结于量子计算的抽象与晦涩难懂,那么本专 ...

  5. 知识图谱入门学习笔记(六)-关系抽取

    目录 0 前言: 1 语义关系: 1.1  句法关系 1.1.1 替代关系​ 1.1.3 同现关系(Relations of Co-occurence) 2 关系抽取的用处 2.1 关系抽取中的特征 ...

  6. 【Unity3DRPG入门学习笔记第四卷】Navigation 智能导航地图烘培

    一.使用 Navigation 打开 Navigation 窗口 地面选择静态的(Navigation Static) 先处理地面,地面是可以行走的 (Walkable),树木占用的地方是不能行走的 ...

  7. 【Unity3DRPG入门学习笔记第一卷】创建项目导入素材

    一.创建 3D (Core) 项目 1. 安装 Universal RP 2. 创建 New Universal Render Pipeline Asset 3. 项目设置 4. 导入素材 在选择的素 ...

  8. 【OpenCV入门学习笔记1】:Mat对象的指针操作和掩膜操作

    b站:https://www.bilibili.com/video/BV1uW411d7Wf?p=5 下面是我在b站上看视频学习的笔记和操作的示例代码 实例代码 #include<opencv2 ...

  9. JavaScript学习笔记(六)(Jquery入门)

    JavaScript学习笔记(六) 一.jQuery是什么? 二.jQuery的安装 三.载入事件区别 四.jQuery对象和DOM对象的区别 DOM对象和Jquery对象互转 五.选择器 5.1 j ...

最新文章

  1. Application Architecture - Table Data Gateway
  2. sharedpreferences 重启不保存_MMKV为什么可以替换SharedPreferences
  3. SAP UI5 BarcodeScannerButton 的初始化逻辑 - feature 检测,Cordova API 检测等逻辑
  4. 学数据库你竟然不用用JAVA写代码,可惜你遇到了我! JAVA连接数据库(JDBC)的安装使用教程
  5. 每日一笑 | 为什么英语老师让我们养成背单词的习惯?
  6. python打包成安装包_把 python 程序打包成 egg 或者 whl 安装包
  7. 关于java设计模式与极品飞车游戏的思考
  8. java jdbc jar包_通过 Spring 框架如何进行JDBC操作呢?
  9. 秦始皇嬴姓、赵氏,那“秦”是姓还是氏呢?
  10. arduino液位传感器_「雕爷学编程」Arduino动手做(24)——水位传感器模块
  11. Windows 8 系统安装
  12. 基于Node.js打造Web在线聊天室
  13. 计算机老出现安全警报怎么办,windows安全警报怎么关闭,教您怎么关闭windows安全警报...
  14. python csv写文件,用Excel打开中文乱码解决
  15. Mysql数据处理函数/单行处理函数
  16. 如何在H5页面中实现长按二维码关注微信公众号?
  17. Qt5中使用lambda表达式
  18. 杰里之电流声/杂音【篇】
  19. 玩了一下 SAP Fiori ABAP编程模型
  20. 分步傅里叶算法_分布快速傅里叶算法,split-step fast fourier transformed,音标,读音,翻译,英文例句,英语词典...

热门文章

  1. 芝加哥大学计算机语言学,芝加哥大学cs专业值得申请么?
  2. 微软向公众开放与新冠病毒相关的黑客攻击活动的威胁数据
  3. 8. 【gRPC系列学习】resetTransport建立TCP连接流程
  4. 实习日/周/月记学习计划(第一周)
  5. 视频号关联账号超1000个!品牌矩阵如何在视频号上“风生水起”?
  6. 【Qt】cmake 手册
  7. 计算机动画算法与编程基础pdf,清华大学 计算机动画算法与编程基础2-图形绘制课件.ppt...
  8. android jni中的java调c的两种方法
  9. StackOverflow网友Bert F发帖提问:哪本最具影响力的书,是每个程序员都应该读的?...
  10. 「Unity2D」使用Unity创建一个2D游戏系列-1