オリジナルポストカードは”こちら”で好評発売中!

Unity2D / 只見周遊すごろく制作2(サイコロ)

BoardGameのチュートリアルを参考に、プレイヤーのチャとシロが、只見町の各名所を巡るボードゲームの制作に挑戦した時のまとめ。

今回のゲームで参考にしたチュートリアルはこちら
Unity 2D Tutorial How To Create Simple Board Game With Dice Rolling And Turn Based Movement Features

 チャとシロの只見周遊すごろくの概要

サイコロをクリックするだけで遊べる、簡単な2人対戦のすごろくゲームです。

2Dゲームで遊んでいる時の様子

チャの勝ちです
シロの勝ちです

 サイコロをシーンに投入

6の目のサイコロのスプライトをシーンにドラッグ&ドロップ

Order in Layerを5に変更し、サイズと位置を調整

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」という設定項目を使って手前、奥を設定できます。

 サイコロをクリックに反応するオブジェクトにする準備

サイコロのInspectorにBox Collider 2Dを追加

次に、サイコロを回してプレイヤが進む数(面)を表示させるスクリプトを追加します。

 サイコロのスクリプトの中身


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

 サイコロにスクリプトをアタッチ

DiceスクリプトをHierarchy上のDiceにドラッグ&ドロップ


コメントを残す

メールアドレスが公開されることはありません。