unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】

文章目录

    • 8.1 自动寻路
    • 8.2 巡逻
    • 8.3 视野
    • 8.4 自动攻击
    • 8.5 追踪
    • 8.6 机器学习

8.1 自动寻路

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第1张图片

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第2张图片
dos操作时代的人工智能

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第3张图片
英雄无敌3这样的回合策略制游戏
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第4张图片
红警这样的即时战略很考虑人工智能

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第5张图片
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第6张图片
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第7张图片
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第8张图片
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第9张图片
我们先建立如图所示的物体
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第10张图片
并将其的属性设置为静态。因为将来的导航物体需要在这些物体上运动,这些物体只有成为静态物体,才能被烘焙成导航网络。
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第11张图片
接下来调出这个窗口

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第12张图片
我们可以在导航这里看到有三个是设定好的,分别是可以走,不可走和跳跃,然后右边是开销
也可以添加自定义的区域然后进行设置

这些取区域和agent配合设置可以达到特定的效果
agent里面可以设置区域遮蔽,让角色不能在某些特定的区域中移动,以此来区别对待敌人

object可以对选中的物体进行导航的相关设置
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第13张图片
接下来我们看看bake

将下面这几个参数调整成合适的,并进行烘培,可以看到效果如图,蓝色部分为可以行走的区域
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第14张图片
然后添加一个被导航的物体,我们创建一个胶囊体,并给他添加上被导航的代理体
写入以下脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class navi : MonoBehaviour
{
     
    private NavMeshAgent agent;
    // Start is called before the first frame update
    void Start()
    {
     
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
     
        if (Input.GetMouseButton(0))
        {
     
            RaycastHit hit;
            
            if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit, 100)){
     
                //这条语句完成了两个事情 一个是发射出一条射线,(如果有射线则进入if)并且把这条语句out 也就是输出给hit,查询多远的距离呢,是100个单位
                agent.destination = hit.point;
            }
        }
    }
}

拖拽给物体便可以看到物体会自动走到鼠标点击的地方
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第15张图片
有时候平台无法跳上去 我们可以使用jump功能

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第16张图片
如图所示我们新建两个空物体,并且将两个空物体置于平台底部和高处

我们给它添加一个组件
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第17张图片
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第18张图片
然后移动到这上面
这时候再运行游戏场景便可以使得它进行跳跃

接下来介绍一下动态的阻挡物
如果我们直接添加一个物体(非静态) 那么这个物体是不会影响物体自动寻路的
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第19张图片
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第20张图片
直接通过 无法阻止

但是路过我们给胶囊体设置为刚体 则物体在寻路的时候不会绕开这个物体而寻找其他路线,而是直接遵循两点之间线段最短的路来走,但是此时就会出现这个物体一直撞着这个物体而很难走开,就一直日墙怼墙
在这里插入图片描述

为了让这种物体也能参与寻路的影响,我们给这个方块添加一个这样的组件

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第21张图片
这时候这个物体就会阻止导航体穿过去,起到阻挡的作用

8.2 巡逻

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第22张图片

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第23张图片

我们还是用之前的地形
然后创建一个空物体 下面有四个空物体 分别用来表示位置
unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第24张图片

unity入门教程 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】_第25张图片

然后我们创建一个胶囊物体 给他带上nav mesh agent的这个导航组件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class AIpartrol : MonoBehaviour
{
     
    // Start is called before the first frame update
    public float patrolSpeed = 2f;
    public float patrolWaitTime = 1f;
    public Transform patrolWayPoints;
    private NavMeshAgent agent;
    private float patrolTimer;//这个用来记录当敌人达到路径点的时候 停留时间是多久
    private int wayPointIndex;//记录当前目标点是哪个路径点
    void Start()
    {
     
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
     
        Patrolling();
    }
    void Patrolling()
    {
     
        agent.isStopped = false;
        agent.speed = patrolSpeed;
        if (agent.remainingDistance<=agent.stoppingDistance)//由于可能这个物体并不是一分不差的到目的点的,我们可以用用一个范围表示冗余
        //当到达目的点时开始计算时间
        {
     
            patrolTimer += Time.deltaTime;
            if (patrolTimer >= patrolWaitTime)//如果等待时间已满,则进入下一个点
            {
     
                if (wayPointIndex == patrolWayPoints.childCount - 1)
                {
     
                    wayPointIndex = 0;
                }
                else
                {
     
                    wayPointIndex++;
                }
                patrolTimer = 0;//由于切换完成 所以我们将这个time归零计算
            }
            //这里没有else 是因为如果没=等待时间没满则什么都不会做 只是单单的增加事件
        }
        else
        {
     
            patrolTimer = 0;
        }
        agent.destination = patrolWayPoints.GetChild(wayPointIndex).position;//Getchild方法可以获得这个东西的子物体
        //括号里面跟的是下标



    }
    
}

8.3 视野

8.4 自动攻击

8.5 追踪

8.6 机器学习

你可能感兴趣的:(unity游戏开发,游戏,人工智能,unity,游戏开发,unity3d)