宝石の描画


パーティクルを3Dスプライトの代わりに使用する

マップに大量の宝石を描画するとき、その一つ一つをGemaObjectにし
てMeshを描画してはパフォーマンスが低下してしまいます。マップに配置
される宝石は非常に小さいオブジェクトですのでスプライトで描画したい
ところです。しかし、Unity 3.4では3Dスプライトを表示する便利な機能
はありません。そこで、パーティクルを3Dスプライトの変わりに利用してみ
ます。

パーティクルエミッタを追加する


空のGameObjectを作ってEllipsoid Particle Emmiterコンポネントを追加してください。Particle Rendererも同時に追加されます。Particle Rendererのマテリアルに宝石のテクスチャのマテリアルを設定します。これでパーティクルが宝石として表示されるようになります。

Velocityを0にしてパーティクルを静止させる
マップに置かれている宝石を表示するので動いてもらっては困りますので、エミッタのVelocityはすべて0にして完全に静止したパーティクルにします。

Emitのチェックボックスははずしてください。パーティクルの発生はスクリプトで制御します。

スクリプト(C#)

パーティクルをエミット
パーティクルエミッタから必要な個数のパーティクルをEmitして発生させましょう。

particleEmitter.Emit(宝石の個数);

パーティクルに位置を設定
パーティクルエミッタからパーティクルの配列をとってきます。このパーティクルのポジションを宝石を配置したい場所に設定してやればいいわけです。

Particle[] particles= particleEmitter.particles;
  ……
// すべてのパーティクルに対して位置、サイズを設定する
particles[idx].position = new Vector3(X,Y,Z); // パーティクルの位置.
particles[idx].size = パーティクルのサイズ;
  ……中略……
particleEmitter..particles = particles;

ここで気をつけることはパーティクルエミッタのパーティクル配列の要素を直接書き換えてはいけないということです。たとえばemitter.particle[3].position = XXXXのように使用してはだめです。Unityはemitter.particlesにパーティクルの配列を代入することで初めて更新されるようです。

拾った宝石を消すには
宝石を拾ったらその宝石を消さなくてはなりません。しかし、パーティクルの数を変更したりするのは少々手間です。そこで、パーティクルのサイズを0にして見えなくしてしまいましょう。

Particle[] particles= particleEmitter.particles;
particles[拾った宝石のidx].size = 0;
particleEmitter..particles = particles;