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

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

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


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

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

効果音を鳴らす

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

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


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

2014-10-3-fdsas


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

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);


transform.lossyScale

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

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


壊れるブロック

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

GameObjectの作成

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

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


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

【参考】
Object.Instantiate – Unity Manual

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

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

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

配列

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

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


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

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

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


//ソート(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)));
			
	}

	
}


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

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

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で詳しく見る

Related Posts Plugin for WordPress, Blogger...