今回はパーティクルを使って煙のエフェクトを作成していく。
スプライトの準備
Sprites->VFXフォルダに入っているParticleSpriteAtlasを選択して、
SpriteModeをMultipleにし、SpriteEditorを開く
GridByCellCountを4*4に設定したのち、Slice & Applyをする。
ヒエレルキー+からEffect->ParticleSystemを選択
名前をSmokeEffectにする。
絵柄の変更
まずは白い粒から、2枚の煙スプライトがランダムに出てくるように設定する。
- Texture Sheet Animationを選択し、ModeをSpritesにする
- 煙のスプライトを2枚登録する(+を押すと増える)
- StartFrameを開きRandom two Constantsを選択し、0と2を入れる。こうすることで2枚のスプライトからランダムに選択される
- Frame over Timeは時間とともにスプライトをアニメーションさせるものだが今回は必要ないので選択した後、下画面に表示される右上がりの直線の右のコントロールポイントを選択し、右クリックからDelete keyする。
これで、シーンビューを見ると2つのスプライトがランダムに使用されていることがわかる。次のステップではそれらがどのように作成されるかを定義していく。
- Radiusを0に設定する。(自動的に0.0001となる)
- Angleを5に設定する。
1点から細いアングルで立ち上るようになった。次に以下の設定を行う。
- Start Lifetime:1つ1つのパーティクルの生存時間をRandom Between two Constantsを設定した後1.5と3に設定
- StartSpeed:誕生時の速度。これをRandomBetweenTwoConstantsを設定したのち0.5と1に設定
- Start Size:1つ1つのパーティクルの誕生時の大きさをRandomBetween twoConstantsを設定したのち0.3と0.5に設定
ここまででだいぶ煙っぽくなった!
ただ、消えるとき唐突に消えているので徐々に透明になるように設定しよう。
- Color over Lifetimeの赤囲み部分をクリックし、Editorを開き上右端のラベルをクリックし、Alpha(透明度)を0に設定する。こうすることで時間経過とともに透明にすることができる。
最後に大きさの変更を加えよう。消滅する寸前に急速に小さくなるように設定する。
- Size over Lifetime(時間に伴う大きさ変化)の赤囲みをクリック
2. 最後に小さくなるように曲線を以下動画のように編集する
これで煙が完成だ。まずはプレファブ化してヒエラルキーから消そう。
あとはEnemyをプレファブモードで開きSmokeEffectプレファブを子要素にして頭上から煙が出るように調整する。
実行してみよう。一見いいように見えるが、これは煙として正しい挙動だろうか?
煙がEnemyと連動しない設定をしよう。SmokeEffectをプレファブ編集モードで開きSimulation Space をWorldにする。
実行してみよう。自然な動きになったはずだ。
EnemyControllerの修正
最後に修理されたら、煙が止まる設定をいれよう。
EnemyControllerのFix()内に以下の1行を追加する。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyController : MonoBehaviour
{
public float speed = 1.0f;
public bool isVertical;
public float changeTime = 2.0f;
Rigidbody2D rb;
float timer;
int direction = 1;
Animator anim;
bool broken = true;
void Start()
{
rb=GetComponent<Rigidbody2D>();
timer = changeTime;
anim = GetComponent<Animator>();
}
void Update()
{
if(!broken) return;
timer -= Time.deltaTime;
if(timer < 0){
direction = -direction;
timer = changeTime;
}
Vector2 pos = rb.position;
if(isVertical){
pos.y=pos.y + Time.deltaTime * speed * direction;
anim.SetFloat("MoveX",0);
anim.SetFloat("MoveY",direction);
}else{
pos.x=pos.x + Time.deltaTime * speed * direction;
anim.SetFloat("MoveX",direction);
anim.SetFloat("MoveY",0);
}
rb.MovePosition(pos);
}
void OnCollisionEnter2D(Collision2D other) {
RubyController rubyCon = other.gameObject.GetComponent<RubyController>();
if(rubyCon != null){
rubyCon.ChangeHealth(-1);
}
}
public void Fix(){
broken = false;
rb.simulated = false;
anim.SetTrigger("Fixed");
transform.GetChild(0).GetComponent<ParticleSystem>().Stop();
}
}
transform.GetChild(0)で自分の最初の子要素を取得できる。(今回子要素は1つしかない)そこからParticleSystemコンポーネント取得し、Stop()を呼ぶことで再生を停止できる。
今回はここまで終了だ。
次回はHPを表示するUIを作成していく
コメント