神経衰弱でカードをランダムに並べて表示できるようにします。前回の記事のカードをめくる処理の続きから始めます。
前回の記事
カードを並べる
カードの画像は前回の記事の引用元からダウンロードします。カードはc01~c13、d01~d13、h01~h13、s01~s13の合計52種類あり、手動で配置すると大変なのでスクリプトで配置します。
まずは52枚の画像をHierarchyビューにドラッグし、さらにHierarchyからProjectビューにドラッグすることでプレハブ化します。またカードの裏面となるz01も同じようにプレハブ化しておきます。
以下のスクリプトを作成してMain Cameraにアタッチします。
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CardManager : MonoBehaviour
{
public GameObject[] cards = new GameObject[52]; //カードの表52種類を格納する配列
public GameObject cardBack; //カードの裏を格納する変数
void Start()
{
System.Random random = new System.Random();
cards = cards.OrderBy(x => random.Next()).ToArray(); //配列をシャッフルする
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 13; j++)
{
GameObject cardPrefab = Instantiate(cards[i * 13 + j], new Vector2(j * 3, i * 4), Quaternion.identity); //カードの表の画像を4x13の形に等間隔で並べる
GameObject backPrefab = Instantiate(cardBack, cardPrefab.transform); //カードの裏面を表面の子オブジェクトとして生成する
cardPrefab.AddComponent<BoxCollider>(); //カードの表にはBoxColliderをアタッチする
backPrefab.transform.localPosition = Vector2.zero; //カードの裏のローカル座標を(0, 0)に設定する
backPrefab.GetComponent<SpriteRenderer>().sortingOrder = 1; //カードの裏のOrder in Layerを1に設定する
}
}
}
}
Main CameraにアタッチしたらInspectorビューで、cardsのElement0~Element51にc01~c13、d01~d13、h01~h13、s01~s13のプレハブをドラッグします。またCard Backにはz01のプレハブをドラッグします。
これで実行すれば52枚のカードが縦4枚、横13枚の長方形の形に等間隔で並びます。
後は52枚のカードが画面にすべて収まるようにMain Cameraの位置を調整します。参考までに、InspectorビューでMain CameraのPositionをX=17.5、Y=6、Z=-10、Sizeを9にすると下の図のように綺麗に収まります。
カードをクリックするとカードがめくれるのでランダムに配置されていることがわかります。
参考