作业要求


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

  • 使用“感知-思考-行为”模型,建模 AI 坦克
  • 场景中要放置一些障碍阻挡对手视线
  • 坦克需要放置一个矩阵包围盒触发器,以保证 AI 坦克能使用射线探测对手方位
  • AI 坦克必须在有目标条件下使用导航,并能绕过障碍。(失去目标时策略自己思考)
  • 实现人机对战

实验内容


“感知-思考-行为”模型:AITank感知周围是否出现玩家,然后进行思考:
- 若没有玩家就进行行动巡逻
- 若附近有玩家就进行行动追捕。
继续进行感知:
- 若玩家到了AITank的射击范围则进行射击行动,
- 若没有进入玩家射击范围则继续进行追捕行动。

“感知”

NavMesh是unity提供的导航寻路功能。
给对象加上Nav Mesh Agent组件,在Navigation窗口给地图中的各个对象设置walkable或者not walkable等属性,然后bake烘培,就得到描述了游戏对象可行走的表面的数据结构Navigation Mesh,可通过这些三角网格计算其中任意两点之间的最短路径用于游戏对象的导航,作为“感知-思考-行为”模型中的“感知”。

  • 使用商店中的资源Tanks! Tutorial。
导入资源之后,报错:Assets\PostProcessing\Editor\PropertyDrawers\MinDrawer.cs(6,34): error CS0104: 'MinAttribute' is an ambiguous reference between 'UnityEngine.PostProcessing.MinAttribute' and 'UnityEngine.MinAttribute'这里需要:将MinDrawer.cs中所有的MinAttribute替换为UnityEngine.PostProcessing.MinAttribute。

  • 预制:

包括enemy,player和bullet,其中enemy和player中都有NavMeshAgent对象

  • 设置游戏对象的Navigation,且设置Bake使得AITank可以进行寻路::


“思考”

AITank,它实现了感知-思考-行为”模型中的“思考”。

  • AI坦克如果在自己附近没有发现玩家,则会进入巡逻状态
  • AI坦克发现了附近的玩家,则会进行追捕
  • 当距离进入了AI坦克的射程范围,则AI坦克会通过每隔一段时间发射一颗子弹
    void Update () {gameover = GameDirector.getInstance().currentSceneController.isGameOver();if (!gameover){target = GameDirector.getInstance().currentSceneController.getPlayerPos();if (getHp() <= 0 && recycleEvent != null){recycleEvent(this.gameObject);}else{if(Vector3.Distance(transform.position, target) <= 30){isPatrol = false;agent.autoBraking = true;agent.SetDestination(target);}else{patrol();}}}else{NavMeshAgent agent = GetComponent<NavMeshAgent>();agent.velocity = Vector3.zero;agent.ResetPath();}}

“行动”

在追捕中会进行一系列输入来调动坦克的行为,就是感知-思考-行为”模型中的“行动”。

  • Bullet子弹类

主要问题是碰撞问题,通过OnCollisionEnter函数检查bullet碰撞范围内的对象,如果是玩家则玩家血量减少,并在子弹爆炸后通过工厂类对子弹进行回收:


public class Bullet : MonoBehaviour {public float explosionRadius = 3f;private tankType type;public void setTankType(tankType type){this.type = type;}private void Update(){if(this.transform.position.y < 0 && this.gameObject.activeSelf){GameObjectFactory mf = Singleton<GameObjectFactory>.Instance;ParticleSystem explosion = mf.getPs();explosion.transform.position = transform.position;explosion.Play();mf.recycleBullet(this.gameObject);}}void OnCollisionEnter(Collision other){GameObjectFactory mf = Singleton<GameObjectFactory>.Instance;ParticleSystem explosion = mf.getPs();explosion.transform.position = transform.position;Collider[] colliders = Physics.OverlapSphere(transform.position, explosionRadius);for(int i = 0; i < colliders.Length; i++)if(colliders[i].tag == "tankPlayer" && this.type == tankType.Enemy || colliders[i].tag == "tankEnemy" && this.type == tankType.Player){float distance = Vector3.Distance(colliders[i].transform.position, transform.position);//被击中坦克与爆炸中心的距离float hurt = 100f / distance;float current = colliders[i].GetComponent<Tank>().getHp();colliders[i].GetComponent<Tank>().setHp(current - hurt);}explosion.Play();if (this.gameObject.activeSelf) mf.recycleBullet(this.gameObject);}
}
  • 工厂类的实现和之前作业一致

  • 接口类、导演类、场景控制类、单例类和之前作业一致

  • UI部分
    实现了读取玩家的键盘操作并调用相关的函数对玩家Tank进行控制,移动或发射子弹,其中WASD进行移动,空格键发射子弹。

  • MainCameraControl类:
    实现了移动跟随效果以及通过游戏场景中所有坦克的距离大小来设置摄像机的范围(这个之前也做过)

后记


这次实在太赶了,博客就暂时这样吧,之后再填充一些~

github

参考

【Unity3D】坦克对战游戏 AI 设计相关推荐

  1. 坦克对战游戏 AI 设计

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

  2. 作业十: 坦克对战游戏 AI 设计

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

  3. 【3D游戏】坦克对战游戏AI设计

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

  4. Unity3d--坦克对战游戏 AI 设计

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

  5. 游戏 AI 设计之 FSM 有限状态机

    FSM 有限状态机 一.概述 有限状态机(finite-state machine,缩写:FSM)又称有限状态自动机(finite-state automaton,缩写:FSA),简称状态机,是表示有 ...

  6. 端午节-怀念1996之QB45坦克对战游戏

    又是一个端午节,真的老了.坐在计算机边,打开VirtualBox,启动Windows 3.2, 再玩一把坦克对战游戏. 这是1996年端午节前后写的程序.当时备战高考,被题海战术弄得身心俱疲,模拟考试 ...

  7. 阐述游戏AI设计的两个禁忌及解决方法

    此文转自游戏帮,勉励下自己 作者:Jon Shafer 我在过去年几负责了多款游戏的AI设计工作,我从中收获的一个最基本,可能也是最令人沮丧的经验就是:创建一个出色的AI真是出奇地困难.不但制作一个符 ...

  8. java2048ai,2048小游戏ai设计

    感谢我的朋友许博瑀,他一定要赞助我个域名,于是网站改为以下地址: >>>>>>>>>>>>>>>>> ...

  9. openFrameworks实现的简单坦克对战游戏-Tank War

    ​ 开发环境:windows.vs2019.of_v0.11.2_vs2017_release. 下载地址:https://download.csdn.net/download/qq_31412239 ...

最新文章

  1. oracle取字符串长度的函数length()和hengthb()
  2. python自定义函数详解_python基础教程之自定义函数介绍
  3. 在asp.net中控制回车键
  4. PWN2OWN 2017 Linux 内核提权漏洞分析
  5. MySQL中的自适应哈希索引
  6. concat合并的数组会有顺序么_JS数组 Array
  7. Rendering: repaint, reflow/relayout, restyle的学习笔记
  8. P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】
  9. sql出现列名无效的原因_学会SQL并不难,小白学习记录之二(简单查询)
  10. tf.layers.conv2d_transpose 反卷积
  11. [JSOI2012]玄武密码 题解(AC自动机)
  12. 程序员日报周报月报 模板
  13. Java实现一个简单的计算器功能
  14. 技术人员的价值是什么?技术的价值体现在赋能业务
  15. pgsql timestamp without time zone > character varying解决方案
  16. 关注奢交所兄弟品牌佰家当 17年积累撬动万亿民资市场
  17. JAVA java学习(9)——————java常用开发工具介绍
  18. CSDN写文章Markdown个人笔记
  19. 大气科技类企业织梦整站模板
  20. ESP8266 AP模式

热门文章

  1. mysql 消极锁_MySQL支持的事物隔离级别以及消极锁和乐观锁原理和应用场景
  2. 粤港澳高速船电子海圈更新实践
  3. HTML+CSS+JS实现简单登录模板
  4. 出来做SEO“早晚要还的”
  5. 阅读笔记——软件工程的瀑布、教堂和集市
  6. 【数理统计】估计的性质是否具有变换不变性
  7. 土耳其发生强震 中国为此提供紧急援助
  8. Mysql和js试题_JS和MySQL常见问题
  9. android 百度地图禁止双击放大缩小,leaflet-div上禁止地图的拖动,放大缩小双击事件...
  10. 教育邮箱怎么申请?国际教育电子邮箱