ゾンビとUnity

ゾンビネタとUnityでのゲーム制作について綴るブログです。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Unity 伸びて縮んでワープするプレハブ

※Unity 5以上では未検証。



エフェクトの見た目には大した意味はありません。
これを作った目的は別のところにあります。

1. パーティクルシステムの使い方を把握する。
2. プレハブを読み込むだけで処理が始まるエフェクトを作る。
3. エフェクトをスクリプトで制御。
4. インターフェースを使った状態遷移処理。
5. 処理が終了したら自動的に破棄してくれる。


読み込んで必要なパラメータを設定したら、後はほったらかしにできるようにします。

1. パーティクルシステムの使い方を把握する。
グーグル先生に聞くと詳しく使い方を説明しているWebページを沢山教えてくれるので説明は省きます。

2. プレハブを読み込むだけで処理が始まるエフェクトを作る。
Project > Assets に Resources フォルダを追加して、この中にエフェクトの処理を行うプレハブを入れればプロジェクト実行中に Resources.Load() で読み込めるようになります。
アセットから読み込んで Instantiate() すれば、勝手にエフェクトの処理が始まるはずです。

3. エフェクトをスクリプトで制御。
Animation を使わずに、スクリプトだけで処理します。

4. インターフェースを使った状態遷移処理。
class any_class {
  int state = 0;
  void update() {
    switch (state) {
    case 0: /* 初期化 */ break;
    case 1: /* オブジェクトが伸びる */ break;
    case 2: /* オブジェクトを移動させる */ break;
    case 3: /* オブジェクトが元のサイズに戻る */ break;
    case 4: /* クリーンアップ */ break;
    }
  }
}
こういう処理はしないで、interface を使って上手にカプセル化された処理を行います。

interface IState { IState Update(); }

class State0 : IState {
  public IState Update() {
    //初期化
    return new State1();
  }
}

class State1 : IState {
  public IState Update() {
    //オブジェクトが伸びる
    return new State2();
  }
}

class State2 : IState {
  public IState Update() {
    //オブジェクトを移動させる
    return new State3();
  }
}

class State3 : IState {
  public IState Update() {
    //オブジェクトが元のサイズに戻る
    return new State4();
  }
}

class State4 : IState {
  public IState Update() {
    //クリーンアップ
    return null;
  }
}

class test : MonoBehaviour {
  IState state = new State0();
  void Update() {
    if (state == null) return; //処理が終わった
    state = state.Update();
  }
}

switch を使った方法が悪いわけではなく、switch での処理に限界を感じるほどのボリュームになって来たとか、そうなりそうな場合に効果的な処理方法です。

5. 処理が終了したら自動的に破棄してくれる。
エフェクトの処理が終わったら、自分自身を破棄するようにします。
処理の途中で強制的に破棄する方法も用意します。

動作チェック用のスクリプト
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {

private Vector3 destination = new Vector3(5, 0, 0); //ワープ先の座標
private GameObject prefab;
private GameObject effect = null;
private GameObject capsule;

void Start() {
this.capsule = GameObject.Find("Capsule");
this.prefab = Resources.Load<GameObject>("Prefabs/WarpEffect");
}

void OnGUI() {
if (this.effect == null) {
if (this.capsule.transform.position == this.destination) {
if (GUI.Button(new Rect(0, 0, 200, 30), "Default Position")) {
//初期位置に戻す
this.capsule.transform.position = Vector3.zero;
}
} else {
if (GUI.Button(new Rect(0, 0, 100, 30), "Warp")) {
//エフェクト開始
GameObject g = (GameObject)UnityEngine.Object.Instantiate(this.prefab, Vector3.zero, Quaternion.identity);
WarpEffect e = g.GetComponent<WarpEffect>();
e.obj = this.capsule;
e.move = true;
e.move_to = this.destination;
e.wait = 1.5f;
this.effect = g;
}
}
} else {
if (GUI.Button(new Rect(0, 0, 100, 30), "Destroy")) {
//強制的にエフェクトを破棄する
this.effect.GetComponent<WarpEffect>().Destroy();
this.effect = null;
}
}
}
}

今回作ったプロジェクト一式
https://drive.google.com/file/d/0B5l1YkxnaVHoaW5zMWY3a1dCOG8/edit?usp=sharing
スポンサーサイト

- 0 Comments

Add your comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。