BoardGameのチュートリアルを参考に、プレイヤーのチャとシロが、只見町の各名所を巡るボードゲームの制作に挑戦した時のまとめ。
今回のゲームで参考にしたチュートリアルはこちら
Unity 2D Tutorial How To Create Simple Board Game With Dice Rolling And Turn Based Movement Features
サイコロをクリックするだけで遊べる、簡単な2人対戦のすごろくゲームです。
Order in Layerを何故5にしている理由が分からず、最初はUser Layerが5のUIのレイヤーに合わせているのかと思ったけど、レイヤー自体はどのスプライトもDefaultレイヤーのままなので0。同じDefaultレイヤー上での順番ということであれば、5でなくても0より大きい値であればいい気がするのですが、今後の展開が不明なので、チュートリアルに沿って5に設定。
自分メモ
Unity Manual>Tags and Layers Version: 2021.1
Sprite Renderer – Unity マニュアル
>Order In Layer:Sorting Layer 内のスプライトのレンダリング優先順位を設定します。 小さな数のスプライトが最初にレンダリングされ、大きな数のスプライトがそれらの上にレンダリングされます。
【Unity】レイヤーを意識して画像の重ね合わせをマスターしようぞ │ エクスプラボ (ekulabo.com)
>スプライトを表示する順番を制御するためにSorting Layerを使います。
>スプライトを表示する場合はソーティングレイヤー内で順番を決めることも可能です。例えばキャラクターレイヤーの中で、主人公の画像を画面手前に表示したい場合は「Order In Layer」という設定項目を使って手前、奥を設定できます。
次に、サイコロを回してプレイヤが進む数(面)を表示させるDiceスクリプトを追加します。
Resourcesフォルダの中身。
説明の表現は的確ではない部分はあると思いますが、頑張りました。
public class Dice : MonoBehaviour
{
private Sprite[] diceSides;
//サイコロ面のスプライトの配列(Resourcesフォルダから生成)
private SpriteRenderer rend;
//diceSidesのスプライトを参照するRenderer
private int whosTurn = 1;
//変数が1の時はプレイヤー1が、-1の時はプレイヤー2が動く番
private bool coroutineAllowed = true;
//相手のサイコロが動いているときは、次のプレイヤがサイコロを振れないようにする仕組み 初期値はtrue
private void Start()
{
rend = GetComponent<SpriteRenderer>();
diceSides = Resources.LoadAll<Sprite>("DiceSides/");
rend.sprite = diceSides[5];
}
//SpriteRendererコンポーネントを取得して変数に入れる
//ResouecesのDiceSidesサブフォルダからサイコロの面をロードして配列に
//サイコロの6の目が出るように設定
private void OnMouseDown() //コライダを付けたサイコロをクリックしたときの動作
{
if (!GameControl.gameOver && coroutineAllowed)
StartCoroutine("RollTheDice");
}
//(GameControlはプレイヤの動きを制御する別のスクリプト)
//ゲームが継続中の間は、GameControlスクリプトが状況を見ていて、
//coroutineが呼ばれると、"RollTheDice"Coroutineがスタートする
private IEnumerator RollTheDice()
{
coroutineAllowed = false;
int randomDiceSide = 0;
for (int i = 0; i <= 20; i++)
//coroutine内では、まずcoroutineAllowedをfalseにして、
//サイコロの面がランダムに変わる処理を20回繰り返す
{
randomDiceSide = Random.Range(0, 6);
rend.sprite = diceSides[randomDiceSide];
yield return new WaitForSeconds(0.05f);
}
//数字は0から5の中からランダムに生成される
//0.05秒間の間処理を中断。0.05秒間隔でサイコロのsprite画像が変更される
//ループが終わると、0から5のランダムの値が、GameControlスクリプトに送られる
GameControl.diceSideThrown = randomDiceSide + 1;
//コンピュータの世界のルールは0スタートなので、サイコロの目に合わすために1を足す必要がある
//プレイヤが移動する番では、GameControlスクリプトのMovePlayerメソッドが関わってきて、
if (whosTurn == 1)
{
GameControl.MovePlayer(1); //プレイヤ1の場合、パラメータは1
} else if (whosTurn == -1)
{
GameControl.MovePlayer(2); //プレイヤが2の場合は、パラメータは2
}
whosTurn *= -1;
coroutineAllowed = true;
//片方が終わったら-1をかけて順番を変える。1が-1、-1が1に
//一連の処理が終わったらcoroutineを再びAllowedにしてサイコロをクリックで振れるようにする
}
}
自分メモ
Sprite Renderer コンポーネント:スプライト をレンダリングし、シーンでどのように表示するかを制御
Spriteプロパティ:どのスプライトテクスチャをレンダリングするかを定義
Sprite Renderer – Unity マニュアル
Resources.LoadAll;Resources フォルダ内にあるフォルダ・ファイルのパスを設定し、すべてを読み込む。
Resources-LoadAll – Unity スクリプトリファレンス (unity3d.com)
コルーチン – Unity マニュアル (unity3d.com)
MonoBehaviour-StartCoroutine – Unity スクリプトリファレンス (unity3d.com)
UnityEngine.WaitForSeconds – Unity スクリプトリファレンス (unity3d.com)
自分メモ
Unityで画像(スプライト)をSpriteRendererにアクセスして変更する方法
uGUIのImageとSprite Rendererの使い分け
スクリプトからアセットを読み込む
>UnityのAssetsフォルダ内に登録済みのアセットを読み込むには、Resourcesクラスを利用します。
>Resources以降のパスを指定します。
【Unity】コルーチンってなんなのなの? って時に読む記事【解説】
>マルチスレッドの場合はマルチコアCPUの場合に別のCPUを使って並列処理をさせることができますが、コルーチンはあくまでシングルスレッド内で動いている処理。処理のタイミングを変えているだけなんです。
>戻り値がIEnumeratorのメソッドを用意し、それを任意の場所からStartCoroutine(<コルーチンの名前>)で呼ぶ、という流れ。
Unityにおけるコルーチンの性質まとめ
>IEnumeratorはコルーチンのインターフェースという意味です
>yield return null はココで処理を中断するということです
【C#/Unity】コルーチン(Coroutine)とは何なのか
yield
Unity C#で一定時間処理を待機させる方法/yield return new WaitForSecondsの使い方
Kotlin Coroutine 入門1: 起動と suspend