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

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中设置的
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值