【作業記録】20190105~ unityで爆弾人つくる!!

「ゲームプログラマになる前に覚えておきたい技術」(通称:ひらしょー本)

の「爆弾人」を
unityで作ってる作業きろく!!!


20190111(作業時間:3.5h(9:40-13:10) + 1h(14:00-15:00))

起きたのがバリおそかったけど、今日もすぐやる。

アニメーションとかなしでとりあえず最低限必要なものはいれおえた?か?

爆弾を爆発できるようにした。爆発で、レンガ、敵、プレイヤーも死ぬようにした。

f:id:snoopopo:20190111150331g:plain


次回やること

爆弾の爆風をとりあえず時間経過とかなしで表示する。

残っててあとでちゃんと調べたいこと

Debug.Log()もリリース版には含まない方がいいようなので、 Debug#isDebugBuildの判定をいれたunilityクラスを作っておきたいが、どう実装するか。単純にutilityクラスつくればいいだけと思ったけどコンソールからのリンクがすべてutilityクラスに飛んでしまってデバッグログ出すの意味が微妙になりそうかも。

・pushするときに毎回パスワード聞かれてうざい。httpでやってるからっぽいけど、すぐわからなかったのでタスクに。


20190109 昼(作業時間:1.25h(11:40-12:55))

敵の配置と敵の移動。あたり判定もいれた。

f:id:snoopopo:20190109125845g:plain


次回やること

爆弾を設置できるようにする。爆弾が爆発するようにする。

残っててあとでちゃんと調べたいこと

Debug.Log()もリリース版には含まない方がいいようなので、 Debug#isDebugBuildの判定をいれたunilityクラスを作っておきたいが、どう実装するか。単純にutilityクラスつくればいいだけと思ったけどコンソールからのリンクがすべてutilityクラスに飛んでしまってデバッグログ出すの意味が微妙になりそうかも。

・pushするときに毎回パスワード聞かれてうざい。httpでやってるからっぽいけど、すぐわからなかったのでタスクに。


20190110(作業時間:2.75h(7:30-10:15))

今日も朝から作業です。

「作る」は楽しめるけど「学ぶ」は苦手なので、今の作業は「作る」をしてる感覚でできる作業なので楽しいです^^

爆弾をおけるようになった

f:id:snoopopo:20190110101941g:plain


次回やること

爆弾の爆風をとりあえず時間経過とかなしで表示する。

残っててあとでちゃんと調べたいこと

Debug.Log()もリリース版には含まない方がいいようなので、 Debug#isDebugBuildの判定をいれたunilityクラスを作っておきたいが、どう実装するか。単純にutilityクラスつくればいいだけと思ったけどコンソールからのリンクがすべてutilityクラスに飛んでしまってデバッグログ出すの意味が微妙になりそうかも。

・pushするときに毎回パスワード聞かれてうざい。httpでやってるからっぽいけど、すぐわからなかったのでタスクに。


20190109 昼(作業時間:1.25h(11:40-12:55))

敵の配置と敵の移動。あたり判定もいれた。

f:id:snoopopo:20190109125845g:plain


次回やること

爆弾を設置できるようにする。爆弾が爆発するようにする。

残っててあとでちゃんと調べたいこと

Debug.Log()もリリース版には含まない方がいいようなので、 Debug#isDebugBuildの判定をいれたunilityクラスを作っておきたいが、どう実装するか。単純にutilityクラスつくればいいだけと思ったけどコンソールからのリンクがすべてutilityクラスに飛んでしまってデバッグログ出すの意味が微妙になりそうかも。

・pushするときに毎回パスワード聞かれてうざい。httpでやってるからっぽいけど、すぐわからなかったのでタスクに。


20190109(作業時間:1.75h(8:15-10:00))

今日も朝おきて一番に作業開始だ~.

衝突応答(8.2章)

プレイヤーが壁にぶつかったときに移動しないようにした。

以前使ったことがある、Physics2D#Linecast()を使って、 移動するまえに移動予定の位置にコライダーを設定したオブジェクトがあるかどうかを調べて、 あるなら移動しない。ないなら移動する。という具合に。

int dx = 0;
        int dy = 0;

        Vector2 tPos = new Vector2(0, 0);

        if (Input.GetKey(KeyCode.UpArrow))
        {
            dy = 1;
            tPos = new Vector2(0, this.collider.size.y / 2);
        }
        else if (Input.GetKey(KeyCode.DownArrow))
        {
            dy = -1;
            tPos = new Vector2(0, -this.collider.size.y / 2);
        }
        else if (Input.GetKey(KeyCode.RightArrow))
        {
            dx = 1;
            tPos = new Vector2(this.collider.size.x / 2, 0);
        }
        else if (Input.GetKey(KeyCode.LeftArrow))
        {
            dx = -1;
            tPos = new Vector2(-this.collider.size.x / 2, 0);
        }

        dy *= PLAYER_SPEED;
        dx *= PLAYER_SPEED;

        if (!(dx == 0 && dy == 0))
        { //移動しようとしている

            //移動できるか判定
            this.collider.enabled = false;
            Vector2 targetPos = this.rigidbody.position + new Vector2(dx, dy);
            RaycastHit2D hit = Physics2D.Linecast(this.rigidbody.position + tPos, targetPos + tPos);
            this.collider.enabled = true;

            if (hit.transform == null)
            {
                //移動可能なので移動する
                //this.transform.localPosition += new Vector3(dx, dy);
                //this.rigidbody.position = this.transform.localPosition + new Vector3(dx, dy);
                this.rigidbody.MovePosition(targetPos);
            }
        }

ミソなのは、移動できるかの判定処理で、

RaycastHit2D hit = Physics2D.Linecast(this.rigidbody.position + tPos, targetPos + tPos);

+ tPos ってしているところがあるんだけど、 これをしないと、画像の原点が中心になっていて、画像の中心で判定してしまうことになり、うまくいかなった。

f:id:snoopopo:20190109095851g:plain

▲こんなかんじで、プレイヤー画像の中心まで壁にめりこんじゃった。。

なので、移動方向によって画像の中の判定したい位置をもとめるようにしたってこと。

f:id:snoopopo:20190109100006g:plain

▲改善できた版!


次回やること

次回は敵の配置やって敵も動くようにします。本的には、p226~

敵とプレイヤーの当たり判定処理がむずいかも。

残っててあとでちゃんと調べたいこと

Debug.Log()もリリース版には含まない方がいいようなので、 Debug#isDebugBuildの判定をいれたunilityクラスを作っておきたいが、どう実装するか。単純にutilityクラスつくればいいだけと思ったけどコンソールからのリンクがすべてutilityクラスに飛んでしまってデバッグログ出すの意味が微妙になりそうかも。

・pushするときに毎回パスワード聞かれてうざい。httpでやってるからっぽいけど、すぐわからなかったのでタスクに。


20190108(作業時間:1.25h(8:30-9:45) + 0.5h(16:00-16:30))

今日も朝おきて一番に作業開始.

動くオブジェクトを配置する(7.5章)

プレイヤーの配置(表示だけ)は昨日時点で終わっていたけど、

インスペクターでTransform#Positionを1動かすだけで、1マス分がっつり移動してしまう状態だった。

今日は1マスをTransform#Positionの100にするようにして、ちょっとずつ移動できるように、カメラサイズ等調整。 Transform#Positionでfloatの値でやってもよかったけど、整数の方がわかりやすいので。

これで、

1マス座標=ローカル座標(`Transform#Position`)の100

という風になった。

見た目上の変化はないが、ちょっとずつマス単位でなくちょっとずつプレイヤーを動かすことができそうな目途がたった。


次回やること

敵の配置

残っててあとでちゃんと調べたいこと

Debug.Log()もリリース版には含まない方がいいようなので、 Debug#isDebugBuildの判定をいれたunilityクラスを作っておきたいが、どう実装するか。単純にutilityクラスつくればいいだけと思ったけどコンソールからのリンクがすべてutilityクラスに飛んでしまってデバッグログ出すの意味が微妙になりそうかも。

・pushするときに毎回パスワード聞かれてうざい。httpでやってるからっぽいけど、すぐわからなかったのでタスクに。


20190107(作業時間 1.75h + 1h)

昨日は1hやってそのあともう1hはやりたかったけど、見事にねてた。

やっぱり朝イチでやらないと時間が確保できないな。

今日も昨日の続きから。p198あたり。

とりあえず背景だけ出してみる(7.4章)昨日の続き。

床、壁、レンガ(レンガ率はまだ固定)を描画した。

とりあえず、解像度対応とかすべてなし。画面サイズ固定で作る。

f:id:snoopopo:20190107081339p:plain

ひらしょー本だと、床、壁、レンガというフラグを作って、フラグを元に描画するかんじ。

それに対して、unity公式ローグライクは、床、壁、レンガ、という単純なプレハブを作ってそれを配置している感じ。

ひとまずは後者で実装するが、プレハブ作るまでもないならひとつのクラスにまとめて、前者に変更するかも。


プレイヤーとアイテム(壁の中にあるので見えないけど)も表示した。

f:id:snoopopo:20190107145441p:plain


次回やること

プレイヤーをマス単位じゃなく、ドット単位に動かせるようにする。p212~。

残っててあとでちゃんと調べたいこと

Debug.Log()もリリース版には含まない方がいいようなので、 Debug#isDebugBuildの判定をいれたunilityクラスを作っておきたいが、どう実装するか。単純にutilityクラスつくればいいだけと思ったけどコンソールからのリンクがすべてutilityクラスに飛んでしまってデバッグログ出すの意味が微妙になりそうかも。

20190106(作業時間 1h)

今日は、「ゲームプログラマになる前に覚えておきたい技術」の7章 の途中 p198~

なんだけど、完成版のゲームをまだ起動できる状態になってなかったので、その環境作りから。

完成版C++プロジェクトで起動

完成版のプロジェクト(C++で作られているもの)を動かせる状態にしておく。

古いバージョンしか対応していないので、自分の環境に入ってるVSで動かせるようにする。

いつも使ってる VS Com 2017 で動かしたいので、cmake でビルドをしなおす。

http://blog.techlab-xe.net/game-programmer-book-new-build

↑を見ればソッコーわかる!ありがたや~

cmake初めて使ったのでよくわからないけど、コンパイラのバージョン依存を解決してくれる?みたいなものっぽいととりあえず認識。

よくわかってないけど深堀しようとしすぎると、本当に進めないといけないところが進まなくなるのでとりあえずスルー。

とりあえず背景だけ出してみる(7.4)

そこで、、とりあえず手を出せるものから手を出すことにしよう。不確定な要素がたくさんあ るほど思考が迷いやすくなるし、見落としも起こりやすくなる。だから、すぐできることや、 どうせ必要になるとわかっている部分はさっさと片付けてしまおう。そうすれば不確定要素 が減り、同時に考えねばならないことも減ってくる。(p199)

タイトル、ゲームオーバー、ゲーム、エンディング はSceneにする。 準備、ポーズ、クリア、失敗、勝敗表示はゲームSceneの中で描画する。Canvasにするかもしんないけど保留。。


20190105(作業時間 1.5h)

今日は、「ゲームプログラマになる前に覚えておきたい技術」の7章最初~

文字の描画

TextMeshProのTextMeshProUGUI#SetText()を使う。

乱数

Randam#Range() を使う。

Random.Range(1, 100);

1~100まで ↑の例だと1~99の乱数を生成してくれる。引数の1も100も含まれるので注意。

https://docs.unity3d.com/ja/2018.3/ScriptReference/Random.Range.html

デバッグ用の機能について

デバッグ用の機能は、リリース時には含めたくないので、 BuildSettingsDevelopment Buildにチェックが入っているときのみ含めるようにしたいので、 Debug#isDebugBuild を使う。

unityエディタ上で起動した場合もDebug#isDebugBuildはtrueを返す。

ステージ数や何回死んだらゲームオーバーになるかは好き好きでいいが、テストをすることを考えると2以上にはしたい。プログラミングには0、1、たくさんという三つの数があって、2は「たくさん」の中の最小値だからである。1と2は根本的に違うものなので、1でしか出ないバグや2以上でしか出ないバグというのは頻繁に発生しうるが、2で動くならだいたいは3でも動くものだ。 (p216から引用)

シーケンス

タイトル、ゲームオーバー、ゲーム、エンディング はSceneにする。 準備、ポーズ、プレイ(ゲーム画面)、クリア、失敗、勝敗表示はゲームSceneの中で描画を分ける。

その他メモ

Debug.Log()もリリース版には含まない方がいいようなので、 Debug#isDebugBuildの判定をいれたunilityクラスを作っておきたいが、どう実装するか。単純にutilityクラスつくればいいだけと思ったけどコンソールからのリンクがすべてutilityクラスに飛んでしまってデバッグログ出すの意味が微妙になりそうかも。

・開始して1.5hで疲れたので今日はこれでおしまい