设为首页收藏本站
查看: 1493|回复: 0

Cha9.0丨最简单的游戏AI:NavMesh寻路系统___Robot篇

[复制链接]

该用户从未签到

17

主题

19

帖子

447

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
447
橙子va 发表于 2018-5-20 21:07:28 14930 | 显示全部楼层 |阅读模式

文件下载:微信公众号vrlife—新书推荐—新书配套资源下载


本章目标

资源文件已为我们制作好了FPSController第一人称目标角色,即玩家角色,我们可以通过键盘控制人物移动,观察Robot互动效果。本章我们要完成的目标就是从寻路开始给机器人设置与玩家之间的互动效果



本章用到的知识

协程

NavMesh知识点



完成思路

1、烘焙路径(可通过路径和障碍物),用于机器人寻路—>2、创建脚本,编写机器人寻路策略



实战过程

1、烘焙路径

NPC在场景中自动寻路依靠地形的烘焙,NPC本身不具备自动规划路线的能力,它依靠烘焙信息文件规划出最佳路线进行移动

Windows—Navigation视图控制地形烘焙条件,它分为Object、Bake、Areas三个选项卡。Object用于设置游戏对象是否为可被烘焙的对象和他们所属的Navigation Area,在本选项卡中,只有包含Mesh Renderers和Terrains的游戏对象才能用于烘焙;Bake控制烘焙的高度、半径;Areas用于设置不同地形名称以及烘焙完成后该地区颜色


a、首先确认地板等机器人可行走的游戏物体附有MeshRenderer或者Terrain组件之一,没有则给他们添加上该组件


b、Navigation—Object,选择MeshRenderer或Terrain选项卡,在Hierarchy里选择地板等物体,赋予Navigation Static属性,Navigation Area选择Walkable

0517_01.png


c、选择墙壁等障碍物,同样选择Navigation Static,但是下方的Navigation Area选择Not Walkable


d、根据NavMesh知识点设置相关参数


e、Bake

0517_02.png



2、代码展示
  1. using System.Collections;
  2. using UnityEngine;
  3. using UnityEngine.AI;

  4. public class myRobot : MonoBehaviour
  5. {
  6.     // public Transform playerTransform;

  7.     //用于判定机器人是否攻击的布尔值
  8.     private bool activeAttack;

  9.     //玩家Transform组件
  10.     private Transform playerTransform;

  11.     void Start()
  12.     {
  13.         //Gameobject是一个类型,所有的游戏物件都是这个类型的对象。gameobject是一个对象, 指的是这个脚本所附着的游戏物件
  14.         playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
  15.         
  16.         activeAttack = true;

  17.         StartCoroutine(RobotNavigation());
  18.     }

  19.     //因为StartCoroutine要求是StartCoroutine(IEnumerator routine)这样的一个方法格式,因此RobotNavigation应是IEnumerator类型
  20.     private IEnumerator RobotNavigation()     
  21.     {
  22.         while (GetComponent<NavMeshAgent>().enabled)
  23.         {
  24.             float previousDistance = Vector3.Distance(transform.position, playerTransform.position);

  25.             gameObject.transform.LookAt(playerTransform);

  26.             if (previousDistance <= 5f)
  27.             {
  28.                 GetComponent<NavMeshAgent>().isStopped = true;
  29.                 GetComponent<Animator>().SetBool("Walk", false);
  30.                 if (activeAttack)
  31.                 {
  32.                     GetComponent<Animator>().SetTrigger("Attack");    //射击
  33.                     activeAttack = false;                             //关闭射击
  34.                     Invoke("AttackPlayer", 3f);                       //3s后打开射击
  35.                 }
  36.             }

  37.             else
  38.             {
  39.                 if (previousDistance >= 50f)
  40.                 {
  41.                     GetComponent<NavMeshAgent>().isStopped = true;
  42.                     GetComponent<Animator>().SetBool("Walk", false);
  43.                 }

  44.                 else
  45.                 {
  46.                     GetComponent<NavMeshAgent>().destination = playerTransform.position;
  47.                     GetComponent<NavMeshAgent>().isStopped = false;
  48.                     GetComponent<Animator>().SetBool("Walk", true);
  49.                 }
  50.             }
  51.             yield return new WaitForEndOfFrame();   //注意书写yield return的返回位置,它位于while方法内!
  52.         }
  53.     }

  54.     void AttackPlayer()
  55.     {
  56.         activeAttack = true;
  57.     }

  58. }
复制代码


可能遇到的问题

Q:运行游戏时画面不动,FPSController Position位置却发现改变

A:观察是否增添了不必要的Camera,本项目我们只需要FPSController下的FirstPersonCharacter相机来显示游戏


Q:运行时玩家角色下坠

A:观察下坠地点地板是否添加了Box Colider组件,并保证玩家的Position不能过低,否则也会下坠到地板以下


Q:运行游戏时视点过低或过高,造成仰视或俯视机器人现象

A:观察FPSController—Character Controller的Height(高度)、Transform—Scale、Position的相关设置,保证玩家角色拥有合适身高和高度位置

0520-01.png


如遇其他问题,可联系作者邮箱skode@foxmail.com共同讨论



效果展示
20180520215446.gif




—————————————————————分 割 线—————————————————————————

动画系统复习

动画系统分为两种实现方式,一种为修改模型的Transform,配合模型的动画效果,实现模型的动画。它的实质是模型原地动画+Transform数据更改

0520-01.gif


另一种是由动画控制的位移,即模型动画本身是带有位移效果的,我们往往用Blend Tree混合控制动画的播放,由动画实现模型的运动效果,下面分别是动画效果展示和运行效果展示

0520-03.gif


0520-04 (1).gif


回复

使用道具 举报

0条回复
跳转到指定楼层

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|赛隆网 ( 粤ICP备16067842号 )  

Copyright 2013 -̳ Ȩ All Rights Reserved.

Powered by Cylonspace ; All Rights Reserved.

QQ|Archiver|手机版|小黑屋|赛隆网 ( 粤ICP备16067842号 )  

GMT+8, 2018-10-21 20:25 , Processed in 0.121773 second(s), 27 queries.

快速回复 返回顶部 返回列表