1.导航网格烘焙
Window.Navigation
确保环境中的Navigation Static勾选上
2.点击Navigation中的Bake中的Bake
agent radius可以更改导航网格里物体的距离
3.将不能走的物体设定为不能行走
点击Object,然后选择物体,点击Navigation Area,选择Not walkable
4.点击需要巡逻的对象,增加组件Nav Mesh Agent
设定radius和height
5.加入代码控制人物
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Hero1 : MonoBehaviour {
public NavMeshAgent agent; // 在UnityEngine.AI命名空间下
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))// 如果检测到鼠标左键按下
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//将鼠标点击位置转化为激光点
RaycastHit hit;//激光碰撞
if (Physics.Raycast(ray, out hit))//如果有激光碰撞,就输出激光点位置
{
agent.SetDestination(hit.point); // 将目标移动到碰撞地点
}
}
}
}
6.相机跟随英雄
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowTarget : MonoBehaviour {
public Transform hero;//hero
private Vector3 offset; //设定一个偏移
// Use this for initialization
void Start () {
offset = transform.position - hero.position;//计算出相机和hero位置的偏移向量
}
// Update is called once per frame
void Update () {
transform.position = offset + hero.position;//实现跟随
}
}
动画状态机New Animator Controller
- 将创建的Animator Controller拖拽至运动物体的Animator中的Controller
- 然后点击对象,点击Window里面的Animator
- 将动画拖拽至Animator界面
- 由idle状态切换到walk,先将三个状态动画全部拖拽进去,然后右键第一个动画选择Make Transiton
- 点击Parameters,创建一个float的speed条件
- 然后点击箭头,在右侧inspector窗口中点击Conditions下的+,选择切换条件,比如speed大于0.1从idle切换到walk,因为动画切换不需要时间,所以把Has Exit Time的勾勾去掉
- 更改代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Hero1 : MonoBehaviour {
public NavMeshAgent agent; // 在UnityEngine.AI命名空间下
public Animator anim;// 使用Animator
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))// 如果检测到鼠标左键按下
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//将鼠标点击位置转化为激光点
RaycastHit hit;//激光碰撞
if (Physics.Raycast(ray, out hit))//如果有激光碰撞,就输出激光点位置
{
agent.SetDestination(hit.point); // 将目标移动到碰撞地点
}
}
anim.SetFloat("speed", agent.velocity.magnitude);//speed是前面在para中设置的
}
}