【Unity 2D】2Dユニティちゃんのデモゲームを勉強する-壊れるブロック編

Unity界隈では話題の「ユニティちゃん」に手を出してみました。

今回からは[2Dユニティちゃん]に付属しているデモゲームのスクリプトなどを勉強していきたいと思います。 まずは、「壊れるブロック」編です。

【過去回】 【Unity 2D】2Dユニティちゃんのスクリプトを勉強する-その1 | albatrus.com 【Unity 2D】2Dユニティちゃんのスクリプトを勉強する-その2 | albatrus.com 【Unity 2D】2Dユニティちゃんのスクリプトを勉強する-その3 | albatrus.com

効果音を鳴らす

効果音に関しては、以下のコードを利用しています。 [c] //音楽ファイル public AudioClip brakeSound;

//再生 AudioSourceController.instance.PlayOneShot(brakeSound);

[/c]

ブロックに下からぶつかったの衝突判定

2014-10-3-fdsas

これは以前勉強した[Physics2D.OverlapArea]を利用しています。 判定するエリアはブロックの下側です。 [c]

Vector2 pos = transform.position; Vector2 groundCheck = new Vector2(pos.x,pos.y - transform.lossyScale.y); Vector2 groundArea = new Vector2(_b_collider.size.x * transform.lossyScale.y * 0.45f,0.05f);

var col2D = Physics2D.OverlapArea(groundCheck + groundArea,groundCheck - groundArea,pleyLayer);

[/c]

transform.lossyScale

私が初めて見るのが[transform.lossyScale]です。 これはGameObjectのScaleを表しています。

恐らく今回は下記赤枠の「衝突判定」を行っています。

2013-10-3-ff

壊れるブロック

衝突判定が上手く判定できた場合、ブロックが壊れます。 これはどのように実装しているのでしょうか?

GameObjectの作成

実は、壊れるアニメーションのブロックを同じ場所に生成をして表現をしています。 [c]

GameObject breakObj = (GameObject)Instantiate(brokenBlockSprite,transform.position,transform.rotation); breakObj = transform.lossyScale;

[/c]

ここでは、[Inspector]で指定されたGameObjectを生成しています。

2014-10-3-fdsas

【参考】 Object.Instantiate - Unity Manual

壊れるブロックのスクリプト

壊れるブロックは以下のように作成されています。

2014-10-3-fdsas

4つのパーツを組み合わせてブロックを作成しています。 後は、このパーツを壊れたように表現するのですが、このスクリプトがとても難しいです。

配列

通常の配列ではなく、RigidBodyなどのコンポーネントの配列。 [c]

//配列 private Rigidbody2D childRigidbodys; private Transform childTranforms;

[/c]

子オブジェクトのコンポーネントを取り出す

「コルーチン」でも登場した、IEnumerableを利用しています。 正直このIEnumerable、良くわかりません。 ただ、どのような処理ができているのかはわかりました。 [c]

//配列に子オブジェクトのRigidbody2Dを格納します。 childRigids = GetComponentsInChildren();

//ソート(localPosition.yが大きい順に並び変えている IEnumerable<IGrouping<float,Rigidbody2D>>groupBy = childRigids.GroupBy(r => r.transform.localPosition.y);

//配列から子オブジェクトを取り出す。 foreach(IGrouping<float,Rigidbody2D> grouping in groupBy){

//IGroupingからRigidBody2Dを取り出す
foreach(var r in grouping){

       //取り出した子オブジェクトにそれぞれ一定の力を加えている r.AddForce(new Vector2(Mathf.Sign(r.transform.localPosition.x) * breakPower.x, breakPower.y + (100 * grouping.Key)));

}

} [/c]

特にわかりにくいのは以下の部分です [c] IEnumerable<IGrouping<float,Rigidbody2D>>groupBy = childRigids.GroupBy(r => r.transform.localPosition.y);

//「IGrouping<TKey, TElement>」 // GroupBy : ソート // r:配列の中身(RigidBody2D) [/c]

IGroupingは以下のようになっています。

  • TKey (float) : keyの値の型、この例では[r.transform.localPosition.y]がKeyになっている
  • TElement (Rigidbody2D) : 配列の型

【参考】 Unity(C#) 便利なEnumerable -ワンダープラネット 第6回 LINQ基礎編 - @IT

最後に

今回はブロックの処理だけですが、なんとなく頭で理解でしました。 知らないと使えないが、非常に便利な方法を知ることができたので良かったです。

Unityではじめる2Dゲーム作り徹底ガイド スマートフォンでも遊べる本格ゲーム開発に挑戦Unityではじめる2Dゲーム作り徹底ガイド スマートフォンでも遊べる本格ゲーム開発に挑戦
大野 功二

SBクリエイティブ 2014-10-29
売り上げランキング : 7172

Amazonで詳しく見る