3D游戏制作——AI坦克对战

github地址(码云) https://gitee.com/jenny_s/AITank-3Dgame

游戏视频 https://www.bilibili.com/video/av77698424/


本次3D游戏的制作使用了 Unity Assets Store 中的 Kawaii Tank 模型。

AI坦克建模——感知-思考-行为模型

感知

在游戏中,程序是可以获得游戏世界任意信息的,设计一个“干死”玩家的算法通常是比较容易的,因此如何限制信息获取是设计不同级别 agent 的核心问题。在AI坦克大战的游戏中,AI坦克获取的信息是通过视觉(Vision)得到的。在我的游戏中,每个AI坦克获取的信息是导航信息,但是因为有障碍物的阻挡,使得AI坦克不会“一窝蜂”的同时涌向玩家。同时,AI坦克并不能实时瞄准玩家,也增加了游戏的可玩性。

思考

这里主要使用了Unity自带的寻路组件Navigation 进行“思考”寻路。

行动

每个AI坦克都会发射子弹,但是不能让AI坦克一直发射子弹,这样就没得玩了。所以会有一个子弹的准备时间,每间隔一段时间再发射子弹。同时地形凹凸不平,也会使得子弹的轨迹有所偏差。

游戏实现

首先,我们要导入Kawaii Tankpackage


然后通过 Assets->Import Package 导入Unity的标准Assets中的CrossPlatFormInput.unitypackage

使用导入的Kawaii Tank 的包中Scenes中的Test_Field,另存为场景 TankAI

修改场景,增加地面凹凸不平物以及房子作为障碍物。增加两个AI坦克作为敌方。

选中地形物品并在Navigation窗口中选中以下属性。

然后给所有的AI坦克,即SD_firefly_1.1MainBody添加Nav Mesh Agent 组件。

然后在 Navigation 窗口选中Bake一栏,然后点击Bake,生成导航网格图。

给每个AI坦克的MainBody增加脚本,用来使用相应的API跟踪Target。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;public class PlaceTarget : MonoBehaviour
{public GameObject target;  //获取目标点,注意在面板中赋值NavMeshAgent mr;   //声明变量// Use this for initializationvoid Start(){//获取到自身的NavMeshAgent组件mr = GetComponent<NavMeshAgent>();}// Update is called once per framevoid Update(){//使用属性将目标点的坐标进行传递//mr.destination = target.transform.position;//使用方法获取目标点坐标,,和前一行代码作用相同mr.SetDestination(target.transform.position);}
}

因为是在原来的场景上进行修改,所以我们需要修改原场景的代码,让AI坦克能够发射导弹。

修改Fire_Control_CS的代码如下:

     void Update (){if (idScript.isPlayer) {#if UNITY_ANDROID || UNITY_IPHONEMobile_Input ();#elseDesktop_Input ();#endif} else{count = count + Time.deltaTime;if(count > 3.0f){Fire();count = 0;}}}

上面的代码主要在于当目前的坦克不是玩家而是AI坦克的时候,每隔3s会自动发射导弹。

另外,在原场景下,只有受到伤害才会显示血条。但是在实际玩游戏的时候,玩家还是希望一直能看到自己的血条,而敌方的血条可以在受到攻击后才看到。所以还需要修改 Damage_Control_CS部分的代码如下:

     void Update (){// 游戏玩家一直显示血条,AI坦克受到攻击后显示血条if(idScript.isPlayer){displayScript.Get_Damage(durability, initialDurability);}// Destructif (idScript.isPlayer) {#if UNITY_ANDROID || UNITY_IPHONEif (CrossPlatformInputManager.GetButtonDown ("Destruct")) {#elseif (Input.GetKeyDown (KeyCode.Return)) {#endifStart_Destroying ();}}}

并且当血条为0时,AI坦克将会消失。

     void Start_Destroying (){if(idScript.isPlayer == false){this.gameObject.SetActive(false);}// Send message to all the parts.BroadcastMessage ("Destroy", SendMessageOptions.DontRequireReceiver);// Create destroyedPrefab.if (destroyedPrefab) {GameObject tempObject = Instantiate (destroyedPrefab, bodyTransform.position, Quaternion.identity) as GameObject;tempObject.transform.parent = bodyTransform;}// Remove the Damage text.if (displayScript) {Destroy (displayScript.gameObject);}// Destroy this script.Destroy (this);}

游戏效果

血条显示

攻击敌方

被摧毁

效果展示

3D游戏制作——AI坦克对战相关推荐

  1. AI坦克对战(实现人机)

    坦克对战游戏 AI 设计 1. 游戏要求 从商店下载游戏:"Kawaii" Tank 或 其他坦克模型,构建 AI 对战坦克.具体要求 使用"感知-思考-行为" ...

  2. 计算机3d 游戏制作,揭秘3D电影、游戏角色的制作过程!

    原标题:揭秘3D电影.游戏角色的制作过程! 从来没有接触过建模的小白们是否都很好奇,3D电影.游戏角色是怎样做出来的呢?比如说<捉妖记>里的胡巴.今年大火的国漫<哪吒>,< ...

  3. Cocos2d-x 的3D游戏制作官方教程(中文翻译)

    Cocos2d-x 在版本3开始已经支持了3D游戏开发的特性,我在官网文档看到3D开发的部分,觉得有必要记录一下,权当做学习笔记.因为只花了半天时间翻译,而且能力有限,各位看官勿喷. 本博客虽然水分很 ...

  4. cocos2dx 3D游戏制作参考

    (以下内容依据Cocos秋季峰会演讲速记稿整理) 主持人王哲: 前面几个演讲人展示了不同的技术解决方案. 第一种是<三国之刃>用Flash完成所有动画.UI制作,然后用JSFL开发一个Fl ...

  5. 毕设开发总结-3D游戏框架及网络对战游戏的开发(1)

    小序 毕业设计终于接近尾声了,一个周末都没有继续写代码,正好有一个经验分享,所以把PPT的总结报告转写成一篇blog,希望得到高手们的指点.同时也希望能给还在读书的师弟师妹们一些建议和启发吧.同时,也 ...

  6. 游戏制作之一 坦克的移动

    这篇文章参考了一位仁兄的博客 mfc坦克定位,但对之做出了一些细节上的修改,主要目的呢是为了加深自己的记忆.文章内提到的有mfc 位图绘制,键盘消息的响应 原文章传送门http://www.cnblo ...

  7. (转载)推荐2款3D游戏制作开发软件Blender3D 和3D RAD

    (首先声明 :这是从eryCD社区的帖子里找到的,这里还是先跟LZ道个歉,盗版了)首先其实不需要写什么代码,或者代码很简单易学的还有,比如MMF和darkbasicpro和FPScreator的组合, ...

  8. python联机游戏制作_Python练习01-对战小游戏

    Python练习01-对战小游戏 近期在学习Python,其中有一道练习题,写一个对战小游戏,随机人物,随机属性(血量.攻击).指定我方人物出场顺序,三局两胜,代码如下: import time, r ...

  9. 手把手教你用Java实现一个简易联网坦克对战小游戏

    作者:炭烧生蚝 cnblogs.com/tanshaoshenghao/p/10708586.html 介绍 通过本项目能够更直观地理解应用层和运输层网络协议, 以及继承封装多态的运用. 网络部分是本 ...

最新文章

  1. windoes windoes server 上安装mysql(MSI安装包安装、压缩包安装)
  2. POJ 3061 (二分+前缀和or尺取法)
  3. USACO shuttle
  4. FPGA的ip核之概念和分类
  5. 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
  6. 方法的返回值类型是object_JavaScript中如何判断类型
  7. ASP.NET MVC3 异步刷新
  8. Spring DI(依赖注入)构造器注入篇
  9. 百元价位的水下相机?!1000个去海边的人有900个选择了它!
  10. DataFactory插入MySQL中文乱码问题
  11. 美国的卫星导航系统服务器,中国的北斗卫星和美国的gps到底哪个更厉害?
  12. Typora无法打开提示安装新版本解决办法
  13. 一看就会 PicGo+gitee+Tyora个人图库搭建
  14. 苏格拉底和柏拉图甩手的故事
  15. 淘宝四大经典骗局及防骗技巧
  16. Git ~ commit 规范
  17. 混合波束成形| 论文:基于MMSE准则的混合波束成形算法
  18. 用HTML开发Windows桌面应用程序
  19. unity让声音有近大远小的效果
  20. shell脚本根据指定日期 得到月初,月末,季初,季末,年初,年末,周开始,周结束,旬初,旬末日期,报表日期

热门文章

  1. 2021 年发布 Python 软件包的正确姿势!
  2. 基于PHP+MySQL汽车展览会网站的设计与实现
  3. quartz暂停及恢复任务解决恢复时一咕噜把未执行的全补回来的问题
  4. 报关软件Trade Link 安装
  5. 优酷路由宝增加php,优酷路由宝旗舰版YK-L2刷改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件方法...
  6. Qt编写安防视频监控系统52-颜色配置
  7. 欧特克开发者训练营(Autodesk DevCamp 2013)的视频教程可以下载
  8. SKY19225-001单刀四掷(SP4T)开关设计
  9. byte数据类,list数据类
  10. Day46 网络编程基础