【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2395

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2498|回复: 126

[士郎] 我们来用Unity3D做一下弹幕设计

  [复制链接]  [移动端链接]
排名
1
昨日变化

7201

主题

7731

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
11748
威望
30
注册时间
2013-7-29
在线时间
3692 小时
最后登录
2019-1-18

社区QQ达人活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

发表于 2018-12-11 12:16:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
前言:
《东方》系列,以其华丽丽的弹幕以及高手行云流水的操作给到了咱们深刻的印象。
那么在Unity中,我们如何来实现这些内容呢?请看下文。
基础篇:
1.散弹弹幕
大部分STG游戏中都有散弹这一种弹幕样式。其实质,就是在发射方向的左右两边,偏移相同的角度,在同一帧内发射方向不同的多颗子弹,造成散射的感觉(此处不讨论无规则的散弹模式)。原理如下图:
1.1.gif
[size=0.9em]散弹弹幕原理图示


只要能够让发射方向能够按照我们的想法进行旋转,就能够实现想要的效果。此处使用协程来完成。实现代码如下:
   
[AppleScript] 纯文本查看 复制代码
IEnumerator FirShotgun()
    {
        Vector3 bulletDir = firPoint.transform.up; //由于资源的原因,我们这边的发射方向为物体的Up轴方向
        Quaternion leftRota = Quaternion.AngleAxis(-30, Vector3.forward);
        Quaternion RightRota = Quaternion.AngleAxis(30, Vector3.forward); //使用四元数制造2个旋转,分别是绕Z轴朝左右旋转30度
        for (int i=0;i<10;i++)     //散弹发射次数
        {
            for (int j=0;j<3;j++) //一次发射3颗子弹
            {
                switch (j)
                {
                    case 0:
                        CreatBullet(bulletDir, firPoint.transform.position);  //发射第一颗子弹,方向不需要进行旋转。参数为子弹运动方向与生成位置,函数实现未列出。
                        break;
                    case 1:
                        bulletDir = RightRota * bulletDir;//第一个方向子弹发射完毕,旋转方向到下一个发射方向
                        CreatBullet(bulletDir, firPoint.transform.position);//调用生成子弹函数,参数为发射方向与生成位置。
                        break;
                    case 2:
                        bulletDir = leftRota*(leftRota * bulletDir); //右边方向发射完毕,得向左边旋转2次相同的角度才能到达下一个发射方向
                        CreatBullet(bulletDir, firPoint.transform.position);
                        bulletDir = RightRota * bulletDir; //一轮发射完毕,重新向右边旋转回去,方便下一波使用
                        break;
                }
            }
            yield return new WaitForSeconds(0.5f); //协程延时0.5秒进行下一波发射
        }
    }

完成后效果如图:
1.2.gif
[size=0.9em]散弹弹幕效果图示


2.圆形弹幕
圆圈形状的弹幕在各种游戏中出现的频次也是最高的。很多华丽的弹幕也是由基础圆形弹幕组成的。其原理如下图:
1.3.gif


圆形弹幕原理图示
实现方法类似散弹弹幕,只不过要将发射的子弹刚好组成一个圆圈,就需要每个子弹发射方向之间的角度相等,且相加刚好为360度才行。其实现原理如下:
   
[AppleScript] 纯文本查看 复制代码
IEnumerator FirRound(int number,Vector3 creatPoint)//参数为发射波数与子弹生成点
    {
        Vector3 bulletDir = firPoint.transform.up;//发射方向
        Quaternion rotateQuate = Quaternion.AngleAxis(10, Vector3.forward);//使用四元数制造绕Z轴旋转10度的旋转
        for (int i=0;i< number; i++)    //发射波数
        {
            for (int j=0;j<36;j++)
            {
                CreatBullet(bulletDir, creatPoint);   //生成子弹
                bulletDir = rotateQuate * bulletDir; //让发射方向旋转10度,到达下一个发射方向
            }
            yield return new WaitForSeconds(0.5f); //协程延时,0.5秒进行下一波发射
        }
        yield return null;
    }

完成后效果如图:
1.4.gif
[size=0.9em]圆形弹幕效果图示


进阶篇:
接下来是一些更接近于市面上商业游戏的复杂例子。一起来看看:
1.密集型弹幕
1.5.gif
[size=0.9em]游戏截图——东方地灵殿中的密集型弹幕


弹幕分析:
上图中,首先是一个8方向的圆形弹幕,当子弹到达目标点后,再在各自当前的点生成N波多方向的圆形弹幕,塞满大半个屏幕。其实现原理如下图:
1.6.gif


密集型弹幕原理图示
通过上面的分析我们能很快得出,其实该弹幕就是不同角度以及不同位置圆形弹幕的组合使用。实现代码如下:
   
[AppleScript] 纯文本查看 复制代码
IEnumerator FirRoundGroup()
    {
        Vector3 bulletDir = firPoint.transform.up;
        Quaternion rotateQuate = Quaternion.AngleAxis(45, Vector3.forward);//使用四元数制造绕Z轴旋转45度的旋转
        List<BulletCharacter> bullets = new List<BulletCharacter>();       //装入开始生成的8个弹幕
        for (int i=0;i<8;i++)
        {
            var tempBullet = CreatBullet(bulletDir, firPoint.transform.position);
            bulletDir = rotateQuate * bulletDir; //生成新的子弹后,让发射方向旋转45度,到达下一个发射方向
            bullets.Add(tempBullet); 
        }
        yield return new WaitForSeconds(1.0f);   //1秒后在生成多波弹幕
        for (int i = 0; i < bullets.Count; i++)
        {
            bullets[i].speed = 0; //弹幕停止移动
            StartCoroutine(FirRound(6, bullets[i].transform.position));//通过之前弹幕的位置,生成多波多方向的圆形弹幕。这里调用了上面写过的圆形弹幕函数
        }
    }

完成后效果如图:
1.7.gif


密集型弹幕效果图示
此处弹幕并没有完全复刻,最后发射完成后的有间隔的子弹,自动组合成一条直线的小细节,已经超出本文范畴,有兴趣的同学可以自己尝试分析一下原理。
2.涡轮型弹幕
1.8.gif
[size=0.9em]游戏截图——东方地灵殿中的涡轮型弹幕

[size=0.9em]


涡轮型弹幕其实质就是一个生成半径不断增长的圆形弹幕,然后混合了上面密集型弹幕的一个特征,在生成的位置再次生成一个多方向的圆形弹幕。其实现原理如下:
1.9.gif


涡轮型弹幕原理图示
这个弹幕主要难点就是找到下一个生成弹幕点(其实也不算难,上面都已经实现过了)。实现代码如下:
   
[AppleScript] 纯文本查看 复制代码
IEnumerator FireTurbine()
    {
        Vector3 bulletDir = firPoint.transform.up;      //发射方向
        Quaternion rotateQuate = Quaternion.AngleAxis(20, Vector3.forward);//使用四元数制造绕Z轴旋转20度的旋转
        float radius = 0.6f;        //生成半径
        float distance = 0.2f;      //每生成一次增加的距离
        for (int i=0;i<18;i++)
        {
            Vector3 firePoint = firPoint.transform.position + bulletDir * radius;   //使用向量计算生成位置
            StartCoroutine(FirRound(1, firePoint));     //在算好的位置生成一波圆形弹幕
            yield return new WaitForSeconds(0.05f);     //延时较小的时间(为了表现效果),计算下一步
            bulletDir = rotateQuate * bulletDir;        //发射方向改变
            radius += distance;     //生成半径增加
        }
    }

完成后效果如图:
2.0.gif


涡轮型弹幕效果图示拓展篇:
球形弹幕
2.1.gif


球型弹幕效果图示
上面的球形弹幕,仅供拓展使用。有兴趣的童鞋,可以自己观察效果图,分析出原理自己实现。这里就不贴出原理以及代码图了,其实现代码我将一并打包进入工程,可以参考一下。
优化篇:
此篇文章旨在教会大家制作简单弹幕,并没有做任何优化的操作。而在实际游戏当中,同屏出现大量子弹会占用大量的内存资源,是必须做优化的。我在这提出几点优化建议,有兴趣的同学可以研究一二。
1.使用对象池优化,将游戏物体重复利用。关于对象池的的原理就不再细说。
2.自定义mesh。将场景中的子弹,全部使用通过代码进行绘制,不使用游戏物体的模式来进行交互。同时子弹与周围物体的碰撞检测,也是自己代码实现,这样效果将会更好。
3.当场景的中的子弹都是存在单独逻辑,且想要进行多核优化的,可以使用Unity的ECS模式进行优化。详情查看以下链接:Unity 实体组件系统(ECS)——预览与体验
结语:
本篇文章大部分都是在进行数学运算,对童鞋的数学基础有一定的要求。不太明白的同学,是时候补一下数学了回复可见工程地址!

游客,如果您要查看本帖隐藏内容请回复

友情提示:参考工程使用的版本是2018.3.0b7,如下载打开不能运行或者报错,记得切换一下目标版本,重新尝试。
知乎@繁华如梦

评分

参与人数 4鲜花 +13 收起 理由
w20050830413 + 5 很给力!
648522683 + 2
阿萨德刚子 + 5 很给力!
yeying1949 + 1 赞一个!

查看全部评分


跟我念“站长妹纸萌萌哒!”我说站长,你说YO!爱你们么么哒~
回复

使用道具 举报

4四处流浪
468/500
排名
5374
昨日变化
2

1

主题

22

帖子

468

积分

Rank: 4

UID
288469
好友
0
蛮牛币
1412
威望
0
注册时间
2018-7-4
在线时间
187 小时
最后登录
2019-1-17
发表于 2018-12-11 12:45:14 | 显示全部楼层
好牛的效果

回复

使用道具 举报

6蛮牛粉丝
1413/1500
排名
2120
昨日变化

35

主题

169

帖子

1413

积分

Rank: 6Rank: 6Rank: 6

UID
144217
好友
1
蛮牛币
5712
威望
0
注册时间
2016-4-1
在线时间
627 小时
最后登录
2019-1-17
发表于 2018-12-11 13:11:40 | 显示全部楼层
666,很不错

回复

使用道具 举报

7日久生情
1795/5000
排名
1047
昨日变化

2

主题

150

帖子

1795

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
186029
好友
1
蛮牛币
2876
威望
0
注册时间
2016-11-22
在线时间
607 小时
最后登录
2019-1-18
发表于 2018-12-11 13:21:38 | 显示全部楼层
游戏中子弹的特效......

回复 支持 反对

使用道具 举报

5熟悉之中
512/1000
排名
6020
昨日变化
1

0

主题

45

帖子

512

积分

Rank: 5Rank: 5

UID
283796
好友
0
蛮牛币
466
威望
0
注册时间
2018-6-1
在线时间
241 小时
最后登录
2019-1-19
发表于 2018-12-11 14:05:24 | 显示全部楼层
很厉害的弹道

回复

使用道具 举报

5熟悉之中
819/1000
排名
5648
昨日变化
2

9

主题

322

帖子

819

积分

Rank: 5Rank: 5

UID
285521
好友
0
蛮牛币
1351
威望
0
注册时间
2018-6-12
在线时间
236 小时
最后登录
2019-1-14
发表于 2018-12-11 14:56:56 | 显示全部楼层
大佬6666666666666666

回复 支持 反对

使用道具 举报

7日久生情
4217/5000
排名
171
昨日变化
1

18

主题

318

帖子

4217

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
67323
好友
1
蛮牛币
3430
威望
0
注册时间
2015-1-10
在线时间
1657 小时
最后登录
2019-1-17
发表于 2018-12-11 15:05:57 | 显示全部楼层
看起来很不错的样子

回复 支持 反对

使用道具 举报

5熟悉之中
906/1000
排名
3923
昨日变化
9

14

主题

294

帖子

906

积分

Rank: 5Rank: 5

UID
176358
好友
0
蛮牛币
787
威望
0
注册时间
2016-11-4
在线时间
216 小时
最后登录
2019-1-18
发表于 2018-12-11 15:07:59 | 显示全部楼层
{:106:}
[发帖际遇]: nanyang0310 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

8常驻蛮牛
6925/10000
排名
27
昨日变化

1

主题

572

帖子

6925

积分

Rank: 8Rank: 8

UID
30356
好友
0
蛮牛币
8626
威望
0
注册时间
2014-6-19
在线时间
3278 小时
最后登录
2019-1-20
发表于 2018-12-11 15:08:42 | 显示全部楼层
好牛的效果好牛的效果

回复 支持 反对

使用道具 举报

4四处流浪
336/500
排名
8613
昨日变化
2

0

主题

73

帖子

336

积分

Rank: 4

UID
152665
好友
0
蛮牛币
140
威望
0
注册时间
2016-6-20
在线时间
129 小时
最后登录
2019-1-17
发表于 2018-12-11 15:48:13 | 显示全部楼层
很不错,学习一下

回复

使用道具 举报

7日久生情
1947/5000
排名
1631
昨日变化
5

0

主题

628

帖子

1947

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
135463
好友
0
蛮牛币
95
威望
0
注册时间
2016-1-23
在线时间
541 小时
最后登录
2019-1-20
发表于 2018-12-11 16:27:34 | 显示全部楼层
kjl;kjljhklkjgvhjv h

回复 支持 反对

使用道具 举报

7日久生情
1770/5000
排名
2075
昨日变化
11

21

主题

668

帖子

1770

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
214924
好友
3
蛮牛币
6273
威望
0
注册时间
2017-3-28
在线时间
427 小时
最后登录
2019-1-20

锦衣玉食

发表于 2018-12-11 16:31:18 | 显示全部楼层
666666666666666666666666666

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1006/1500
排名
3911
昨日变化
10

13

主题

103

帖子

1006

积分

Rank: 6Rank: 6Rank: 6

UID
123454
好友
0
蛮牛币
678
威望
0
注册时间
2015-9-22
在线时间
514 小时
最后登录
2019-1-20
发表于 2018-12-11 16:45:19 | 显示全部楼层
感谢楼主分享

回复

使用道具 举报

6蛮牛粉丝
1309/1500
排名
2558
昨日变化
12

0

主题

296

帖子

1309

积分

Rank: 6Rank: 6Rank: 6

UID
163777
好友
1
蛮牛币
495
威望
0
注册时间
2017-2-27
在线时间
461 小时
最后登录
2019-1-18
发表于 2018-12-11 16:58:13 | 显示全部楼层
炫酷的效果!

回复

使用道具 举报

2初来乍到
111/150
排名
23845
昨日变化
12

0

主题

31

帖子

111

积分

Rank: 2Rank: 2

UID
159657
好友
0
蛮牛币
152
威望
0
注册时间
2016-8-6
在线时间
62 小时
最后登录
2018-12-20
发表于 2018-12-11 17:25:01 | 显示全部楼层
楼主6666

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表