[Blender+Unity]鼠标交互寻路Demo

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class PlayerMovement : MonoBehaviour
{
public MouseAction mouseAction;
void Start()
{
//启动时把自己的函数放入事件的委托列表
//类外的事件触发时类内的函数触发
mouseAction.OnMouseClickOnMap += MouseAction_OnMouseClickOnMap;
}
//接受到事件后触发函数
private void MouseAction_OnMouseClickOnMap(object sender, MouseAction.OnMouseClickOnMapEventArgs e)
{
//获取导航组件
if (TryGetComponent<NavMeshAgent>(out NavMeshAgent agent))
{
//根据事件传来的位置信息给导航组件设定目标
agent.SetDestination(e.targetPosition);
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MouseAction : MonoBehaviour
{
//定义一个向外传递信息的事件,发出的信息是自定义的EventArgs,
//向所有符合条件(无返回值,传两个参数)且加入了接受列表的函数发出信息
//类内触发事件,类外同步触发其他类的函数
public event EventHandler<OnMouseClickOnMapEventArgs> OnMouseClickOnMap;
//自定义一种数据包装类型,包裹一个位置信息,再创建时装入位置信息
public class OnMouseClickOnMapEventArgs : EventArgs
{
public Vector3 targetPosition;
public OnMouseClickOnMapEventArgs(Vector3 targetPosition)
{
this.targetPosition = targetPosition;
}
}
void Update()
{
//如果鼠标按下
if (Input.GetMouseButtonDown(0))
{
//创建碰撞检测射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//如果碰撞检测成功,鼠标有点击在物体上
if (Physics.Raycast(ray, out RaycastHit hit))
{
//判断碰撞物体是不是地图
if (hit.collider.gameObject.tag == "Map")
{
Debug.Log(hit.point);
//触发事件
OnMouseClickOnMap?.Invoke(this, new OnMouseClickOnMapEventArgs(hit.point));
}
}
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform player;
public Vector3 offset;
//相机和目标物体间位置相差一个偏差值
void Update()
{
transform.position = player.position + offset;
}
}