Unity3D实战【六】SetCursor 设置鼠标指针

2023-11-19

一、修改人物移动的方法
上一节使用的是将人物拖拽的方法实现人物移动,这一节我们进行修改一下

首先打开mousemanger脚本代码

//单例模式
//首先创建一个自身的static变量,通常取名Instance
public static MouseManger Instance;

void Awake()
{
	if (Instance != null)
		Destroy(gameObject);
	Instance = this;
}

在Script文件夹下创建Manager文件夹专门存放Manager类的脚本代码,MouseManger放到里面


二、Script文件夹下创建Characters文件夹
创建PlayerController脚本文件,拖给人物,然后双击打开

using UnityEngine;
using UnityEngine.AI;

public class PlayerController : MonoBehaviour
{
    private NavMeshAgent agent;

    void Awake()
    {
        agent = GetComponent<NavMeshAgent>();//在Awake函数中初始化    
    }

    void Start()
    {
        MouseManger.Instance.OnMouseClicked += MoveToTarget;//将函数注册到事件中
    }

    /// <summary>
    /// 因为要注册到OnMouseClick函数,所以函数参数类型也得一样
    /// </summary>
    /// <param name="target"></param>
    public void MoveToTarget(Vector3 target)
    {
        agent.destination = target;
    }
}

三、切换鼠标样式
在这里插入图片描述
鼠标图片下载地址:
链接: https://pan.baidu.com/s/1peQu-f7l-YBgEdbsdDcK2g 提取码: tdd6
在这里插入图片描述

选中这些图片按上图修改一下Apply
打开MouseManger脚本文件

public Texture2D point, doorway, attack, target, arrow;//鼠标样式变量

void SetCursorTexture()
{
	Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

	if (Physics.Raycast(ray,out hitInfo))
	{
		//切换鼠标贴图
		switch (hitInfo.collider.gameObject.tag)
		{
			case"Ground":
				//图片我们设置成32*32,所以偏移16,16
				Cursor.SetCursor(target, new Vector2(16, 16), CursorMode.Auto);
				break;
		}
	}
}

支线:

  • 当前MouseManger脚本文件:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

/// <summary>
/// 鼠标管理类MouseManger
/// </summary>
public class MouseManger : MonoBehaviour
{
    public static MouseManger Instance;//单例模式,首先创建一个自身的static变量,通常取名Instance

    public Texture2D point, doorway, attack, target, arrow;//鼠标样式变量
    RaycastHit hitInfo;//保存射线碰撞到的点的信息
    public event Action<Vector3> OnMouseClicked;//实例化一个事件


    void Awake()
    {
        if (Instance != null)
            Destroy(gameObject);
        Instance = this;
    }

    void Update()
    {
        SetCursorTexture();
        MouseCnotrol();
    }

    /// <summary>
    /// 该函数用于射线触碰到不同东西时,鼠标指针样式进行变化
    /// Camera.ScreenPointToRay()函数:将屏幕的点转化为射线
    /// Physics.Raycast()函数:返回一个Raycast类型的数值
    /// </summary>
    void SetCursorTexture()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray,out hitInfo))
        {
            //切换鼠标贴图
            switch (hitInfo.collider.gameObject.tag)
            {
                case"Ground":
                    //图片我们设置成32*32,所以偏移16,16
                    Cursor.SetCursor(target, new Vector2(16, 16), CursorMode.Auto);
                    break;

            }
        }
    }

    /// <summary>
    /// MouseControl鼠标控制函数
    /// OnMouseClicked?.Invoke(hitInfo.point);执行该事件中的所有方法
    /// </summary>
    void MouseCnotrol()
    {
        if (Input.GetMouseButtonDown(0) && hitInfo.collider != null)
        {
            if (hitInfo.collider.gameObject.CompareTag("Ground"))
            {
                OnMouseClicked?.Invoke(hitInfo.point);
            }
        }

    }
}

  • 当前PlayerController脚本文件:
using UnityEngine;
using UnityEngine.AI;

public class PlayerController : MonoBehaviour
{
    private NavMeshAgent agent;

    void Awake()
    {
        agent = GetComponent<NavMeshAgent>();//在Awake函数中初始化    
    }

    void Start()
    {
        MouseManger.Instance.OnMouseClicked += MoveToTarget;//将函数注册到事件中
    }

    /// <summary>
    /// 因为要注册到OnMouseClick函数,所以函数参数类型也得一样
    /// </summary>
    /// <param name="target"></param>
    public void MoveToTarget(Vector3 target)
    {
        agent.destination = target;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3D实战【六】SetCursor 设置鼠标指针 的相关文章

  • 在Vue中使用axios

    在vue中使用axios 安装 npm install axios 引入 全局引入 在 main js 中引入 axios 也可以在单页面局部引入 import axios from axios Vue prototype axios ax

随机推荐

  • msf利用ms17_010经典漏洞攻击--使用msfvonom生成后门msf进行监听

    学习目标 例如 1 使用msf进行ms17 010漏洞利用 成功拿到shell截图取证 2 使用msfvonom进行权限维持 后门木马生成 利用第一步shell进行上传 3 利用msf监听模块进行监听 第一步 利用msf进行ms17 010
  • ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法【连接本机】

    遇到这个问题首先考虑检查配置文件listener ora和tnsnames ora 1 listener ora文件 获取电脑主机名称 可通过dba登录sqlplus利用 select HOST NAME from v instance 语
  • 一次艰难的图床选择经历(MWeb+PicGo+Github)

    博客写作优化 写博客就肯定会遇到插入图片的情况 我之前的做法是先在Boostnote这种Markdown编辑器里面写个草稿 如果有图片就附上图片 然后再粘到简书的web端 当然图片也需要另拖 会生成一个简书的图片链接 相当于把简书作为图床
  • 您的云,您做主:Google Distributed Cloud Hosted 全面可用

    近日 谷歌宣布Google 分布式云 GDC 托管的全面可用性来扩展该产品组合 它支持具有最严格要求的客户的需求 包括机密 受限和绝密数据 GDC Hosted 包括部署 操作 扩展和保护完整托管云所需的硬件 软件 本地控制平面和操作工具
  • GetDlgItem所获取CWnd*的时效性

    GetDlgItem所获取的窗口CWnd 并非一定是全局的 若控件绑定了变量 那么通过GetDlgItem所获取的CWnd 是全局的 对该CWnd 进行保存 随时都可以正确调用 若控件没有绑定变量 仅仅只有一个ID 那么通过GetDlgIt
  • 面向过程和面向对象的语言有哪些,以及优缺点(一篇文章让你理解)

    C语言是面向过程的 而C python java是面向对象的 面向过程的编程思想将一个功能分解为一 个一个小的步骤 我们通过完成一个一 个的小的步骤来完成一个程序 优点 这种编程方式 符合我们人类的思维 编写起来相对比较简单 缺点 但是这种
  • 自定义View的绘制:Xfermode用法解析

    文章目录 1 PorterDuff概述 1 1 源码结构 PorterDuff java android 34 1 2 PorterDuff Mode 1 2 1 Alpha合成模式 12种 1 2 2 混合模式 5种 1 2 3 ADD模
  • win10 redis后台启动命令

    windows 下后台启动 redis 进入 DOS窗口 在进入Redis的安装目录 输入 redis server service install redis windows conf loglevel verbose 安装redis服务
  • 解决You will need to adjust your conda configuration to proceed.Use `conda config --show channels` to

    在anaconda中安装pytorch框架时遇到的问题 出现以下的原因就是你当前设定的镜像源已经不支持该包了 所以需要重新设定 先移除源 设置为默认的源 先移除默认的源 查看源 查看源是defaults 然后输入下面的命令创建pytorch
  • SDUT--OJ《数据结构与算法》实践能力专题训练6 图论

    A 数据结构实验之图论一 基于邻接矩阵的广度优先搜索遍历 Description 给定一个无向连通图 顶点编号从0到n 1 用广度优先搜索 BFS 遍历 输出从某个顶点出发的遍历序列 同一个结点的同层邻接点 节点编号小的优先遍历 Input
  • 解决VC 6.0 fatal error C1033: cannot open program database '.\debug\vc60.pdb'问题

    VC 6 0编译了几次后 突然出现个 cannot open program database debug vc60 pdb 然后再编译就一直是这个错误信息 网上有几下几种说法 1 文件的属性问题 改为存档就行了 试过了 不行 2 只需修改
  • sql根据某一字段值的不同关联不同的表(一)

    一 数据库数据数据 deed records sport records match ticket record 二 sql语句 SELECT d integral CASE WHEN d deed type 1 THEN SELECT s
  • 第五章-数字水印-1-位平面

    数字水印概念 数字水印是一种将特定数字信息嵌入到数字作品中从而实现信息隐藏 版权认证 完整性认证 数字签名等功能的技术 以图片水印为例 水印嵌入过程 版权信息水印A嵌入到图像B中 得到含有水印的图像C 图像C与图像B在外观上基本一致 肉眼无
  • 机器学习之【蒙特卡罗法】

    机器学习之 蒙特卡罗法 一 蒙特卡罗法 二 随机抽样 三 数学期望估计 四 积分计算 五 示例 六 接受 拒绝法 七 示例 一 蒙特卡罗法 蒙 特 卡 罗 法 Monte Carlo method 也 称 为 统 计 模 拟 方 法 sta
  • Html如何引用公用的JS和CSS

    1 问题原因 项目开发几乎每个Html都会引用JS和CSS 那么就会有一些常用JS或者CSS 我们不希望每个Html文件都引用一堆文件 而是只引用公用的JS和CSS就可以了 2 解决办法 2 1定义commonJs js添加公用的JS文件引
  • LightingandRenderingScenes_译

    LightingandRenderingScenes 译 在这个教程中 你会学到怎样快速设置场景实现高视觉保真渲染和截图 然而这些技术的一部分是为实时体验 这些设置的一部分为实时体验可能太重表现了 你会学到怎样 1 设置和调整全球后处理体积
  • 10款Visual Studio实用插件

    目录 前言 Visual Studio插件搜索 Visual Studio插件市场 ReSharper 付费 GitHub Copilot 付费 CodeMaid 免费 CSharpier 免费 Visual Studio Theme Pa
  • 绪论、Ambari二次开发思路

    1 总体思路 1 对ambari admin ambari web模块进行单独编译 二次开发主要针对这两个模块 2 利用Brunch watch功能 对文件夹源码进行实时监控编译 提高开发效率 2 开发方向 1 参照HDP 基于Apache
  • Git安装

    1 Git官网 地址 https git scm com 下载自己需要的安装包 2 安装过程 选择安装位置 安装完成后右键 git bash here 打开
  • Unity3D实战【六】SetCursor 设置鼠标指针

    一 修改人物移动的方法 上一节使用的是将人物拖拽的方法实现人物移动 这一节我们进行修改一下 首先打开mousemanger脚本代码 单例模式 首先创建一个自身的static变量 通常取名Instance public static Mous