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]
ブロックに下からぶつかったの衝突判定
これは以前勉強した[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を表しています。
恐らく今回は下記赤枠の「衝突判定」を行っています。
壊れるブロック
衝突判定が上手く判定できた場合、ブロックが壊れます。 これはどのように実装しているのでしょうか?
GameObjectの作成
実は、壊れるアニメーションのブロックを同じ場所に生成をして表現をしています。 [c]
GameObject breakObj = (GameObject)Instantiate(brokenBlockSprite,transform.position,transform.rotation); breakObj = transform.lossyScale;
[/c]
ここでは、[Inspector]で指定されたGameObjectを生成しています。
【参考】 Object.Instantiate - Unity Manual
壊れるブロックのスクリプト
壊れるブロックは以下のように作成されています。
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ゲーム作り徹底ガイド スマートフォンでも遊べる本格ゲーム開発に挑戦 大野 功二 SBクリエイティブ 2014-10-29 売り上げランキング : 7172 Amazonで詳しく見る |