当前位置: 代码迷 >> 综合 >> Unity3D实战【六】SetCursor 设置鼠标指针
  详细解决方案

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

热度:44   发布时间:2023-11-23 02:24:38.0

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

首先打开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,16Cursor.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变量,通常取名Instancepublic 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,16Cursor.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;}
}
  • 上一篇:Unity3D实战【五】MouseManager 鼠标控制人物移动
  • 下一篇:Unity3D实战【七】Cinemachine & Post Processing 摄像机跟踪和后处理