AI坦克-unity3D

2、 坦克对战游戏 AI 设计 从商店下载游戏:“Kawaii” Tank 或 其他坦克模型,构建 AI 对战坦克。具体要求

  • 使用“感知-思考-行为”模型,建模 AI 坦克
  • 场景中要放置一些障碍阻挡对手视线
  • 坦克需要放置一个矩阵包围盒触发器,以保证 AI 坦克能使用射线探测对手方位
  • AI 坦克必须在有目标条件下使用导航,并能绕过障碍。(失去目标时策略自己思考)
    实现人机对战
感知
AI坦克获取玩家坦克信息通过Vision获取,因为障碍物阻碍,AI坦克不会实时感知到玩家坦克
思考
当AI坦克发现玩家时,会自动瞄准玩家,并使用Navigation进行寻路从而靠近玩家。当没有发现玩家时,按照预先定义的方向速度进行移动
行动
就包括没有看见玩家坦克时按照预设的方向行动和发射子弹的行动;
以及发现玩家坦克时朝着玩家坦克前进和瞄准玩家坦克发射子弹的行动。
(为了减少游戏难度,我将玩家坦克发射子弹的速度调大了,AI坦克发射子弹的速度调小了)。
具体实现 地图制作:
首先使用资源包中的预制,进行地图的制作。我删除了一些不必要的地形,选取了一些房子并将其随意摆放在地图上。
AI坦克-unity3D
文章图片

并选取整个地形,添加nav mash agent组件。
进入window->AI->Navigate->选择Object->过滤器选择Mesh RenderersAI坦克-unity3D
文章图片

选择想要无法被导航的对象,把navigation static打上勾,如上图所示,最后选择bake选项,在选择下面的bake生成导航AI坦克-unity3D
文章图片

最后效果如上下图AI坦克-unity3D
文章图片

AI坦克追踪
在mainbody挂载上脚本PlaceTarget用于追踪发现的玩家坦克:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class PlaceTarget : MonoBehaviour { public GameObject target; NavMeshAgent mr; void Start() { mr = GetComponent(); }void Update() { mr.SetDestination(target.transform.position); } }

AI坦克瞄准并发射子弹
原来控制坦克发射子弹的脚本是Fire_Control_CS,为了限制AI坦克的发射速度进行修改,修改后如下:
void Update () { if (idScript.isPlayer) { #if UNITY_ANDROID || UNITY_IPHONE Mobile_Input (); #else Desktop_Input (); #endif } else { count = count + Time.deltaTime; if(count > 3.0f)//这里修改发射时间 { Fire(); count = 0; } } }

一点小修改:血量情况常驻
为了保证玩家能够实时观察到自己控制的坦克血量情况,将血量显示进行常驻而非原来的受击后才显示
void Update () { if(idScript.isPlayer) { displayScript.Get_Damage(durability, initialDurability); } if (idScript.isPlayer) { #if UNITY_ANDROID || UNITY_IPHONE if (CrossPlatformInputManager.GetButtonDown ("Destruct")) { #else if (Input.GetKeyDown (KeyCode.Return)) { #endif Start_Destroying (); } } }

运行视频 项目资源 【AI坦克-unity3D】运行方法:直接点击TankAI.unity进入运行即可

    推荐阅读