网络游戏开发实战-坦克大战学习问题记录

这篇博客记录了网络游戏开发中遇到的各种问题,包括模型材质、脚本变量、数学函数理解、游戏物理效果、粒子系统、音频处理、游戏逻辑等多个方面的实战问题及解决方法。涉及Unity引擎中的碰撞检测、AI行为、UI界面、音频控制等多个技术点。
摘要由CSDN通过智能技术生成

文章目录

Easy, Normal, Hard, SuperHard

1.(E)模型缩小后材质漆黑无变化问题。

  旧版的模型不行了,下载第二版书里的素材

2.(N)脚本变量赋值后运行游戏变量值没有赋值成功问题

在这里插入图片描述
  如图所示,定义的值并没有在Start或者awake中初始化。所以有可能存在运行后unity里并没有成功赋值的情况,再在unity里重新赋值就好了(需先把运行的游戏关闭)。

3.(N)Mathf.clamp函数并没有限定值的范围

  自作聪明的用了clamp方法,后来发现并没有赋值,没有赋值当然就没有限定了。clamp函数是有返回值的,返回值才是限定的范围。很多方法不要光调用,人家的返回值是关键

4.(N)wheelCollider只允许加4个吗?

  当然不是,但因为我之前的自作主张在轮子上直接加wheelcollider,然后我给忘了,之后按书上的要求建空物体加,加到第5个发现加不了了。最后找到问题所在。
在这里插入图片描述
目前还不懂为啥我直接在轮子上加会搞的这么大。

5.(H)为什么[serializable]属性并没有让类里头的成员在inspector中出现?

  我怀疑是现在的List冲突了,但是去掉list依旧不行,感觉使用这个属性一点意义都没有,它到底有啥用。
  我先妥协了,创建两个Axleinfo吧,难受。
  受mentor指导领悟到,原来确实是能将类内成员序列化入unity,可显示在inspector上,但切记 [serializable]修饰类时这个类一定不要继承monobehavior

6.(E)书2.5.3节明显存在问题,update方法内连坦克position都没加,怎么可能实现运动。(我错了)

  只给了扭矩没有用,f = m*a 啊,等着还得自己算加速度,有加速度就得有最高速度,它书里目前这代码非常不对。还整了前驱和后驱,是否真的有用目前也感觉不出。
  我错了,确实可行,要注意到motorTorque是wheelCollider的内置变量,也就是说是wheelCollider帮我们做了物理计算工作,只需给个扭矩就给你算出位移与速度了。

7.(E)炮管随鼠标奇怪的扭转,不跟随炮塔。

是我自作主张的将三行汇聚一行,这没毛病,但汇聚之后却将LocalEuler的定义放到了118行,语句定义顺序不可小觑。
在这里插入图片描述

8.(H) partical包导入后prefab无效

  非常奇怪,无论用老版本还是新版本的书上的素材,无论用unity2018还是2019都不行。不信邪的我甚至打开了它第三章所用的整体资源包,果然就是不行。但它第三章的演示视频里确实是有爆炸效果。
  那就只有两种可能了,一是这个partical包实在太老了,估计得是5.x版本的才能用,二是他上传包的时候上传错了,总之爆炸特效还是自己搞个或者下载个吧。**
  我下载了detonator explosion,好用。

9.(E)炮弹射击音效声很短问题

  处理方式不对呗,我自作主张把音效挂在了炮弹prefab上,这个对象可是生成后很快就会被销毁的,销毁了上面的音效怎么可能播完嘛。这个问题其实瞬间就能发现,但是还是犯了这种低级错误。
  果然书里也说了这个问题,放到爆炸效果里确实是个好主意。

10.(H)炮弹攻击伤害爆表之谜

  这个问题确实困扰了我一阵,明明发射一发,怎么对面坦克直接GG了?刚开始以为是代码数值没调对,但左看右看也是对的,debug之后发现我的一发炮弹竟然debug出来两次,也就是说射了两发?再看代码,也没多调用方法啊,应该就是没问题,最后想会不会是距离过近了导致collision误认一发炮弹为两发,离远些打一炮还确实成了!然而事情没有这么简单。目前的情况让我意识到代码准定是没问题的,我知道速度过快容易穿模,但没听说过一次判定能判成两次啊,距离远近真的会影响有关系么,最后明白了其实是因为我在做坦克的碰撞体时把坦克分成了炮台与坦克身体两个碰撞体,而我那一发炮弹同时打到了两个碰撞体上。

11.(E)炮管上下旋转角度不对

  演示游戏的时候没有全屏,鼠标在屏幕外,这时进入屏幕,旋转方法就已经跟随鼠标转了,所以会有操作奇怪的感觉。

12.(E)坦克悬挂多个音源脚本怎么判断哪个是哪个

  当一个物件上需要挂多个声音的时候GetComponent就get不到对的audioSource了。比如说坦克上既需要引擎声,还得在发射炮弹时有发射的声。对于这种问题的解决方法,之前的micro-game里是直接将audio在hierarchy中划分出来,这样想播放哪个声音直接调用就好。我觉得这种解决方式更好一些。
  书里的解决方式是不用get从inspector中获取,而是用AddComponent直接往inspector中加(事实上之前它也是这么弄的,是我自己搞得get),怎么说呢,也确实可行。

13. (E)4.3.3节有一个错误,NoTarget方法最后minHp没有更新

  你不更新minHP的值岂不是每个坦克都满足血量要求了,遍历一遍将没有任何意义,这绝对是个错误。
  而这个错误之所以不容易发现的原因是因为这种小游戏,测试坦克时坦克数量不会多,尤其是单机版。
  另外这种找目标方式还可能导致NPC间互相决斗,但倒也不是不行。
在这里插入图片描述

14.(E)如何进入游戏即可发射炮弹,之后才有发射间隔

  我把炮弹间隔设为3秒,但刚进游戏之后如果想发射炮弹必须得等上3秒,有点不合理。
  解决方式为设一个变量,增加一个判定条件。
在这里插入图片描述

15.(E)记录点书中小错误

  一些变量名错误就不谈了无伤大雅。
  1)P135,GetBrakeTorque方法中的返回值应该是返回maxBrakeTorque
  2)P137,navigation于Window->AI->navigation。
  3)Tank类的trackmove不需在循环中调用。

16.(SH)坦克车速要么过快,要么过慢,容易打滑怎么办

  要么将wheelcollider的扭矩调低,启动速度也慢,调高了速度又太快。
  目前的感觉是自己实现车辆移动逻辑会更好,但准定更麻烦,我看第二版好像是自己简单实现了下,等着再好好看看,这个先不急。
  注意模型大小,把扭矩调小点,把质量调小点,就OK.
  更新,车辆容易翻倒的原因在于ForceAppPointDistance未调至车轮中心。
   为何刹车速度会那么慢,braketorque的效果根本不理想怎么优化?
   调大wheelCollider的forwardfriction,摩擦力不够大再怎么加大brakeTorque都没用

17. (E)4.7.3节巡逻逻辑并没有编写完善

  是因为我发现书里并没有实现PatrolStart方法,可能是觉得无伤大雅吧,就给忘了。然而事实上不编写完也不是不行。书中在update方法内通过判断Status来进行状态update,如果状态变了就调用changeStatus,如果变成attack模式就调用attackStart,patrol的话就是patrolstart。Attack Start它实现了,状态改变后直接更改坦克继续行动的目标地点为敌方坦克位置,但是其实Attack update里面也是这种操作,所以确实写不写都一样。而切换成Patrol的话呢,在PatrolUpdate内会判断当前目标位置走没走完,走完的话会随机分配一个巡逻点为目标。也是可行的。
  综上所述,就目前的功能需求,如果当切换成巡逻模式时你想立即前往随机巡逻点位置的话,就完善PatrolStart,否则的话它会先到达最后更新前敌方的位置,再前往随机巡逻点。同样可行。

18.(N)prefab要慎重删除

  我把hierachy中的tank挪到了asset中的prefabs文件夹下,它有两个选项,一个是create original prefab,一个是create variant prefab。这里要注意一定要选第一个,第二个是属于引用的性质,如果原本所在的地方被删除了,引用的prefab也会删除,而且无法undo。

19.(SH)AI坦克间互相不攻击问题

  这个问题排查可费劲了,情况是从出生点出生正常,寻路不太正常等着也得排查,就算进入范围后AI类里的target一直获取不到。
  在编写Battel模式之前还是好使的,说明BattleManager这里有问题,果然排查出判断是否为同一阵营的函数的判断条件有问题,但改完之后依然不对,还是有问题。
  太奇怪了,检查了一整遍代码都没有问题。运行游戏可以观察到我之前target的debug代码并没有输出,也就是说一直没有获取到target,结果最后竟然debug到AI类连update方法都没有更新!
  啊,原来是因为代码没保存,写糊涂了糊涂了。
在这里插入图片描述
  终于找到问题所在,果然还是这个方法的问题,把它注释掉就好使了,那就仔细看看这个方法到底哪有问题。
  太奇怪了!代码怎么看哪里都没有问题,但是debug输出的结果异常奇怪
在这里插入图片描述
  这个问题真是困扰了我好久好久,最终原因你猜是怎么回事?
是构造函数问题!!!以后谨慎使用new!!!
在这里插入图片描述
  上面的注释内容竟然就是罪魁祸首,而我是怎么发现的呢,Unity给警告了,以后一定要注意Unity的警告!!
  更新一下,上面的解答确实是问题的原因,但不是终极的答案,事实上问题的本质还是因为BattleTank类设计错了,我把它继承与MonoBehavior了!! 继承于monobehavior的类是继承了Start()啊Update()啊之类的函数的,而我的BattleTank类并不需要实现这些方法。它只需要被正常的new就好了,所以以后要new也行,new的类别瞎继承就行

20.(N)击杀图片显示问题

  以前的操作是这样的。
在这里插入图片描述
  就是把这个图片对象显示后再延迟执行1秒,在那个方法里把对象关掉。当时测试时是直接把hp调成0,确实可行。
  其实问题太大了,且不谈是自己杀自己,最大的问题是这是被攻击的坦克啊,击杀图像应该加到攻击者上!
  attackTank.GetComponent<Tank>().killImage.SetActive(true);这样能够让坦克显示图片了,怎么关闭呢?没办法再用Invoke了,我想到的办法是在这个图像下面挂个脚本,让他一秒关闭。

21.(N)坦克寻路谜之走法问题

  开始游戏后坦克总会先在出生点前后退,然后再前往路标点。
  将调试代码放到getMotor可以看到,获取到的位点从头到尾都是坦克的出生点,也就是说我设置的巡逻点根本没有起到作用,前往路标点也都是碰巧的假象。准定是代码调用有问题。
  层层方法调试最后判断出是在Path的InitNavMesh中出现了奇怪之处,调用CalculatePath后,会出现从起点到目标点的正确路径,而我这路径中间没有障碍物,所以就起点和终点两个点,明显是更新有问题,一直在起点。那就是函数没有正确判断是否已经到达目标点了呗,果然, 在AI类里的update中我竟然把判断方法给注释掉了!当时可能是觉得这个判断没用了吧,结果搞出这个幺蛾子。

22.(SH)游戏开始时有半秒长的6下咯吱声

  6下咯吱声,在编写出生点之前是没有这种情况的,结合我生成6辆坦克。是可以先把错误定位在出生点范围排查。
   坦克预制件应该没问题。我将游戏生成出来运行,只有一下“吱”的声音,而且声音不大,那也不对,在unity里运行和在exe里运行为什么会不一样?而且我发现咯吱声不一定是6下,会有变化。
  mute audio之后就没声了,准定是哪个audio有问题。可audio要是有问题的话为什么之前没有咯吱声,
  重新尝试不出生,没有咯吱声。出生多个坦克,将camera放远,也没有咯吱声。出生敌我阵营各出一个坦克,没有咯吱声!敌方出3个坦克,我方只要是一个,就没事!
  所以可以怀疑原因出在我距离我方其他坦克过近了,不,依旧不对,离的远也照样有咯吱声!
  到底为什么生成敌方坦克没事,生成我方的只要多一个就会有咯吱声呢?

 public void StartTwoCampBattle(int n1, int n2)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值