2014年4月23日水曜日

[Unity]子オブジェクトを取得する

Unityで現在のオブジェクトから子オブジェクトを取得したいときは
下記のようなコードになります。


1. GameObject child1 = gameObject.Find("Child").gameObject;

2. GameObject child2 = gameObject.GetChild(0).gameObject;


1番目は、Childという名前の子オブジェクトを取得しています。
2番目は、インデックスに基づいて子オブジェクトを取得しています。親オブジェクトのchildCountより小さい値を指定する必要があります。

2014年4月11日金曜日

[Unity]特定のオブジェクトだけ衝突判定を無視する方法


標題の方法ですが、四方を壁に囲まれた空間で特定のオブジェクトは一方向の壁には当たらずそのまますり抜けていきたいときにとった方法です。他のオブジェクトは跳ね返ります。

すり抜ける壁のレイヤーをBottomWallと名付けます。
すり抜けていくオブジェクトをEnemyと名付けます。
そして、ソースコードに

        int layer1 = LayerMask.NameToLayer("BottomWall");
        int layer2 = LayerMask.NameToLayer("Enemy"); 
        Physics2D.IgnoreLayerCollision(layer1, layer2);

を追加すれば、BottomWallとEnemyをレイヤーに設定したオブジェクトは衝突判定を無視します。
上記はPhysics2Dで行っているが、Physicsでも同様にできます。

Physicsには、IgnoreCollisionでCollider同士の衝突判定もあるのだが、2Dにはそれがないのが謎です。

[Unity]衝突判定無視して貫通弾を作る

アルカノイドタイプのブロック崩しのようなゲームやシューティングゲームで使用するような貫通する弾を作った際の設定です。

貫通弾のColliderのIsTriggerフラグをON(true)にして、

OnTriggerStay2D
OnTriggerEnter2D
OnTriggerExit2D

上記の関数のどれかで当たったオブジェクトをDestroyして消していけば貫通しているように見えるかも。

2014年4月10日木曜日

[Unity]コルーチンとyieldの処理

基本は、

Unityスクリプトリファレンス Coroutineの解説

Unityスクリプトリファレンス StartCoroutineの解説

で解説されている通りで、何フレーム、何秒か待って処理をしたり非同期に処理をしたい場合
に使用するものです。

public class CoroutineTest : MonoBehaviour
{
   void Start()
   {
      StartCoroutine(waitTime(1.0f));
      StartCoroutine(waitTime, 1.0f);
      StartCoroutine("waitTime", 1.0f);

      StartCoroutine(waitFrame());
      StartCoroutine(waitFrame);
      StartCoroutine("waitFrame");
   }

   IEnumerator waitTime(float time)
   {
      // time秒待ってからprintを実行する
      yield return new WaitForSeconds(time);
      print("waitTime = "+time+" second");
   }

   IEnumerator waitFrame()
   {
      // 1フレーム待ってからprintを実行する
      yield return null;
      print("waitFrame 1frame");
   }
}