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

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

首先打开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;
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头给你一拳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值