
ストーカー反対!右近です。
先日、ようつべを徘徊していたら、
偶然”【Unite Tokyo 2018】誘導ミサイル完全マスター”という男心揺さぶる「神動画」に出会ってしまいました。
運命の出会いです。
出会ってしまったからには作らずにはいられないのが男の性。
据え膳食わぬは男の恥というやつです(絶対使い方間違ってる)。
ということで、今回は「神動画」で紹介されている「ホーミングレーザー」の作り方を紹介してみようと思います。
(誘導ミサイルのほうは難しくてまだやってないので、次回以降に紹介するかもです)
※使用バージョン:Unity 2018.2.9f1
この記事の目次
1.あらためて「神動画」の紹介
↓こちらが今回参考(○パク)にした動画になります。
この動画では、「誘導ミサイル」や「ホーミングレーザー」の他にも、
ゲーム作りで役立つ情報をたくさん知ることができるのでかなりおススメです。
2.「ホーミングレーザー」の作り方
さて、ここから上で紹介した動画にしたがって、「ホーミングレーザー」を作っていきたいと思います。
1.「ホーミング」の部分
まずは、適当に「的」になるオブジェクトと「弾」となるオブジェクトを配置します。
「的」は3Dオブジェクトの「Cube」で名前を「mato」に、
「弾」は3Dオブジェクトの「sqhere」で名前を「HomingLaser」としてました。
次に、「HomingLaser」という名前でC#スクリプトを新規作成します。
そして↓をマルコピして貼り付けしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class HomingLaser : MonoBehaviour { //Rigidbodyを入れる変数 Rigidbody rigid; //速度 Vector3 velocity; //発射するときの初期位置 Vector3 position; // 加速度 public Vector3 acceleration; // ターゲットをセットする public Transform target; // 着弾時間 float period = 2f; void Start () { // 初期位置をposionに格納 position = transform.position; // rigidbody取得 rigid = this.GetComponent<Rigidbody>(); } void Update () { acceleration = Vector3.zero; //ターゲットと自分自身の差 var diff = target.position - transform.position; //加速度を求めてるらしい acceleration += (diff - velocity * period) * 2f / (period * period); //加速度が一定以上だと追尾を弱くする if (acceleration.magnitude > 100f) { acceleration = acceleration.normalized * 100f; } // 着弾時間を徐々に減らしていく period -= Time.deltaTime; // 速度の計算 velocity += acceleration * Time.deltaTime; } void FixedUpdate() { // 移動処理 rigid.MovePosition(transform.position + velocity * Time.deltaTime); } void OnCollisionEnter() { // 何かに当たったら自分自身を削除 Destroy(this.gameObject); } } |
スクリプトのくわしい説明は、「神動画」のほうで詳しく行っているのでそちらをご覧ください。
一応、コメントで何の処理かは書いているので、参考にしてみてください。
次に、作ったスクリプトを「弾」となるオブジェクトのコンポーネントとして設定し、
「Target」に「マト」となるオブジェクトを設定してください。
そして、「Add Component」→「Physics」→「Rigidbody」で「Rigidbody」コンポーネントを追加し、
「Use Gravity」のチェックを外してください。
以上で「ホーミング」の部分はできました。
そのまま実行すると、「マト」に向かって「弾」が進んでいくことが確認できます。
GIFでは思いっきり当たっていないですが、それは「神動画」に解説がありますが、
1 2 3 4 5 |
//加速度が一定以上だと追尾を弱くする if (acceleration.magnitude > 100f) { acceleration = acceleration.normalized * 100f; } |
この処理で、加速度が一定以上になると追尾を弱くしているからです。
百発百中のホーミングレーザーを作りたい人は、この処理を消すと必ず当たるらしいです。
2.「レーザー」の部分
「ホーミング」の部分ができたところで、今度は「レーザー」の部分を作っていきます。
流れとしてはこんな感じです。
1.「レーザー」用のマテリアルを2つ作る。
2.「弾」の大きさを小さくする。
3.「Trail Renderer」を「弾」にセットする。
4.マテリアルをセットする。
1.「レーザー」用のマテリアルを2つ作る
まずは、「レーザー」用のマテリアルを2つ作ります。
マテリアルは「プロジェクトウィンドウ」→「Create」→「Material」で作れます。
名前は「Laser01」、「Laser02」としました。
そのまま各マテリアルの設定をしていきます。
「Laser01」は色だけを変更します。
個人的に「レーザー」と聞くと、青色をイメージしてしまうため青色にしました。
「Laser02」はシェーダーを、パーティクル用のシェーダーに変更します。
「Shader」→「Particles」→「Additive」で変更できます。
変更できたら、「Tint Color」を「Laser01」で設定した色と同じ色に変更します。
以上でマテリアルの設定は完了です。
2.「弾」の大きさを小さくする
うんと小さくします。
「Scale」の「X」、「Y」、「Z」を「0.01」にします。
3.「Trail Renderer」を「弾」にセットする
「弾」となるオブジェクトに「Trail Renderer」コンポーネントを追加します。
「Trail Renderer」は軌跡を簡単に付けることができるコンポーネントです。
「Inspecter」ウィンドウから、「Add Component」→「Effects」→「Trail Renderer」で追加することができます。
追加したら↓の画像の通り設定します。
赤枠で囲ったとこを気を付けて設定してください。
・「Materials」の「Element0」に「Laser02」マテリアルを。
・「Time」には「2」を。(ここの数字を変えると軌跡の長さを調節できます)
・「Width」は軌跡の太さを調節する項目です。
今回目指しているレーザーは極細ですので、パスタのように細くします(アルデンテ)。
数字の部分をクリックして数字を「0.1」に変えるのを忘れずに。
・「Color」は赤枠で囲っていますが、お好みで設定してください。
別に徐々に透け透けにならなくてもいい場合は、設定しなくてもオッケーです。
透け透けが好きな人は設定しましょう。
4.マテリアルをセットする
最後に、「弾」のマテリアルを「Laser01」変更して完成です。
3.完成したホーミングレーザー
一応、こちらが完成したホーミングレーザーです。
改善の余地ありありですが、レーザーと言われればレーザーくらいにはなっていると思います。
4.おまけ
おまけとして、レーザーにランダムで初速を付けたverを乗っけておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class HomingLaser : MonoBehaviour { //Rigidbodyを入れる変数 Rigidbody rigid; //速度 Vector3 velocity; //発射するときの初期位置 Vector3 position; // 加速度 public Vector3 acceleration; // ターゲットをセットする public Transform target; // 着弾時間 float period = 2f; void Start () { // 初期位置をposionに格納 position = transform.position; // rigidbody取得 rigid = this.GetComponent<Rigidbody>(); //--------追加部分------------------------------------------------- // 初速をランダムで与える velocity = new Vector3(Random.Range(-5.0f, 5.0f), Random.Range(-5.0f, 5.0f), 0); //--------追加部分終わり------------------------------------------------- } void Update () { acceleration = Vector3.zero; //ターゲットと自分自身の差 var diff = target.position - transform.position; //加速度を求めてるらしい acceleration += (diff - velocity * period) * 2f / (period * period); //加速度が一定以上だと追尾を弱くする if (acceleration.magnitude > 100f) { acceleration = acceleration.normalized * 100f; } // 着弾時間を徐々に減らしていく period -= Time.deltaTime; // 速度の計算 velocity += acceleration * Time.deltaTime; } void FixedUpdate() { // 移動処理 rigid.MovePosition(transform.position + velocity * Time.deltaTime); } void OnCollisionEnter() { // 何かに当たったら自分自身を削除 Destroy(this.gameObject); } } |
そんでもって、いっぱい出すとこんな感じです。
以上で、ホーミングレーザーの作り方は終わりです。
後は、お好みで改良してかっちょいいレーザーを作ってみてください。
とんでる、アイディア~♪
楽しく、トライ~♪