写完玩家的移动,接下来就开始写玩家的射击。玩家是一直射击的,然后射击有个间隔。所以在Update里面就只是一个时间一直减,定义这个类为VirusPlayerShoot。

 public void OnUpdate(){if (_isStartShoot){_totalTime += Time.deltaTime;if (_totalTime > _shootDuration){_totalTime -= _shootDuration;Shoot();}}}

我们这里用OnUpdate替代Update,因为我们需要将这个OnUpdate放到一个管理类里面去做一个Update分流。然后先把几个变量填充进去。

 [SerializeField] private Transform _shootPos;private float _shootDuration;private float _interval;private float _totalTime;private bool _isStartShoot;public bool IsStartShoot{set { _isStartShoot = value; } get { return _isStartShoot; }}

接下来就是写Shoot方法了。

private void Shoot()
{int shootNum = VirusPlayerDataAdapter.GetShootNum();float originX = 0;int v = shootNum % 2;int vv = shootNum / 2;originX = v == 1 ? -vv * _interval : -(vv - 0.5f) * _interval;for (int i = 0; i < shootNum; i++){float x = originX + i * _interval + _shootPos.position.x;SpawnBullet(_shootPos.position, Vector3.zero, x, true);}}

首先获取飞机一次发射多少颗子弹,然后根据子弹数目计算子弹最终的X偏移所以 float x = originX + i * _interval + _shootPos.position.x;这样一句代码就是来计算子弹的最终X偏移。

SpawnBullet(_shootPos.position, Vector3.zero, x, true);根据射击的位置,子弹的角度,子弹的最终X偏移,是否成扇形。最后就是生成子弹方法了。

 private void SpawnBullet(Vector3 pos, Vector3 euler, float boderX, bool isSector){string bulletName = "BulletBlue";bool coin = VirusPlayerDataAdapter.GetShootCoin();bool power = VirusPlayerDataAdapter.GetPower();if (coin && power)bulletName = "BulletCoinPower";if (coin && !power)bulletName = "BulletCoin";if (!coin && power)bulletName = "BulletPower";int damage = VirusPlayerDataAdapter.GetShootPower();var obj = BulletPools.Instance.Spawn(bulletName);obj.transform.position = pos;obj.transform.eulerAngles = euler;obj.GetComponent<VirusPlayerBulletMove>().InitiDir(boderX, isSector);obj.GetComponent<VirusBulletDamage>().Initi(damage);}

子弹总共有四种类型,第一种是最普通的,第二种是火力加强,第三种是打病毒会产生金币的,第四种是火力加强并且打病毒会产生金币的,所以首先判断子弹的类型。然后生成对应的子弹,给子弹赋值它的伤害,玩家的射击讲完了接下来就是讲解玩家吃道具之后,我们将这个类定义为:VirusPlayerPropMrg,然后吃道具之后我们采用消息处理的机制来实现,就是这个类之负责处理吃到了道具之后 玩家做出相应的反应的。

    private void OnEnable(){EventRegister.EventStartListening<VirusPropAddEvent>(this);}private void OnDisable(){EventRegister.EventStopListening<VirusPropAddEvent>(this);}public void OnEvent(VirusPropAddEvent eventType){switch (eventType.PropEnum){case VirusPropEnum.Big:AddBigProp(eventType.Duration);break;case VirusPropEnum.Active:AddActiveProp(eventType.Duration);break;case VirusPropEnum.Weaken:AddWeakenProp(eventType.Duration);break;case VirusPropEnum.ReinforceShootSpeed:AddShootNumProp(eventType.Duration);break;case VirusPropEnum.ReinforceShootPower:AddShootPowerProp(eventType.Duration);break;case VirusPropEnum.CallFriend:AddCallFriendProp(eventType.Duration);break;case VirusPropEnum.LimitMove:AddLimitMoveProp(eventType.Duration);break;case VirusPropEnum.ShootCoin:AddShootCoinProp(eventType.Duration);break;case VirusPropEnum.ShootRepulse:AddShootRepulseProp(eventType.Duration);break;}}

游戏中总共有9种这里有个Switch其实是一种错误的写法。正确的写法应该是在吃到道具的时候然后再写 AddLimitMoveProp(eventType.Duration);这样类似的方法。

具体如下:

public class ActiveProp : VirusBaseProp
{[SerializeField] private float _duration;public override void Excute(Transform target){EventManager.TriggerEvent(new VirusPropAddEvent(_duration, VirusPropEnum.Active));PropPools.Instance.DeSpawn(gameObject);}
}

所以这个AddLimitMoveProp(eventType.Duration)应该放到Excute里面,所以这里就应该把EventManager去掉。为什么说我这里写法错了呢 因为在需求变了之后比如我们策划又想了一个道具那么这里岂不是要重新添加一个枚举同时又要在这里添加一个方法么? 所以我这里写法其实是错的。我也不建议写成我这样的。接下啦就是填充一下每种道具的具体方法。首先填写变大道具。

 private void AddBigProp(float duration){string str = VirusPropEnum.Big.ToString();Action<float> updateAction = t =>{_player.UpdatePropItem(VirusPropEnum.Big, t, duration);};Action callAction = () =>{VirusMrg.Instance.RecoverBiggerVirus();_player.RemovePropItem(VirusPropEnum.Big);TimerManager.Instance.RemoveTimer(str);};Action initiAction = () =>{VirusMrg.Instance.StartBiggerVirus();};Timer timer = new Timer(duration, updateAction, callAction, initiAction, () => { _player.AddPropItem(VirusPropEnum.Big); });TimerManager.Instance.AddTimer(str, timer);}

这个计时器也是之前写的,所以这个计时器就定义3个Action,一个初始化,一个更新的,一个时间结束后的。依次写完后面几个的。如果有什么问题qq联系:1850761495,源文件的地址:链接: https://pan.baidu.com/s/1tTXv-9s1BaTh6s_-3MFrhw 提取码: ri31 后期有些项目就可能放到github上去了,到时候我也会及时更新。

Unity 消灭病毒(98K)—2相关推荐

  1. Unity 消灭病毒(98K)—1

    好久没有写博客今天更新一篇类似于飞机大战的游戏制作,先看一下游戏的截图. 游戏基本还原了消灭病毒游戏功能,游戏总共有16种病毒分别为:吸附病毒,碰撞病毒,治疗病毒,飞镖病毒,防御病毒,放大缩小病毒,爆 ...

  2. 手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

    公众号关注 "菜鸟学Python" 设为 "星标",重磅干货,第一时间送达! 烟花三月下扬州,我想3月能下楼.虽然很多地方都已经开始慢慢的开放了,但是我怀念的胡 ...

  3. 微信消灭病毒哪个服务器好,消灭病毒怎么玩 微信小程序98k攻略

    最近微信上面的小程序消灭病毒98k十分火爆,是比特小队制作团队出的一款游戏,吸引了很多玩家,那么消灭病毒怎么玩呢?来随小编看看吧. 1 第一步:打开微信,搜索框内搜索"消灭病毒", ...

  4. 安卓3d游戏插件_微信创意小游戏:消灭病毒流水超3.5亿,5款累计流水过千万

    文/迪亚菠萝包 在今天举行的微信公开课PRO活动中,微信小游戏产品总监李卿发表了主题为「内容力·大作为·小游戏」的演讲. 以下为演讲要点: 微信小游戏平台累计注册用户已超10亿,小游戏平台商业规模总量 ...

  5. 微信消灭病毒哪个服务器好,消灭病毒哪个武器最好用?

    消灭病毒:在消灭病毒手游中有很多特色有趣的武器,还有各种不同的游戏关卡.游戏中每一关的病毒难度都不相同,因为游戏中武器到后面有很多种,很多小伙伴都由于不觉,那么关于武器选择哪个武器比较好用,哪个武器最 ...

  6. 【电子学会】2022年12月图形化三级 -- 消灭病毒

    消灭病毒 1. 准备工作 (1)选择背景Winter,默认角色小猫,添加角色Beachball(代表病毒),背景音乐Cave: (2)建立一个变量,变量名为"得分". 2. 功能实 ...

  7. python(pygame)开发一个超简易版消灭病毒

    python(pygame)开发一个超简易版消灭病毒 消灭病毒游戏 以下是游戏代码:每个类都是一个py文件,需要导包 1.主程序代码 2.飞机类 3.子弹类 4.病毒类 消灭病毒游戏 消灭病毒是一个打 ...

  8. scratch消灭病毒 电子学会图形化编程scratch等级考试三级真题和答案解析2022年12月

    目录 scratch消灭病毒 一.题目要求 1.准备工作 2.功能实现 二.案例分析

  9. pygame小游戏——消灭病毒保卫城市

    pygame小游戏--消灭病毒保卫城市 游戏简介 近期新冠肺炎疫情肆虐,考虑病毒传播的机理,用pygame开发消灭病毒保卫城市小游戏.本游戏属于策略游戏,通过设定城市人数(决定收入),可购买道具,包括 ...

最新文章

  1. html5网页怎么实现内容追加,纯js实现网页内容复制后自动追加自定义内容
  2. JAVA设计模式(09):结构型-代理模式(Proxy)
  3. Vitamio FAQ(2012-11-20 )
  4. 3D数学基础:图形与游戏开发---随笔五
  5. python中@staticmethod_Python中的@staticmethod和@classmethod的区别
  6. 汉诺塔 hanoi 如此简单
  7. linux编译带pgm的zmq,ZeroMQ接口函数之 :zmq_pgm – ØMQ 使用PGM 进行可靠的多路传输...
  8. java spliterator_java 8 stream中的Spliterator简介
  9. 紧急!Log4j2 再再爆雷:刚升级,又连爆 “核弹级” 远程数据泄露 ! v2.17.0 横空出世。。。...
  10. 谈谈对于企业级系统架构的理解
  11. 如何在电脑上彻底删除Oracle客户端?
  12. 安规电容与普通电容的区别
  13. STM32读取SM300D2七合一传感器模块数据在0.96寸OLED显示,通过DL-LN3X无线模块显示在上位机
  14. 蓝桥杯web:3.【功能实现】封装函数实现个人所得税计算器
  15. 苏宁618强势出圈,差异化竞争能力是杀手锏
  16. oracle 2018 拉里,Oracle拉里,有新武器对付SAP和HANA
  17. mysql报错1593_主从复制报1593错误的处理
  18. 染色法判断无向图是否为二部图
  19. 洛达照妖镜!检测真假洛达1562M、1562A、1562F蓝牙耳机的最新方法
  20. php redis rpoplpush,Redis Rpoplpush 命令 - Redis 教程 - 自强学堂

热门文章

  1. Qt中用代码修改日历控件所显示的日期
  2. [转]心飞扬双手互搏论饭统网的价值
  3. 有趣的定律1. 帕金森定律
  4. 4412在linux环境开发实例,Exynos4412交叉编译环境搭建
  5. 联合概率和条件概率区别
  6. 2022.11.13 学习周报
  7. 无线WiFi技术智能家居的优选方案,物联网WiFi芯片模块应用
  8. vivaldi浏览器_Vivaldi的最佳功能,一种针对高级用户的新型可自定义Web浏览器
  9. Commvault CommCell 认证绕过与任意文件下载【CVE-2021-34993】
  10. 网易新闻优化APK下载链接