前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity-BattleStar丨7. 最简单的游戏AI:NavMesh寻路系统___Robot篇

Unity-BattleStar丨7. 最简单的游戏AI:NavMesh寻路系统___Robot篇

作者头像
星河造梦坊官方
发布2024-08-14 16:35:05
660
发布2024-08-14 16:35:05
举报
文章被收录于专栏:星河造梦坊专栏

文件下载:地址

本章用到的知识

协程

NavMesh知识点

本章目标

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

完成思路

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

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

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

e、Bake

2、代码展示

代码语言:javascript
复制
using System.Collections;
using UnityEngine;
using UnityEngine.AI;

public class myRobot : MonoBehaviour
{
    // public Transform playerTransform;

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

    //玩家Transform组件
    private Transform playerTransform;

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

        StartCoroutine(RobotNavigation());
    }

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

            gameObject.transform.LookAt(playerTransform);

            if (previousDistance <= 5f)
            {
                GetComponent<NavMeshAgent>().isStopped = true;
                GetComponent<Animator>().SetBool("Walk", false);
                if (activeAttack)
                {
                    GetComponent<Animator>().SetTrigger("Attack");    //射击
                    activeAttack = false;                             //关闭射击
                    Invoke("AttackPlayer", 3f);                       //3s后打开射击
                }
            }

            else
            {
                if (previousDistance >= 50f)
                {
                    GetComponent<NavMeshAgent>().isStopped = true;
                    GetComponent<Animator>().SetBool("Walk", false);
                }

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

    void AttackPlayer()
    {
        activeAttack = true;
    }

}

可能遇到的问题

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

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

Q:运行时玩家角色下坠

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

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

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

效果展示

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

动画系统复习

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

另一种是由动画控制的位移,即模型动画本身是带有位移效果的,我们往往用Blend Tree混合控制动画的播放,由动画真实的完成模型的运动效果

案例地址

最后不要忘记IK动画~ 案例地址

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本章用到的知识
  • 本章目标
  • 完成思路
  • 实战过程
    • 1、烘焙路径
      • 2、代码展示
        • 可能遇到的问题
        • 效果展示
        • 动画系统复习
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档