Unityを学ぼう【第5回】

前回を続きまして、
アイテムと衝突判定を作成します*1

スクリプト拡張

プレイヤー視点から拡張します
[PlayerController]に以下のコードを追加します

// PlayerController.cs
// [trigger]と接触開始時に呼ばれます
void OnTriggerEnter(Collider other)
{
    // オブジェクトのタグ判定:[PickUp]
    if(other.gameObject.tag == "PickUp")
    {
        // アクティブ状態設定:無効にします
        other.gameObject.SetActive(false);
    }
}

[Player]が[PickUp]タグに設定されたオブジェクトと衝突したら
[PickUp]オブジェクトを無効にします

 f:id:kou_yeung:20131023012531p:plain
 Tips: 上記アイコンを押すとリファレンスに遷移可能

タグ追加と設定

 1.[Inspector] -> [Tag] -> [Add Tag...]
  f:id:kou_yeung:20131023004856p:plain
 2.[Tags]を展開し、[Element] に [PickUp] を入力します
  f:id:kou_yeung:20131023005007p:plain 
 3.[Assets] -> [Prefabs] -> [PickUp] を選択
 4.[Inspector] -> [Tag] -> [PickUp]
  f:id:kou_yeung:20131023005317p:plain

プレハブから設定すると、
シーンに配置されたオブジェクトも同時に反映します

Trigger有効にする

 1.[Assets] -> [Prefabs] -> [PickUp] を選択
 2.[Inspector] -> [Box Collider] -> [IsTrigger]をチェック
  f:id:kou_yeung:20131023005919p:plain

設定完了したら実行します
アイテムがプレイヤーと接触したらアイテムが消えることを確認できます

静的オブジェクト・動的オブジェクト

Unityの衝突判定では2種類があります

  • 静的オブジェクト
    • ColliderあるがRigid Bodyなし
  • 動的オブジェクト
    • Collider・Rigid Body両方ある
静的オブジェクトはColliderにより衝突範囲を計算しキャッシュされます
変化が加えると再計算してキャッシュを更新します
Unityにとってこれは重い処理です
よく変化するものは動的オブジェクトを使用するのが推奨します

アイテムを動的オブジェクトに

 1.[Assets] -> [Prefabs] -> [PickUp] を選択
 2.[Inspector] -> [Add Component] -> [Physics] -> [Rigidbody]

このまま実行すると、アイテムが重力の影響で落下してしまうため
以下の設定を加えます

 1.[Assets] -> [Prefabs] -> [PickUp] を選択
 2.[Inspector] -> [Rigidbody] -> [Use Gravity] のチェックを外す
  f:id:kou_yeung:20131023011947p:plain

再び実行&テストします

次回予告:テキスト表示

*1:http://unity3d.com/learn/tutorials/projects/roll-a-ball/collecting-and-counting