引言

在某些射击游戏里(2D和3D都适用),可能你需要创建子弹,第一想到的可能是新建一个发射子弹的脚本,就叫BulletController,然后每次按下什么键就直接上Instantiate函数。

伪代码如下:

public GameObject bullet;//子弹预制件private void Update()
{if(某些触发事件导致需要发射子弹){Shoot();}
}private void FixedUpdate()
{Move();
}private void Shoot()
{Instantiate(bullet, 需要从哪发射的position, Quaternion.identity);
}private void Move()
{transform.Translate(速度的三维向量);
}

这种方法很简单,但是假如子弹种类多了,那么每一个子弹都需要创建一个相同作用的脚本,唯一区别就是bullet预制件不一样。代码耦合性很高,逻辑性很差。因为想一想现实生活,子弹应该是控制位置的,发射子弹不是应该是枪该做的是吗?


第二种想法是创建一个GunController脚本和一个BulletController,然后每次需要发射子弹的时候让GunController来控制发射子弹。BulletController则是控制子弹的运动。

GunController的部分伪代码

public GameObject bullet;//子弹预制件private void Update()
{if(某些触发事件导致需要发射子弹){Shoot();}
}private void Shoot()
{Instantiate(bullet, 需要从哪发射的position, Quaternion.identity);
}

Bulletontroller的部分伪代码

private void FixedUpdate()
{Move();
}private void Move()
{transform.Translate(速度的三维向量);
}

这样就使得代码很简洁,而且耦合性很低,逻辑更加合理。

其实写到这也差不多了,但是如果是那种大型游戏,每次射击都需要创建一个新的子弹,如果子弹很多,那么会造成一些配置比较低的电脑卡顿,导致玩家体验效果极差。下面就用到了的思想,把所有的子弹都放到池(可以用容器List)里,当需要创建子弹的时候,先看看子弹池里面有没有子弹,如果有子弹,直接拿一个出来就可以了,不需要新建一个子弹了;如果没有子弹,那么就新建一个子弹就ok了。其实只是一开始需要创建子弹,后面基本都是复用子弹,不用创建子弹的了。
下面上伪代码

GameManager脚本代码

public GameObject bullet;//子弹预制件public List<GameObject> bulletPool;//子弹池//第一个参数是需要创建子弹的位置
public GameObject MakeBullet(Vector3 pos)
{if(playerBulletPool.Count > 0){//从子弹池取出一个子弹bullet = playerBulletPool[0];playerBulletPool.RemoveAt(0);bullet.transform.position = pos;bullet.SetActive(true);}else{//新建一个子弹bullet = Instantiate(bullet, pos, Quaternion.identity);}return bullet;
}

GunController的部分伪代码

private void Update()
{if(某些触发事件导致需要发射子弹){Shoot();}
}private void Shoot()
{GameObject newBullet = GameManager.Ins.MakeBullet(transform.position);
}

总结

其实这个思想很值得学习,也不一定用到子弹这个例子,例如共享单车什么的,也是利用复用这个思想。

Unity射击游戏发射子弹的方法和提升流畅性的小技巧相关推荐

  1. Ruby‘s Adventrue游戏制作笔记(十一)Unity角色攻击——发射子弹

    Ruby's Adventrue游戏制作笔记(十一)Unity角色攻击--发射子弹 前言 一.编辑子弹 二.创建脚本 三.修改玩家攻击脚本 四.将子弹拖入玩家脚本 五.让子弹碰撞到该碰撞的东西 六.编 ...

  2. 计算机自带游戏在哪里打开,今天才知道,原来电脑上自带游戏模式,开启后瞬间提升流畅度...

    原标题:今天才知道,原来电脑上自带游戏模式,开启后瞬间提升流畅度 很多时候我们在玩网络游戏时,电脑就会出现卡顿现象,其实在Win10系统中自带游戏模式,当我们开启游戏模式之后,能瞬间提升游戏的流畅度. ...

  3. 用unity做一个发射子弹的模拟

    模拟的的思路是,用鼠标点击屏幕,然后实例化一个预制体,利用刚体组件使它有个向前发射的效果,将生成的物体写入一个数组,当物体数量达到五个的时候,销毁数组中下标为0的预制体,同时将销毁物体从数组中移除. ...

  4. linux射击游戏下载,子弹骑士地牢爬行射击

    子弹骑士地牢爬行射击游戏是好玩有趣的休闲射击手机游戏,游戏中带了卡通可爱的游戏画面,简单有趣的游戏玩法,色彩鲜艳的游戏场景.子弹骑士地牢爬行射击游戏中,玩家将操控自己的武器,用最快的速度射击所有敌对份 ...

  5. 统计java类含有多少个方法_35个Java代码优化的小技巧,你知道几个?

    技术文章第一时间送达! 作者:coates https://www.cnblogs.com/coates/articles/7204652.html 前言 代码优化,一个很重要的课题.可能有些人觉得没 ...

  6. Unity 射击游戏的准星位置

    做有射击元素的游戏制作准星时,随着物体的旋转以及视线偏移可能会产生一定的的误差,使得子弹(射线)发射的初始位置不在屏幕正中央,所以制作准星时,应该基于屏幕的宽高进行衡量.示例代码如下: Raycast ...

  7. unity射击游戏的倍镜

    首先创建一个场景,然后再弄几个目标 然后在新建一个Image把名字设置成Beijing,把瞄准镜的贴图放上去并且调整到合适的大小(注意贴图要把Texture Type设置成2D/UI) 在新建一个Im ...

  8. unity射击游戏:超萌射手(1)使用EasyTouch3.0控制主角

    本文由作者@zx一路飞奔出品,转载请注明出处 文章地址:http://blog.csdn.net/u014735301/article/details/42705443 作者微博:http://wei ...

  9. 用计算机玩游戏最简单的方法,如何制作电脑简易命令小游戏

    满意答案 sylvia1017 2019.01.20 采纳率:48%    等级:7 已帮助:460人 简单的Dos小游戏 开始学习java,这周只简单的学习了C++的基本语法:输入输出,判断循环,因 ...

最新文章

  1. Android Service
  2. python find函数 和index的区别_【全网最简单Python教程】--10.列表元素的索引和返回索引值(Index函数使用)...
  3. 论文翻译:ImageNet Classification with Deep Convolutional nerual network
  4. 记录一段让我吐血的代码
  5. 技术分享 | 混合云模式下SaaS端前端最佳实践
  6. python消息订阅_python rabbitmq消息发布订阅
  7. javascript相等运算符与等同运算符(转自www.jqueryba.com)
  8. FatFs - Generic FAT Filesystem Module
  9. 你对jstl了解多少----JSTL标签之函数(慎用)
  10. 端如何访问rc_如何进行 Linux 启动时间优化
  11. 已解决:mysql: [Warning] Using a password on the command line interface can be insecure.
  12. springmvc04跳转
  13. 使用SESSION实现PHP会话的步骤
  14. 怎么在oracle建表,在linux怎么操控oracle建表
  15. IIS管理器无法打开。启动后,在任务栏中有,但是窗口不见了
  16. win10手动安装打印机驱动
  17. python去除字符串中的单词_从字符串中删除特定单词的最有效方法
  18. MyBatis中达到where a and (b or c)形式
  19. 安庆师范大学计算机学院书记,安庆师范大学计算机与信息学院导师教师师资介绍简介-陈春生...
  20. 最全Markdown教程

热门文章

  1. Linux 参数之 max_map_count
  2. 亚马逊登陆显示服务器出错,Amazon CloudFront常见错误配置及解决方法
  3. putty 下载地址
  4. 【网络运维】小平头PingTow网络IP导入检测工具软件开发源代码分享
  5. Python+Vue计算机毕业设计酒店管理系统g72sp(源码+程序+LW+部署)
  6. linux使用gcc实现扫雷,基于linux环境下扫雷应用程序
  7. java学生成绩管理系统类图,学生成绩管理系统的用例类图
  8. Disruptor并发框架,核心组件RingBuffer
  9. Oracle查询语句练习(一)
  10. vue大屏展示 代码 从0 到1