找回密碼
 注冊帳號

掃一掃,訪問微社區

士郎 我們來用Unity3D做一下彈幕設計

288
回復
11710
查看
打印 上一主題 下一主題
  [ 復制鏈接 ]
9以壇為家
33141/50000
排名
1
昨日變化

8252

主題

8810

帖子

3萬

積分

Rank: 9Rank: 9Rank: 9

UID
1231
好友
186
蠻牛幣
215
威望
30
注冊時間
2013-7-29
在線時間
4217 小時
最后登錄
2019-11-20

活力之星原創精華達人突出貢獻獎財富之證游戲蠻牛QQ群會員蠻牛妹VIP

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
前言:
《東方》系列,以其華麗麗的彈幕以及高手行云流水的操作給到了咱們深刻的印象。
那么在Unity中,我們如何來實現這些內容呢?請看下文。
基礎篇:
1.散彈彈幕
大部分STG游戲中都有散彈這一種彈幕樣式。其實質,就是在發射方向的左右兩邊,偏移相同的角度,在同一幀內發射方向不同的多顆子彈,造成散射的感覺(此處不討論無規則的散彈模式)。原理如下圖:

[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秒進行下一波發射
        }
    }

完成后效果如圖:

[size=0.9em]散彈彈幕效果圖示


2.圓形彈幕
圓圈形狀的彈幕在各種游戲中出現的頻次也是最高的。很多華麗的彈幕也是由基礎圓形彈幕組成的。其原理如下圖:



圓形彈幕原理圖示
實現方法類似散彈彈幕,只不過要將發射的子彈剛好組成一個圓圈,就需要每個子彈發射方向之間的角度相等,且相加剛好為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;
    }

完成后效果如圖:

[size=0.9em]圓形彈幕效果圖示


進階篇:
接下來是一些更接近于市面上商業游戲的復雜例子。一起來看看:
1.密集型彈幕

[size=0.9em]游戲截圖——東方地靈殿中的密集型彈幕


彈幕分析:
上圖中,首先是一個8方向的圓形彈幕,當子彈到達目標點后,再在各自當前的點生成N波多方向的圓形彈幕,塞滿大半個屏幕。其實現原理如下圖:



密集型彈幕原理圖示
通過上面的分析我們能很快得出,其實該彈幕就是不同角度以及不同位置圓形彈幕的組合使用。實現代碼如下:
   
[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));//通過之前彈幕的位置,生成多波多方向的圓形彈幕。這里調用了上面寫過的圓形彈幕函數
        }
    }

完成后效果如圖:



密集型彈幕效果圖示
此處彈幕并沒有完全復刻,最后發射完成后的有間隔的子彈,自動組合成一條直線的小細節,已經超出本文范疇,有興趣的同學可以自己嘗試分析一下原理。
2.渦輪型彈幕

[size=0.9em]游戲截圖——東方地靈殿中的渦輪型彈幕

[size=0.9em]


渦輪型彈幕其實質就是一個生成半徑不斷增長的圓形彈幕,然后混合了上面密集型彈幕的一個特征,在生成的位置再次生成一個多方向的圓形彈幕。其實現原理如下:



渦輪型彈幕原理圖示
這個彈幕主要難點就是找到下一個生成彈幕點(其實也不算難,上面都已經實現過了)。實現代碼如下:
   
[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;     //生成半徑增加
        }
    }

完成后效果如圖:



渦輪型彈幕效果圖示拓展篇:
球形彈幕



球型彈幕效果圖示
上面的球形彈幕,僅供拓展使用。有興趣的童鞋,可以自己觀察效果圖,分析出原理自己實現。這里就不貼出原理以及代碼圖了,其實現代碼我將一并打包進入工程,可以參考一下。
優化篇:
此篇文章旨在教會大家制作簡單彈幕,并沒有做任何優化的操作。而在實際游戲當中,同屏出現大量子彈會占用大量的內存資源,是必須做優化的。我在這提出幾點優化建議,有興趣的同學可以研究一二。
1.使用對象池優化,將游戲物體重復利用。關于對象池的的原理就不再細說。
2.自定義mesh。將場景中的子彈,全部使用通過代碼進行繪制,不使用游戲物體的模式來進行交互。同時子彈與周圍物體的碰撞檢測,也是自己代碼實現,這樣效果將會更好。
3.當場景的中的子彈都是存在單獨邏輯,且想要進行多核優化的,可以使用Unity的ECS模式進行優化。詳情查看以下鏈接:Unity 實體組件系統(ECS)——預覽與體驗
結語:
本篇文章大部分都是在進行數學運算,對童鞋的數學基礎有一定的要求。不太明白的同學,是時候補一下數學了回復可見工程地址!

游客,如果您要查看本帖隱藏內容請回復

友情提示:參考工程使用的版本是2018.3.0b7,如下載打開不能運行或者報錯,記得切換一下目標版本,重新嘗試。
知乎@繁華如夢

參與人數 7鮮花 +28 收起 理由
昨日友人 + 5 很給力!
鏡月之言 + 5 很給力!
zhangdong321 + 5
w20050830413 + 5 很給力!
648522683 + 2
阿薩德剛子 + 5 很給力!
yeying1949 + 1 贊一個!

查看全部評分總評分 : 鮮花 +28

回復

使用道具 舉報

4四處流浪
494/500
排名
5238
昨日變化

1

主題

24

帖子

494

積分

Rank: 4

UID
288469
好友
0
蠻牛幣
1411
威望
0
注冊時間
2018-7-4
在線時間
199 小時
最后登錄
2019-2-25
沙發
2018-12-11 12:45:14 只看該作者
好牛的效果
回復

使用道具 舉報

7日久生情
1574/5000
排名
1989
昨日變化

35

主題

184

帖子

1574

積分

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

UID
144217
好友
2
蠻牛幣
10176
威望
0
注冊時間
2016-4-1
在線時間
729 小時
最后登錄
2019-10-23
板凳
2018-12-11 13:11:40 只看該作者
666,很不錯
回復

使用道具 舉報

7日久生情
1976/5000
排名
976
昨日變化

2

主題

160

帖子

1976

積分

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

UID
186029
好友
1
蠻牛幣
3087
威望
0
注冊時間
2016-11-22
在線時間
728 小時
最后登錄
2019-11-28
地板
2018-12-11 13:21:38 只看該作者
游戲中子彈的特效......
回復 支持 反對

使用道具 舉報

5熟悉之中
692/1000
排名
4940
昨日變化

0

主題

55

帖子

692

積分

Rank: 5Rank: 5

UID
283796
好友
0
蠻牛幣
322
威望
0
注冊時間
2018-6-1
在線時間
343 小時
最后登錄
2019-11-8
5#
2018-12-11 14:05:24 只看該作者
很厲害的彈道
回復

使用道具 舉報

5熟悉之中
824/1000
排名
5761
昨日變化

9

主題

320

帖子

824

積分

Rank: 5Rank: 5

UID
285521
好友
0
蠻牛幣
1615
威望
0
注冊時間
2018-6-12
在線時間
243 小時
最后登錄
2019-11-23
6#
2018-12-11 14:56:56 只看該作者
大佬6666666666666666
回復 支持 反對

使用道具 舉報

7日久生情
4490/5000
排名
167
昨日變化

19

主題

325

帖子

4490

積分

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

UID
67323
好友
1
蠻牛幣
14811
威望
0
注冊時間
2015-1-10
在線時間
1868 小時
最后登錄
2019-10-3
7#
2018-12-11 15:05:57 只看該作者
看起來很不錯的樣子
回復 支持 反對

使用道具 舉報

5熟悉之中
949/1000
排名
3952
昨日變化

15

主題

306

帖子

949

積分

Rank: 5Rank: 5

UID
176358
好友
0
蠻牛幣
803
威望
0
注冊時間
2016-11-4
在線時間
240 小時
最后登錄
2019-10-17
8#
2018-12-11 15:07:59 只看該作者
{:106:}
回復

使用道具 舉報

8常駐蠻牛
7768/10000
排名
23
昨日變化

1

主題

664

帖子

7768

積分

Rank: 8Rank: 8

UID
30356
好友
0
蠻牛幣
8092
威望
0
注冊時間
2014-6-19
在線時間
3913 小時
最后登錄
2019-12-7
9#
2018-12-11 15:08:42 只看該作者
好牛的效果好牛的效果
回復 支持 反對

使用道具 舉報

4四處流浪
389/500
排名
8418
昨日變化

0

主題

79

帖子

389

積分

Rank: 4

UID
152665
好友
0
蠻牛幣
182
威望
0
注冊時間
2016-6-20
在線時間
166 小時
最后登錄
2019-10-23
10#
2018-12-11 15:48:13 只看該作者
很不錯,學習一下
回復

使用道具 舉報

7日久生情
2428/5000
排名
1387
昨日變化

0

主題

745

帖子

2428

積分

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

UID
135463
好友
0
蠻牛幣
226
威望
0
注冊時間
2016-1-23
在線時間
791 小時
最后登錄
2019-12-7
11#
2018-12-11 16:27:34 只看該作者
kjl;kjljhklkjgvhjv h
回復 支持 反對

使用道具 舉報

7日久生情
2223/5000
排名
1896
昨日變化

61

主題

809

帖子

2223

積分

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

UID
214924
好友
8
蠻牛幣
25163
威望
0
注冊時間
2017-3-28
在線時間
637 小時
最后登錄
2019-12-6
12#
2018-12-11 16:31:18 只看該作者
666666666666666666666666666
回復 支持 反對

使用道具 舉報

6蠻牛粉絲
1397/1500
排名
3288
昨日變化

24

主題

141

帖子

1397

積分

Rank: 6Rank: 6Rank: 6

UID
123454
好友
0
蠻牛幣
2024
威望
0
注冊時間
2015-9-22
在線時間
778 小時
最后登錄
2019-12-7
13#
2018-12-11 16:45:19 只看該作者
感謝樓主分享
回復

使用道具 舉報

7日久生情
3256/5000
排名
2252
昨日變化

0

主題

1691

帖子

3256

積分

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

UID
163777
好友
2
蠻牛幣
1512
威望
0
注冊時間
2017-2-27
在線時間
941 小時
最后登錄
2019-12-6
14#
2018-12-11 16:58:13 只看該作者
炫酷的效果!
回復

使用道具 舉報

2初來乍到
148/150
排名
24130
昨日變化

0

主題

38

帖子

148

積分

Rank: 2Rank: 2

UID
159657
好友
0
蠻牛幣
122
威望
0
注冊時間
2016-8-6
在線時間
92 小時
最后登錄
2019-9-5
15#
2018-12-11 17:25:01 只看該作者
樓主6666
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

女校游泳队彩金 牌九袖箭教学 股票行情 走势图 内蒙古老友麻将有挂吗 钱龙捕鱼 25选5开奖结果安徽中4 竞彩篮球让分胜负 25选7奖池 迅雷赚钱宝pro多少钱 金帝棋牌 吃鸡游戏的所有装备 极速快乐十分计划软件 超级拉霸游戏 ro手游连刺后期打什么赚钱6 广东时时11玩法介绍 梦幻西游转服查询 通比牛牛游戏平台