当前位置:   article > 正文

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

unity setcursor

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

首先打开mousemanger脚本代码

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

void Awake()
{
	if (Instance != null)
		Destroy(gameObject);
	Instance = this;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

三、切换鼠标样式
在这里插入图片描述
鼠标图片下载地址:
链接: 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;
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

支线:

  • 当前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);
            }
        }

    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 当前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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/93230?site
推荐阅读
相关标签
  

闽ICP备14008679号