一.完成鼠标点击控制角色移动
先导入角色和部分地形用于最初测试,并创建空对象MouseManager。
导入以下资源至场景
1.首先烘焙地图,需要:
①场景设置为navigation static。
②有mesh render。
显示蓝色区域(可移动区域)即为烘焙成功。
2.为小狗添加nav mesh agent 组件,使其后续可自动移动。
调整摄像机(ctrl + shift +f)
3.创建Scripts目录,用于存放脚本。创建第一个脚本MouseManager(鼠标控制)。
建立如下结构(本模块暂用这么多),分别拖曳给Slime,DogPloyart和MouseController
4.新建tag:ground和enemy,分别设置给地面和Slime,用于射线的碰撞检测。
接下来就可以撰写MouseManager的代码了。
SetCursorTexture:具体实现暂时空出来,不断检测射线的信息。
EventVector3类:用于定义点击的事件,并绑定调用角色Ai寻路的Destination,由于没有继承MonoBehaviour,因此需要系统序列化。
绑定/操作 角色Ai组件的Destination属性。
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
using UnityEngine.Events;
[System.Serializable]
public class EventVector3 :UnityEvent<Vector3>{ };
public class MouseManager : MonoBehaviour
{
Ray ray;//鼠标检测射线
RaycastHit hitInfo;//碰撞信息
public static MouseManager instance;
public EventVector3 OnMouseClicked;
// Start is called before the first frame update
private void Awake()//在Start之前调用
{
//单例模式
if (instance != null)
{
Destroy(gameObject);
}
instance= this;
}
void Start()
{
}
// Update is called once per frame
void Update()
{
//更改鼠标图案
SetCursorTexture();//实时获得射线信息
//点击鼠标时,调用player的函数
PlayerControl();
}
void SetCursorTexture()//更改图案函数
{
//射线检测:根据地面还是敌人,对应不同的图标
ray = Camera.main.ScreenPointToRay(Input.mousePosition);//主摄像机根据鼠标位置转成屏幕坐标,由此创建射线
if(Physics.Raycast(ray,out hitInfo))
{
//用于切换代码
}
}
void PlayerControl()//控制角色
{
if (Input.GetMouseButtonDown(0) && hitInfo.collider!=null)//点击鼠标左键,要满足碰撞体不为空
{
if (hitInfo.collider.tag == "ground")
{
OnMouseClicked?.Invoke(hitInfo.point);//判断是否为空的简写
}
}
}
}
目前实现了点击移动,后续可以对Ai寻路进行调整。