UnityでS.S.デッドリー・ボンバーを作ってみる
人造人間13号*1が放つS.S.デッドリーボンバーをUnityで再現してみました。人造人間13号はドクター・ゲロが使っていたマシンが悟空抹殺のために自動で作りだした人造人間です。
構造は、まず真ん中のコアのような球体と、その外側に赤い帯が表示されている球体、さらに一番外側には透明な球体の3つのsphereオブジェクトを作成しました。赤い帯のような模様はテクスチャで表現しました。
透過テクスチャなのでサーフェスシェーダーでマルチパスレンダリングを行います。シェーダーのコードはこちらを参考にしました。
1番外側のsphereには6個のparticle systemを子オブジェクトに設定してあります。原作のようにサイズ差のあるパーティクルにするためにstartSizeをCurveで変更してあります。
6個のparticle systemのうち4個をスクリプト上で180フレームごとにランダムに出し分けています。
using UnityEngine; using System.Collections; public class SSDBOuterController : MonoBehaviour { public GameObject[] particle_lines; private System.Random r; private int[] particle_status = new int[6]; private int particle_interval = 0; // Use this for initialization void Start () { r = new System.Random(1000); for(int i = 0; i < particle_lines.Length; i++){ particle_lines[i].particleSystem.Pause(); } } // Update is called once per frame void Update () { if(particle_interval < 180){ gameObject.transform.Rotate (new Vector3((float)r.Next (2, 8), (float)r.Next (2, 8), (float)r.Next(2,8))); particle_interval++; } else{ // 一旦すべて表示状態にする for(int i = 0; i < particle_status.Length; i++){ particle_lines[i].particleSystem.renderer.enabled = true; particle_status[i] = 0; } int counter = 0; // ランダムで1/3を選んで消す while(counter < (particle_lines.Length / 3)){ int index = r.Next(0, particle_lines.Length - 1); if(particle_status[index] == 0){ particle_status[index] = 1; particle_lines[index].renderer.enabled = false; counter++; //Debug.Log (index); } } particle_interval = 0; } } }
赤い帯の回転と周りの光の筋の回転が同期していないのが原作において仕様であることと、particle systemを固定座標で回転させると見た目がワンパターンになってしまうのでこのような実装にしました。
さらに原作では光の筋の長さが一定ではないため、particle systemの設定を6本のうち2本だけ変えて2倍の長さにしてあります。
赤い帯のsphereと真ん中のコアの周りにただよう拡散光はHaloで表現しました。
ついでにskyboxを設定しました。skyboxのテクスチャはImport Packageで取り込まれるデフォルトのテクスチャです。
私はドラゴンボールに出てくるエネルギー波の中で、人造人間13号が放つS.S.デッドリーボンバーとピッコロの魔貫光殺砲の2つが単体でのビジュアルに最も富んでいるものだと思っています。
コードと素材一式はgithubに置いておきました。
この惑星(ほし)の半分を吹き飛ばすほどのパワーがあるのだぞ!!!