Aizu-Progressive xr Lab blog

会津大学のVR部であるA-PxLの部員が持ち回りで投稿していくブログです。部員がそれぞれVRに関する出来事やVRにちなんだことについて学んだことを書いていきます。

「面白法人カヤックVR分室」としても活動しています。詳細はこちら

Trail Rendererで軌跡を描く

明けましておめでとうございます、学部2年の森川です。
今回はチームの方で使用するために作成したパーティクルの中で、Trail Rendererを用いた銃弾の軌跡のエフェクトの製作過程をまとめていきたいと思います。

f:id:aizu-vr:20190108212230p:plain


Trail Rendererの説明


 軌跡を表現するのに、"Trail Renderer"というコンポーネントを使用します。"Trail Renderer"の使い方について少し説明しておきます。

  • Materials
      Size : 値の数分Elementの配列を用意します。
      Element : 線(軌跡)の模様に使用するものをここに入れます。

  • Time
      軌跡の寿命を表してます。この値と弾の速さを調整することで、軌跡の長さを調整することができますね!

  • Min Vertex Distance
      簡単に説明してしまうと、軌跡を描写する時の荒さをここで調整することができます。
     値 = 1 を基準として考えるとして、
       値 = 0.1 -> より滑らかに描写される
       値 = 3 -> より荒く描写される
     という感じです。
     今回は銃弾の軌跡ということで弾は湾曲せずに直進して進むので、この値は大きくて良さそうですね。

  • Width
      名前の通り、線の幅の大きさを調整できます。

  • Graph
      先ほどの"Width"では全体の線の太さを調整しましたが、こちらでは線が発生してから消えるまでの太さをより細かく調整することができます。
      操作の仕方はParticleSystemのSizeOverLifetimeのカーブなどと同じです。

f:id:aizu-vr:20190108180915p:plain

 他にも自分で調整できる機能はたくさん存在しますが、ここでは使用しないので気になる方は記事の最後に参考ページを載せてるのでそちらを参照してください。


 それではコンポーネントの簡単な紹介をしたので、早速作っていきましょう!

製作過程

親子関係はこのようにしました

     [銃弾のオブジェクト]
          ∟ [銃弾の軌跡]
              ∟ [軌跡の飾り]

 ここでオブジェクトと軌跡を別々に分けた理由として、オブジェクトを何かに差し替えたいと思った時に便利だからです。軌跡以下の子を新しいオブジェクトの子に差し替えれば新たに値を設定し直すことがなくて済みますね!

 それでは、パーツごとに説明していきますね。

銃弾のオブジェクト

 今回はモデルを仮で"Sphere"を使ってやります。Scaleは(0.1,0.1,0.1)にします。
コンポーネントにオブジェクトが前進するスクリプトを用意してあげます。銃弾なのでこれは必要ですね(´∀`)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestMove : MonoBehaviour {

    public float speed;
    public float destroyTime;

    void Start () {
        Destroy(gameObject, destroyTime);
    }
    
    void Update () {
        transform.position += transform.forward * Time.deltaTime * speed;
    }
}

 こいつを追加させてあげるとUnityのInspector上で、銃弾の速さ、銃弾が消滅するまでの時間を調整することができます。他に必要があれば当たり判定の処理などをここに追加してみてもいいかもしれませんね。

銃弾の軌跡

 ここでは先ほど説明したTrail Rendererを使用していきます。空オブジェクトを用意してこれにAddしましょう。子に置いた状態でのオブジェクトのScaleは(10,10,10)。Trail Rendererのそれぞれのパラメーターの値を次のようにします。
     ・Materials - Size : 1
     ・Time : 0.5
     ・Min Vertex Distance : 3
     ・Width : 0.5
     ・Graph
f:id:aizu-vr:20190108213140p:plain

 次に軌跡のマテリアルを用意します。今回使用するテクスチャはこんな感じのものです。
f:id:aizu-vr:20190108213109p:plain
 これをTrail Rendererで使用するためには、マテリアルのシェーダーを

     Legacy Shaders -> Particles -> Alpha Blended

 に設定してあげます。Alpha Blendedとは半透明を示していて、他の半透明マテリアルが重なった場合、SortingFudgeの値が小さい方が画面の手前側に描画されます。他にはAdditiveというものがあり、これは加算を示しています。2つの加算マテリアルが重なった場合、SortingFudgeの値に関係なく色が加算されます。赤+青=紫みたいなイメージです。

 マテリアルを用意できたら、Materials - Element 0 に割り当ててあげましょう。

軌跡の飾り

 ここでは軌跡にちょっとした小さな光の玉を漂わせるパーティクルを追加します。軌跡だけだとちょっと寂しいので・・・w

 各パラメータはこんな感じ
  f:id:aizu-vr:20190108213151p:plain

これで一通り完成しました!
実際に銃弾モデルに追加したコードのSpeedパラメータを100、Destroy Timeを2にして動かしてみます。
f:id:aizu-vr:20190108213126p:plain
銃弾の軌跡っぽいのが出来上がってますね、バンザイー!!(*゚▽゚)ノ

+αで・・・

 これだけじゃちょっと物足りなかったので銃弾の軌跡に少し要素を付け加えてみます。

 まず、先ほど作った軌跡銃弾のオブジェクトをもう一つ用意します。そしたら次のような親子関係に。
     [銃弾のオブジェクト]
          ∟ [銃弾の軌跡]
          |    ∟ [軌跡の飾り]
          |
          ∟[銃弾のオブジェクト]
               ∟ [銃弾の軌跡]
                   ∟ [軌跡の飾り]

 スクリプトは以下のように変更します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestMove : MonoBehaviour {

    public float speed;
    public float destroyTime;

    public float rotSpeed; //add
    float rotZ = 0; //add

    void Start () {
        Destroy(gameObject, destroyTime);
    }
    
    void Update () {
        transform.position += transform.forward * Time.deltaTime * speed;
        rotZ += rotSpeed; //add
        transform.rotation = Quaternion.Euler(0, 0, rotZ); //add
    }
}

 新たに追加した変数rotSpeed、rotZはそれぞれ回転速度、オブジェクトのRotationのZ座標を表してます。
 コードを書き直したら、子の銃弾オブジェクトのこのコードを消してください。それと、子の銃弾オブジェクトのPositionのX座標を1にします。そしてMesh Rendererを非アクティブにしてあげましょう。
 最後にrotSpeedの値や、子の銃弾の軌跡の太さを調節してあげてると・・・
f:id:aizu-vr:20190108231633p:plain
 螺旋状に軌跡を描くこともできたりします!


引用元

gametukurikata.com

会津大学VR部の部員が持ち回りで投稿していくブログです。特にテーマに縛りを設けずに書いていきます!