Google

2012年8月7日火曜日

Unityでコインゲー開発話:ソース解説2

昨日に引き続き、管理側のクラスの詳細解説をします。
管理側のソースはアイテム側よりやや大きめです。

using System.Collections;
public class InstanceManager : MonoBehaviour {
 public ManagedItemBase m_prefab;
 public int m_instance_count;
 private ArrayList m_item_list;
 private bool[] m_is_rental;
 private Vector3 m_standby_pos = new Vector3(0, 2, 0);
 public void rental(){
  int index = getStokIndex();
  if (-1 != index){
   GameObject obj = m_item_list[index] as GameObject;
   obj.transform.position = m_standby_pos;
   obj.rigidbody.velocity = Vector3.zero;
   obj.rigidbody.angularVelocity = Vector3.zero;
   obj.active = true;
  }
 }
 public void giveBack(ManagedItemBase item){
  m_is_rental[item.m_id] = false;
  item.gameObject.active = false;
 }
 private int getStokIndex(){
  for (int i = 0; i < m_instance_count; i ++){
   if (!m_is_rental[i]){
    m_is_rental[i] = true;
    return i;
   }
  }
  return -1;
 }
 void Start () {
  m_item_list = new ArrayList();
  m_is_rental = new bool[m_instance_count];
  Quaternion qua = new Quaternion();
  for (int i = 0; i < m_instance_count; i ++){
   GameObject obj = 
    Instantiate(
     m_prefab.gameObject,
     m_standby_pos,
     qua)
      as GameObject;
   ManagedItemBase item =
    obj.GetComponent();
   item.m_id = i;
   obj.active = false;
   m_item_list.Add(obj);
   m_is_rental[i] = false;
  }
 }
 void OnGUI () {
  if (GUI.Button(new Rect(0, 0, 100, 50), "Rental")){
   rental();
  }
 }
}

m_prefabaには事前に作成したシリンダーにManagedItemBaseを紐付け、プレハブ化したものを関連付けしておきます。
publicのm_instance_countは、実行時に作るプールの数です。
インスペクタでメモリの余裕具合に併せて数を指定しましょう。
m_item_listにはインスタンス実体が格納されます。
m_is_rental配列は、プールの貸し出し状態を真偽で記憶させて置く場所です。
m_standby_posは実体が待機する場所です。

まずはStart()でやってること。
インスタンスプールを作るため、プレハブを元にm_instance_count個分インスタンス化し、ArrayListにどんどんいれていきます。
貸し出し状態の判定配列もm_instance_count個分作成します。
生成アイテムには連番を付け、死んだ際の身元判明を明確にしておきます。
ここで重要なのがactiveフラグの値を偽にしていること。
これはGameObjectとMonBehaviourを不活性にし、シーン上の負荷等をほぼ0にしてくれます。
無効なものはactiveを偽にしておくことで軽減しているわけです。

次にOnGUI()。
これは押されたらレンタル関数を呼ぶだけなので省略。

続いてrental()。
ここで貸し出しを行います。
貸し出し配列から開いてる場所を探し、見つかったら該当するGameObjectをアクティブにします。
ここでアイテムは有効になり、指定された位置から落ちてくる訳です。
velocityとangularVelocityをゼロにしているのは、死んだ際のリジッドボディの加速情報等をそのまま記憶してしまっているのをリセットする目的があります。

次は逆のgiveBack()。
これは昨日のManagedItemBaseの位置が一定以上になった際、彼らから呼ばれます。
実戦では身元が正しいかどうかチェックすべきでしょう。
ここでactiveを偽にしているので、また次に呼ばれるまで眠りに落ちる訳です。

最後、getStokIndex()。
これは簡単で、貸し出し状態の配列を検索して開いてる場所を返すだけですね。

急ぎ足でしたが、こんなところです。
実際はこれらを拡張し、アイテム種別毎にInstanecManagerを造り、シンプルな構造を重ねあわせて使っていく形になっています。

次回からはまたコイン開発話に戻ります。

0 件のコメント:

コメントを投稿