Unity3D2017_4_导航系统_人物状态动画

1.导航网格烘焙

Window.Navigation
确保环境中的Navigation Static勾选上
在这里插入图片描述

2.点击Navigation中的Bake中的Bake

Unity3D2017_4_导航系统_人物状态动画_第1张图片
agent radius可以更改导航网格里物体的距离

3.将不能走的物体设定为不能行走

点击Object,然后选择物体,点击Navigation Area,选择Not walkable
Unity3D2017_4_导航系统_人物状态动画_第2张图片

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
    Unity3D2017_4_导航系统_人物状态动画_第3张图片
  • 将动画拖拽至Animator界面
    在这里插入图片描述
  • 由idle状态切换到walk,先将三个状态动画全部拖拽进去,然后右键第一个动画选择Make Transiton
    Unity3D2017_4_导航系统_人物状态动画_第4张图片
  • 点击Parameters,创建一个float的speed条件
    在这里插入图片描述
  • 然后点击箭头,在右侧inspector窗口中点击Conditions下的+,选择切换条件,比如speed大于0.1从idle切换到walk,因为动画切换不需要时间,所以把Has Exit Time的勾勾去掉
    Unity3D2017_4_导航系统_人物状态动画_第5张图片
  • 更改代码
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中设置的
	}
}

你可能感兴趣的:(Unity3D2017_4_导航系统_人物状态动画)