Unityでリバーシを作る

Unityでリバーシを作る2(盤面作成前編)

reversi2

どうも、りくらぼです。

前回はリバーシに必要な素材を準備しました。

リバーシの作り方1
Unityでリバーシを作る1(素材準備編)どうも、りくらぼです。 Unityを使ってリバーシを作っていきましょう。 今回は素材準備編です。 なぜリバ...

今回からはリバーシのプログラムを順を追って作成していきます。

盤面作成編では盤面を表示するまでを解説します。

この記事は前編です。

一気に覚えることが増えますが頑張りましょう!

最初で最大の関門です!!

始めに、初めての人はここが一番ハードルが高いと思われます!!

覚えることがかなり多く、また全てを解説することはできませんので、わからない部分は自分で検索して調べながら進めていくことを推奨します。

また、Unityやプログラムを始めると、チュートリアルの後は自分で検索して進めていくことが前提になります。

検索して調べながらプログラムを書けるようになれないと自分のゲームは作れないので、その練習だと思って頂けると幸いです。

逆に、自分で調べてプログラムが書けるようになると大抵のプログラムは自分で作れるようになります!!

(注:ものによって難易度や必要な知識量にはかなり差があります。)

「Unityでリバーシを作る」ではこれができるようになることが目標です。

C#スクリプトを作成する

Unityではプログラミング言語のC#を使って開発していきます。

まずはC#スクリプトを作成しましょう。手順は以下の通りです。

手順
  1. Scriptsフォルダーを作成する
  2. Scriptsフォルダー内にC#スクリプトを作成する

Scriptsフォルダーを作成する

まずAssets内にフォルダーを作り、名前をScriptsに変更します。

create_prefab_forlder

フォルダーの作成方法については前回の記事で解説しています。

リバーシの作り方1
Unityでリバーシを作る1(素材準備編)どうも、りくらぼです。 Unityを使ってリバーシを作っていきましょう。 今回は素材準備編です。 なぜリバ...

C#スクリプトを作成する

次にScriptsフォルダー内を右クリックし、作成 -> C#スクリプトを選択します。

create_script

C#スクリプトが作成されるので、名前を「GameController」に変更します。

rename

このGameControllerには名前の通りゲームを制御するメイン部分のプログラムを書いていきます。

スクリプトをアタッチする

スクリプトはAssets内にあるだけでは動作しません。

ヒエラルキーのゲームオブジェクトに「アタッチ」することで初めて動作します。

手順
  1. 空のゲームオブジェクトを作成する
  2. GameControllerをアタッチする

空のゲームオブジェクトを作成する

まずはアタッチするゲームオブジェクトを作成します。

ヒエラルキー内を右クリック -> 空のオブジェクトを作成を選択します。

create_empty

GameObjectが作成されます。

このままでは分かりにくいので名前を変更しましょう。

GameObjectを右クリック -> 名前を変更を選択します。

rename_gameObject

名前を「GameManager」に変更しましょう。

game_manager

GameControllerをアタッチする

GameObjectに何かをアタッチするにはドラッグアンドドロップするだけです。

作成したGameControllerをGameManagerにアタッチしましょう。

attach_game_controller

アタッチするとインスペクターにGameControllerが追加されます。

attach_game_controller

これで、ゲームを開始した時にGameControllerが動作するようになります。

次はGameControllerの中身を書いていきましょう。

プログラムを書いてみよう

ここからプログラムを書いていきます。

最低限知っておきたいこと

それでは、プロジェクトビューのGameControllerをダブルクリックで開いてみてください。以下のようなコードが表示されます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // ここに書くと最初の1回だけ実行される
    }

    // Update is called once per frame
    void Update()
    {
        // ここに書くと毎フレームに1回実行される
    }
}

 

何だこれは!となるかもしれませんが、ここでは最低限必要なことだけ見ていきます。

まずは3つだけ紹介します。

  1. コメントの書き方
  2. void Start()
  3. void Update()
  4. 命令文の終わりには;(セミコロン)を入れる

1つ目、コメントの書き方です。

『 // ここに書くと最初の1回だけ表示される』

これがコメントです。 //と入力するとそれ以降はコメントになり、実行時には無視されます。プログラムを読みやすくするために書いていきましょう。

//を書くとコメントになる

2つ目、void Start()です。

これはStartメソッドといいます。この中に書いたプログラムは最初に1回だけ実行されます。

3つ目、void Update()です。

これはUpdateメソッドといいます。この中に書いたプログラムは毎フレームに一回実行されます。

4つ目、次の「変数を使ってみよう」で出てきますが、命令文の終わりには;を付けるルールがあります。忘れないように注意しましょう。

それ以外のものは一旦考えなくても大丈夫です。必要な時に随時調べていきましょう。

変数を使ってみよう

変数という単語を聞いたことがある人もいると思います。

プログラムでの変数とは、簡単に言うと値の入れ物のことです。

一番簡単な例を紹介します。

    void Start()
    {
        int number = 5; // 変数numberに5を代入(最後に;を付けること)
    }

この例ではnumberという変数を作って、その中に5を入れています。

書き方は以下のようになっています。

変数名 = 中身
int number = 5

最初に変数の「型」を指定します。ここでは「int」となっていますが、intは整数の型です。

つまり、変数numberには整数が入りますよと宣言しています。

なので「int number」と宣言したら、中身には整数しか入れることができません!

int apple = 250; int num = -1250; int banana = 12+5;

どれも整数です!12+5も17になるので整数です!

int bad = “ああああ”; int berry = 123.45; int orange = “123”;

どれも整数ではありませんね。”123”は数字ではなく文字の”123”なので整数ではありません。

変数の型はintの他にもたくさんあります。よく使う型をまとめて紹介します。

型名 中身
int 整数 123, 0, -123
float 小数点付 12.345, 1.00, -0.005
bool 真偽 true, false
string 文字列 ”abc”, “あああ”, “123”

そのほかGameObject型やButton型のような型もありますし、更に自分で型を作ることもできます。たくさんあるので必要な時に調べてみてください。

盤面を作る(前編)

それではリバーシに話を戻します。

盤面を作る流れは以下の通りです。

手順
  1. プログラムでprefabを読み込む
  2. 8×8マスにprefabを並べていく

雑ですが流れのイメージです↓

image

prefab(盤面の部品)をプログラムで組み立てて表示する流れです。

prefabをプログラムで読み込む

prefabをプログラムで読み込んでみましょう。

手順
  1. GameObject型の変数を宣言
  2. 宣言した変数にprefabを代入

前回の記事で作成したprefabはGameObjectなので、GameObject型の変数に代入することができます。

リバーシの作り方1
Unityでリバーシを作る1(素材準備編)どうも、りくらぼです。 Unityを使ってリバーシを作っていきましょう。 今回は素材準備編です。 なぜリバ...

まずは黒い駒用の変数を宣言しましょう。Startメソッドの上に書いてくださいね。

    //黒い駒
    GameObject blackObject;  //blackObjectという名前のGameObject型変数を宣言

    // Start is called before the first frame update
    void Start()
    {
        
    }

ここでは変数blackObjectの宣言だけをして、まだ中身を入れていません。

GameObject型の入れ物だけ作った状態です。

ここにprefabを入れられるようにします。

    //黒い駒
    [SerializeField]         //変数をインスペクターに表示
    GameObject blackObject;  //blackObjectという名前のGameObject型変数を宣言

[SerializeField]という文字を追加しました。

これを入れると、変数の中身をインスペクター上で編集できるようになります。

入力出来たらGameController.csを保存してUnityに戻ってみてください。

保存はCtrl + Sのショートカットが便利です!
backObject

GameManagerのインスペクターにBlackObjectの項目が追加されました!

それではBlackObjectに黒い駒のprefabを設定しましょう。

set_backObject

blackのprefabをドラッグ&ドロップするだけでOKです。

これで黒い駒のPrefabをプログラムに読み込むことができました。

練習として、emptyとwhiteのPrefabも同じように変数を宣言して読み込んでみましょう。

クリックで答えを表示

    //黒い駒
    [SerializeField]         //変数をインスペクターに表示
    GameObject blackObject;  //blackObjectという名前のGameObject型変数を宣言
    //白い駒
    [SerializeField]
    GameObject whiteObject;  //whiteObjectという名前のGameObject型変数を宣言
    //盤
    [SerializeField]
    GameObject emptyObject;  //emptyObjectという名前のGameObject型変数を宣言

また、インスペクターからそれぞれprefabを設定するのも忘れないでくださいね。

8×8マスの盤面を作る

prefabの読み込みができたのでprefabを8×8マスに並べるプログラムを作りましょう。

一度にたくさん新しいことが出てくるので難しいです!!

手順
  1. 2次元配列をつくる
  2. 表示先のGameObjectを読み込む
  3. 表示先のGameObjectにprefabを並べる
????????
難しそうな匂いがやばいですね!順番にみていきましょう!

2次元配列をつくる

2次元配列ってなんでしょうか。できるだけ簡単に解説していきます!!

まずは、この質問から考えてみましょう。

変数を1000個作りたい時どうしますか??

ここまでの知識であれば、1000回変数を宣言する必要がありますね。

・・・1000回変数を宣言しますか?

絶対やりたくないですよね。ここで便利なのが「配列」です。

配列は複数の値が入れられる変数

通常の変数では、入れられる値は1つです。

例えば、int型の変数numberを宣言します。

int number;

このようにnumberを宣言すると、numberに入る整数は1つだけですね。

では、配列を宣言するとどうなるのでしょうか。

    int[] numbers = new int[5]; // 長さ5のint型の配列numbersを宣言

このように書くと、numbersには5つの整数を入れることができます。

numbersには値を入れる場所が5個あり、表にすると次のようなイメージです。

numbers 0番目  1番目  2番目  3番目  4番目
値の例 100 453 -15 0 -1000

このような配列を1次元配列といいます。

番号は1ではなく0から始まることに注意してください!

では変数を1000個作りたい場合には、次のようになります。

    int[] numbers = new int[1000]; // 長さ1000のint型の配列numbersを宣言

1000個作るのは極端な例ですが、配列を使えばこれだけで1000個の値を変数として持つことができます。

かなりざっくりした説明なので詳しくは「C# 配列」などで検索すると詳しい説明がでてきます!

2次元配列は配列の配列

2次元配列とは、配列の配列です。

…といってもよくわからないと思いますので、まずは宣言の仕方からみていきましょう。

2次元配列の宣言は以下のようになります。

    int[,] numbers = new int[3,2]; // 長さが3×2の2次元配列numbersを宣言

このnumbersは値を入れる場所が6個あり、以下のようなイメージです。

0番目 1番目 2番目
0番目 100 53 40
1番目 40 200 80

長さが3の配列が2つあるという考え方です。

2次元配列は表のようなイメージになりますね。

例えば、numbers[0,0]の値は100、numbers[2,1]の値は80となります。

2次元配列は表のようなイメージになるということは、

リバーシの盤面を2次元配列に置き換えて考えることができます。

まずは長さが8の配列が8個ある2次元配列boardを宣言します。

    int[,] board = new int[8,8]; // 長さが8*8の2次元配列boardを宣言

この2次元配列で、

0を駒が置かれていないマス、1を黒い駒が置かれているマス、2を白い駒が置かれているマスとすると下のような表が作れます。

リバーシの初期配置ですね。

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 2 1 0 0 0
0 0 0 1 2 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

これをそのまま2次元配列boardに代入すれば変数でリバーシの盤面を再現できますね!!

長くなってしまったのでここまでを前編として、一旦区切らせていただきます。

続きの手順②と③は後編で解説します。

ここまでのまとめ

 

後編ではリバーシの盤面を2次元配列で表現し、Unityの画面に表示するところまでを解説していきます。

かなり詰め込んだ内容となってしまいましたが、大丈夫でしょうか。

この記事では以下の項目を解説しました。

  • C#スクリプトの作成、アタッチ方法
  •  まず最低限知っておきたいこと
    • コメントの書き方
    • Startメソッド、Updateメソッド
    • 命令文の終わりに;(セミコロン)をつける
  • 変数と変数の型、変数の宣言について
  • 配列と配列の宣言、二次元配列について

特に変数と配列の項目についてはかなり無理のある説明となってしまいました。説明不足な点もかなりあります。

特に配列は初心者の挫折ポイントでもあります。(もしかすると別の記事で詳しくまとめるかもしれません。)

せめて「何について調べればいいか」のヒントくらいでも得ることができていれば幸いです。

また、プログラムは説明されるよりも自分でいろいろやってみる方が圧倒的に身に付きますので、後編でコードを書いていくうちに理解できることも多いと思います。

ここまでお付き合い頂けた方、ありがとうございました!

Unityでリバーシを作る3(盤面作成後編)どうも、りくらぼです。 今回はUnityでリバーシを作るの3回目、盤面作成の後編です。 前編はこちら https://...
ABOUT ME
りくらぼ
ブログ歴2ヵ月です。「りくらぼ」では雑記のほか、趣味のUnity関連のなど書きたいことを書いていきます