赞
踩
一、修改人物移动的方法
上一节使用的是将人物拖拽的方法实现人物移动,这一节我们进行修改一下
首先打开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;
}
}
}
支线:
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);
}
}
}
}
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;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。