enjoy learning

作ったゲームの作品やプログラミングをして思ったことを書くブログ

Unityでライフゲームを作った時の実装思考

こんにちは!岩崎です。

最近絵が好きな人が落書きをするように、ゲームを作りまくってます。 今回はライフゲームを作りました。その時考えたことなど書いていきたいと思います。

ライフゲームについてあまり知らない人はこのサイトの動画を見るといいと思います。

ライフゲームの世界 - 人工知能に関する断創録

さて、いきなりですが、実際にライフゲームをUnityで作る過程を動画にしました。ご覧あれ。

www.youtube.com

なんと20秒!

嘘です。実際はこのソースコードを書くのに2時間くらいかかりました。

ソースコードはコチラ github.com

みんながコピペだけでライフゲームを作れるように、ソースコードをオブジェクトに貼るだけでゲームができるような実装にしました。

なので、Unityにしては不自然なコードだと思うところもあると思います。そこはご了承ください。

それでは、僕が実装の時考えていたことです。

実装思考

ライフゲームの基本的な設計方針

  1. ゲームが始まったらセル(一つ一つのマス)を生成する。

  2. ゲームのアルゴリズムを担当する関数を書く

  3. アルゴリズムを描画を担当する関数を書く

  4. Update関数に2,3をうまく突っ込む

です。

実際に見ていくと 最初の変数宣言で

// セルのデータを二次元配列で持つ。0...死、1...生
int [,] board; 
// 描画に関する配列
Renderer[,] _renderer;

としてます。

まずセルの情報をint型の二次元配列で持ちます。

int型で0,1で情報を持った方がアルゴリズムなどの実装がしやすいため、個人的にオススメです。

次に、ゲームが始まった時にセルを生成する

//ゲームが始まる時に1回呼ばれるメソッド
void Start () {
    board = new int[N,N];
    _renderer = new Renderer[N, N];
    //初期化
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            // 最初はみんな死んだ状態
            board [i, j] = 0;
            // セルを生成
            GameObject obj = Instantiate (cell, new Vector3 (i, 0, j), Quaternion.identity) as GameObject;
            // 描画情報を取得    
            _renderer [i, j] = obj.gameObject.GetComponent<Renderer> ();
        }
    }
    // 省略
}

そして、Update()の中身で

アルゴリズム実行

②描画

の順に呼びます。

void Update () {
    if (game) {
        timer += Time.deltaTime; //タイマーを動かす
        if (timer > interval) {
            Action (); // アルゴリズム実行 board[]の更新
            timer = 0; //タイマーリセット
        }
    }else{
        //省略
    }
    Draw(); //board[]の内容を描画
}

Action() には、アルゴリズムの中身

Draw() には、board[,]の情報をセルの描画に反映させる命令を書きます。

重要なのは、アルゴリズムと描画を分けて実装することだと思います。

アルゴリズムと描画の実装を混ぜて書くと、

アルゴリズムだけを変えたい時、または描画のところだけを変えたい時に大変になります。

また、今回は一つのスクリプトにまとめて書いてますが、

いつもはアルゴリズム用のスクリプトとセルの描画用のスクリプトに分けて書きます。

これも、変更点や拡張がしたい時に実装しやすくするためです。

このような実装の背景にはMVCモデルがあります。

Model View Controller - Wikipedia

ソフトウェアを実装する時の有力なモデルの一つです。

今回の実装がこのMVCモデルに完全に当てはまっているかというと、微妙ですが

アルゴリズムと描画の実装を分けようとしてるのは、これに少し則って実装しようとしてるからです。

Action(),Draw()の中身...省略します。自分で書いた方が楽しいよ。

おわりに

僕はアルゴリズムがからんだゲームを作るのが好きです。

今まで作ったゲームの例で言うと、

オセロ、将棋、マインスイーパー、2048などなど

全て、マス目の上にルール(アルゴリズム)があって、成立つゲームです。

このようなアルゴリズムが強いゲームを作る時は、ある程度実装を工夫しないと、

プログラムを変更しようと思ったときに大変です。

その工夫が今回でいうとMVCモデルでした。

参考になれば幸いです。

Unityでスプラとうふ製作

こんにちは みんなUnityでスプラトゥーン作ってみたくない? 僕は作りたいです。なので挑戦しました。

目標は

・床に色を塗る。 ・ネットワーク通信を行い、対戦できるようにする。

特に、ネットワーク通信は初めてなので、ドキドキしますね。

余談ですけど、任天堂のスプラトゥーンは、発案当初はイカスミじゃなくて、豆腐を投げるゲームになる予定だったみたいですよ? なので僕が作るゲームも豆腐を投げったっていいよね? 社長が訊く『Splatoon(スプラトゥーン)』|Wii U|Nintendo

実はスプラトゥーンの豆腐で色を塗るというのは、以前やったことがあったので、今回はネットワーク通信の方を先に作りました。

ネットワーク通信にオススメのアセット

ネットワーク通信ってサーバー立てたり、IPアドレスとかやったり大変なんじゃ... 心配ご無用、初心者にも易しいすばらしい、サービスがあるのです。 その名もPhoton Photon Unity 3D Networking Framework SDKとゲームバックエンド | Photon: Multiplayer Made Simple

簡単すぎるやろ...「Unity Photon」と検索すると、わかりやすいサイトがたくさん出てくるので、サクサク実装できました。1時間ほどでネットワーク通信ができるようになった。

苦しみはこの後...

ネットワーク通信楽勝じゃん!と思ったのもつかの間 次に同期問題に突入、ここから長いデバッグロードに入る。

要するに、自分の画面から見えるオブジェクトの動きと、相手の画面から見えるオブジェクトの動きを同じにしないといけない。これが大変だった。頭も使うし、何回も失敗した。 回数にして65回 これが多いのか少ないのかわからないが、とにかく最低限やりたいことはできた。

それがこれ f:id:qmeta:20151114140400p:plain

いい感じ、頭の上のキューブは自分の色を表すとともに、色を塗れば塗るほど大きくなる仕様になっている。

まだまだ作りこみの余地があると思うので頑張っていきたい。

ゲームはコチラ スプラとうふ(通信対戦) | UnityGameUploader

f:id:qmeta:20151114142052p:plain

スマホゲームアプリ奮闘記 【0日目】

リリース宣言

こんにちは、Facebookでは宣言したのですが、2016年3月を目標にスマホゲームアプリをリリースします。

Androidメンターのあっすーくんと餃子食べながら「こんなゲームつくりたくね!?」と盛り上がり決定しました。

ゲームのコンセプトは決まっていて、「反応クリック型」そしてみんなに馴染みがある〇〇をテーマにしたゲームにしようかと。(まだ秘密)

製作過程で考えたこととか、チャレンジしたことはブログに書いていこうかと思います。

卒論などで忙しいとは思いますが、やると決めたらやりきりたいので頑張ります。

自分で作ったホッケーゲームに勝てない

←→ 左右移動
スペースキー:スーパーショット
Unity WebGL Player | マルチホッケー
↑ゲームリンク

気晴らしにUnityでホッケーゲーム作っていたのですが、なんと大変なことに・・・
相手の動きを自分がコーディングしたAIで動かしているのですが、なんと私一度も勝てたことがありません。
最強です。勝てた人はコメントしてください。www.youtube.com


(追記)ゲームバランス調整しました!多分人間でも勝てます そのうちレベル別とか作ります。

UnityでFPSっぽいオセロゲームを作ってみた

【ダイナミックオセロ】
操作方法
・「↑」or「w」 前へ進む
・「→」or「d」 右へ動く
・「←」or「a」 左へ動く
・「↓」or「s」 後ろへ下がる
・「マウス操作」 方向転換
・「左クリック」or「Enter」 銃を撃つ、オセロの石を打つ
・「スペースキー」 ジャンプ
・「shiftキー」ダッシュモード

【遊び方】
オセロの石を打ちたいところに銃を撃つ。以上

スマホではできません!PCのみです!
ブラウザはChromeがおすすめです(他のブラウザでもできますが)
あとマウス推奨です!
↓↓このリンク先に飛んでください。
Unity WebGL Player | ダイナミックオセロ
↑↑

【作ってみた感想】
今回「プログラミングをこれから学ぶ中高生に一回遊んでもらうゲーム」をコンセプトに制作しました。
このゲームを通じて「Unityってこんなこともできるんだ」「私もUnityでゲームを作ってみたい!」という気持ちになってくれたらいいなと思いながら制作しました。(面白いかどうかは・・・ry)
また今回共同開発ということで、Unityメンターのべーべさんと一緒に制作しました。デザイン面(和室の部屋、庭、スタートの画面等)はほぼ100%べーべさんに作ってもらいました。ありがとうございました!
そしてこのゲームを作るキッカケを作ってくれたLifeisTechに感謝したいです。おかげで楽しい経験をすることができました。
あとオセロのAIが今のところあんまり強くないので、今後もっと強くしていく予定です。