目录

  • 游戏原型
  • 项目演示
  • 绘图资源
  • 代码实现
  • 技术探讨
  • 参考来源

游戏原型

  • 游戏玩法:在有界的战场上,玩家将驾驶坦克,代表绿色阵营,与你的队友一起击溃红蓝阵营的敌人,在这场三方大战中夺得胜利!
  • 操作指南:
    • 移动:WASD
    • 开火:Space
    • 第一/第三人称视角转换:PgDn
    • 第三人称下的视角转动:← →

项目演示

Github项目地址:3D坦克大战 TankBattle


绘图资源

主要素材来源于官方Tanks教程中的Tanks!Tutorial素材包

  • 战场搭建:直接使用素材包内的LevelArt即可,当然也可在此基础上修改、扩展
  • 玩家
    • 物体:选用素材包内绿色坦克模型作为Player,除了模型外还包含子物体:发射点ShootPoint,第一人称摄像机FirstCamera,血条画布HealthCanvas
    • 组件/脚本挂载:AudioSource,Tank.cs,TankWeapon.cs
  • 敌人/队友
    • 物体:除了模型外还包含子物体血条画布HealthCanvas
    • 组件/脚本挂载:AudioSource,NavMeshAgent,AITank.cs,TankWeapon.cs
  • 相机:默认开局为第三人称视角
    • ThirdCamera:采用Orthographic模式,作为TankCamera的子物体,在TankCamera挂载TankCamera.cs脚本进行控制
    • FirstCamera:采用Perspective模式,作为玩家坦克Player的子物体,调整适当位置及角度
  • 阵营
    • 创建Layer:Ground、Players、Blue、Green、Red,并对应设置
    • 将创建多个敌人归并于各自阵营的空物体下,本例为BlueEnemy,RedEnemy,GreenEnemy
  • UI
    • 全局UI:建立Canvas,用于显示屏幕左下角玩家血量,及左侧操作指导,此外还包括死亡、胜利等UI
    • 坦克外围血条UI:新建HealthCanvas,包含血量背景条Health Background及实时血条HealthSlider(素材均来自官方包内)。后将HealthCanvas设于各方坦克预制体下,调整合适大小、高度及显示方式
  • 其他
    • 背景音乐:另设空物体BackGroundMusic添加AudioSource,开始时即循环播放
    • GameManager空物体:挂载GameManager.cs及全局UI的脚本UI.cs
    • 导航网络烘培:Window->AI->navigation内设置
    • 坦克残骸:另取坦克模型保留基本的物件,修改为灰暗色,修改BoxCollider保持间隔不相互碰撞,添加素材包内TankExplosion爆炸特效。死亡后实现爆冲力将各部件被冲散


代码实现

脚本名 挂载于 功能
shell.cs 炮弹Shell预制体 实现发射的炮弹的爆炸(特效,冲击力,销毁炮弹)
TankWeapon.cs 所有坦克的预制体 实现坦克发射炮弹的过程(实例化炮弹,赋予初速度,开火声,炮弹冷却)
Tank.cs 玩家Player 实现玩家与坦克的交互(前后左右移动,空格开火)
TankCamera.cs TankCamera 实现第三人视角跟随玩家坦克移动,且还进行第一/第三人称视角的切换控制
Unit.cs 作为Tank.cs和AItank.cs的父类 实现所有坦克的基本属性(阵营,血量,死亡爆炸特效,伤害计算)
AITank.cs 除玩家外的所有坦克预制体 实现npc坦克的功能(设置阵营、搜索敌人、自动导航、攻击、自身血条UI)
UI.cs GameManager 实现主界面下玩家的血条UI及玩家坦克外围的血条UI,胜利及失败UI,此外还有胜利判定
LayerManager.cs 设置静态方法供其他脚本调用 实现设置阵营(设置Layer)的函数
GameManager.cs GameManager 判定玩家是否死亡,若死亡则重置游戏

技术探讨

1.炮弹实现射出的方法

  • 赋予炮弹初速度:ShellRigidbody.velocity = shootPoint.forward * shootPower;,(本例方案)
  • 施加力:ShellRigidbody.AddForce(shootPoint.forward * shootPower * 50f);

2.开火时炮弹的实例化位置

  • 产生问题:运动中开火时,实例化的炮弹与自身碰撞
  • 问题分析:炮弹发射机理就是炮弹shell在炮口前一定位置实例化并赋予初速度,但是坦克也存在移动,因此假若距离较近,坦克移动速度较快时,容易造成实例化的炮弹立即与自身碰撞
  • 解决方案:需要留意位置调整、角度及坦克运动速度,本例实例化炮弹位置即为shootPoint的position

3.AI坦克对敌判定

  • 产生问题:原思路想采用射线检测来判定前面一定范围是否存在敌人,即if (hit.collider.gameObject.layer == enemy.layer),但现象是:敌人/队友是否开火呈随机发生,无规律
  • 问题分析:射线检测到的一直是tank上的部件,而那些部件物体不是enemy,if不满足无法进行射击
  • 解决方案:在AITank.cs脚本内另设SearchEnemy()函数,功能是搜索返回距离自己最近的敌人;在Update内首先导航跟踪这个敌人,然后判断当这个搜索到的敌人在开火范围内即可开火,否则重新SearchEnemy(),详细描述见脚本内注释

4.AI坦克导航

  • 产生问题:敌人及队友坦克的NavMeshAgent导航混乱
  • 问题分析:很大原因在于导航网络的烘培,及NavMeshAgent的参数设置
  • 解决方案:方法就是合理设置Navigation内的各项参数及NavMashAgent上的参数,也可直接采用官方教程视频内的参数

5.第一人称视角

  • 产生问题:玩家在第一人称视角下被销毁是报错,第一人称视角消失,再无法切换视角
  • 问题分析:FirstCamera挂载于Player,当玩家死亡时Player销毁,造成FirstCamera的销毁
  • 解决方案:在TankCamera.cs内添加判定,若玩家不存在则启用第三人称视角相机
  • 理想方案:两个视角的相机都挂载在物体TankCamera上,统一由本脚本使用;FirstCamera不仅跟随Player正常移动、旋转,且不会在玩家死亡时销毁;该方案暂未较好实现

参考来源

  • Unity3D坦克大战项目实例 - TRULYSPINACH
  • Unity设置物体旋转角度误区 - feng
  • Unity3D中的Layers和LayerMask解析 - AaronBlogs
  • Unity3D射线碰撞检测+LayerMask的使用 - 丁小未
  • Tanks - unityLearn
  • Tanks!Tutorial - unityAssetStore

转载于:https://www.cnblogs.com/SouthBegonia/p/11255503.html

Unity项目 - 坦克大战3D TankBattle相关推荐

  1. 第一个小项目——坦克大战

    坦克大战 TankWar0.1 该版本要做的很简单,建立一个窗口就可以,原始的大的类继承Frame方法,在main函数可以对原始大类进行初始化或赋值,大类中定义一个方法launch,主函数中定义类调用 ...

  2. Unity双人坦克大战竞速游戏,超简单教学

    好久没更新了,最近在研究unity,这个游戏已经做了好久了一直没发出来,我现在想开发一款猛鬼深林游戏,目前已经开发到新建文件夹了 话不多说,开始我们今天的主题,双人坦克大战竞速游戏 首先创建一个地形, ...

  3. 游戏设计模式:命令模式(以Unity开发坦克大战为例)

    命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应 ...

  4. 制作项目——坦克大战

    继上一周开始做的模拟飞机大战游戏项目之后,本周一直持续在做坦克大战这个游戏项目上,虽然看似简单的游戏,但真正对于我们这刚学了JS的初学者来讲,还有点挑战,因为里面涉及的javascript代码颇多,具 ...

  5. Java项目-坦克大战(附源码+文档)

    今天给小伙伴们分享一个坦克大战游戏的详细编写流程,即使你是刚入门java的新手,只要你简单掌握了该游戏所需要的javase基础知识,便可以跟随教程视频完成属于你自己的坦克大战游戏!同时还可以加深和巩固 ...

  6. Unity学习第一周-物理引擎-项目——坦克大战单机版

    项目需求及策划

  7. 初学者Unity项目--太空大战

    太空大战算是比较经典的游戏了.这两天在跟着视频自学了一下.能做到的效果就是飞机发出子弹打爆陨石,如果被陨石碰到就死掉.简单的赤果果.界面如下: 现在做个总结:(模型声音之类的是导入的资源包.) 很明显 ...

  8. Android项目--坦克大战

    要求 项目的内容主要实现我方坦克与敌方坦克进行对打,消灭对方坦克则成功,相反则游戏失败,完成对我方坦克的移动攻击以及相关的随机道具对坦克进行强化,敌方坦克也进行道具的获取和强化,游戏分为四个难度可以使 ...

  9. unity制作坦克大战

    首先调整相机size为8.5,调整画面尺寸5:4 文件夹里做个prefab,然后把这6个设成预制体 然后把这几个全部选中拖成一个文件夹名字命名为Born 添加他的移动代码 using System.C ...

最新文章

  1. FreeImage加速保存图像
  2. 【ZooKeeper Notes 28】ZooKeeper典型应用场景一览
  3. md0 mysql_mysql 数据合并
  4. 关于pagehelper分页
  5. 园区交换网络和路由网络综合设计,测试完工啦
  6. linux网络编程之用一张图片说明函数inet_ntop、inet_pton、inet_addr、inet_ntoa 、inet_aton函数之间的关系
  7. 215.数组中的第K个最大元素
  8. java调用webService方法
  9. 如何把PDF锁定,限制修改文档内容?
  10. django下的考勤机管理系统定制实例
  11. 如何关闭计算机软件更新功能,如何关闭电脑自动更新功能
  12. 你需要知道的WAMP5
  13. Unable to start debugging.报错
  14. At least one JAR was scanned for TLDs解决办法
  15. 遍历vad二叉树来遍历进程里的模块
  16. C++类模板 template class T详细使用方法
  17. 硬核观察 #612 谷歌正式推出“切换到安卓”应用
  18. 毕业论文开题报告怎么写
  19. 键盘 连击 测试软件测,87自学单片机第六十篇:按键双击和多击检测
  20. 两化融合主要在哪些方面

热门文章

  1. 输出0到100之间所有的素数
  2. HTML基础篇(2)
  3. LeetCode琅琊榜第十六层-Z字型变换(直接构造法 + 周期性算法)
  4. ModelMapper
  5. 行业分析——半导体行业
  6. 【ABAP】创建局部Macro和全局Macro
  7. 从api获得当前用户信息
  8. 【matlab】强化/深度学习工具箱例程调用汇总及编程实例
  9. MATLAB 2021b的机器学习、深度学习实践应用
  10. 1612第三周学习笔记