ぱぴブログ

さんたろのブログ

ゲーム開発が好きな人のひとりごと

自作ゲーム制作 後日談(他)

はじめに

どうも。
沙耶の唄」と「さよならを教えて」で感動したさんたろーです。

12月はアドベントカレンダーという、情報界隈で記事を投稿しようぜイベントがあります。
私の所属するLOCAL学生部というコミュニティの12月7日の担当が私でして。
はい、今日です(記事書いてる日)

adventar.org

先日自作ゲーム「UNDERTANK」の記事を書いたばかりで、まとまった知見がない。

悩んだ末、ゲーム完成から2週間ほどで自分がしてきたことを、ポツポツと書いていきます。
内容は浅いです。JavaJavaScriptを同一視するくらいに浅い。

ゲームを投稿したはいいが

www.freem.ne.jp

事件はすぐに起きた

自作戦車ゲーム「UNDERTANK」をふりーむにアップロードしてからすぐ。
https://www.freem.ne.jp/win/game/21473 なんともうYouTubeにプレイ動画をあげてくれる人が(こちら↓)

www.youtube.com

どれどれ......。
そこにはミッションモードで、敵を全員倒していないまま次のステージに進んでいるシーンが......。

制作側からすれば、公開処刑ですよね笑
Unity上で動かしたときは、一度も被弾判定の重複なんてなかったのに...泣

さて、スクリプトを見てみるとなるほど。戦車の生存を確認をしていなかった。
実はレーザーなどは生存判定をしていたのだが(していないと被弾判定が40回くらいでる)、
弾も複数の被弾判定が同時に出るとは想像していなかった。

なので先に生存判定をしてから、処理することに(イメージのコード↓)

if(tank.GetIsAlive()){
  tank.SetIsAlive(false);
  //いろいろな処理
  Destroy();
}

さて、Unity上で動かして問題なし。
ビルドして確かめると...。
今度は弾に当たってもオブジェクトが消えない。

これはおかしな話である。
仮に、2回同時に呼ばれる被弾の処理を処理A,処理Bとする。
このとき最初に生存判定をしているため、処理Aか処理Bのどちらかは必ず if(tank.GetIsAlive())がtrueになる。
考えられるのは生存がtrueの処理が途中で中断されたとき。

if(tank.GetIsAlive()){
  tank.SetIsAlive(false);
  //いろいろな処理 ←ここでエラーとなり処理が中断
  Destroy();
}

こうなると戦車は破壊処理されていないのに、生存判定はfalseとなり永遠に消えない。

いやしかし、Unity上で実行してもなにもエラーが起きてないぞ

そこで、実行ファイル中におきたエラーをファイルに出力する処理を施し見てみる...
わーわーめっちゃエラー呼ばれている。
というわけで、例外処理を加えると、無事解決

しかし、ゲームの怖いところはバグは完全に消した、といえないところですね.....。

それにしても動画投稿してくれた人上手ですね

その他プレイしてくれた人からの感想

・プレイする戦車の種類が多いのはいいと思う(ありがとうございます)
・自分と敵の撃つ弾を見分けられない(色で区別がつくようにしました)
・全体的に移動速度が遅い(ちょうどいいかな、と思ってます。あまりに言われたら速くします)
・移動が→キーなのはやりづらい(WASDで移動できるのが伝わりにくいですね.....難しい)
・黒が強すぎる(鬼畜ゲーということで)
・レーザーが初見殺しすぎる(クソゲーということで...チュートリアル作る元気ないですごめんなさい)

想像以上にプレイしてくれてとっても嬉しいです^^ありがとうございます

先のバグと諸々の修正を加えたVer1.01をふりーむにアップしました

TwitterBotのあれから

以前作った「ポジティブな掛け声Bot」は絶賛稼働中

qiita.com

しばらく稼働しての感想
・一回cronを立ち上げればWSLを終了しても動く
・PCの電源を落とさなければ、スリープ解除したら動く
・自分が寝ている間はやはりBotも寝かせてあげたい(優しいこころ)
・フォローしている人が少ないからか、単語の偏りが激しい

まあ、おおむね良好ですね。
Python、つよい

読書の冬

先日誕生日プレゼントで友人から技術本をもらいました。
「オンラインゲームを支える技術」っていう本です。

Amazon CAPTCHA

この本、想像以上に面白いです。というか、とても面白い。
記事を書いてる今はまだ半分(300p)ほどですが、すでに大満足。

どういった方に、という紹介は苦手ですが、
オンラインゲームの制作に将来関わりたい、と感じている方は間違いなく読んで損はないと思います。

これを読めばオンラインゲームが作れる!!
というわけでなく、いざオンラインゲームを作ろう、となったときに思考の助けになる本かな、と
(後半は実装寄り、ぬかりない)

1ページ1ページ、文章や疑似コードが濃縮されてます。
沙耶の唄ほど無駄がなく、舐めるように読める良書。

ありがとう友人H。

根本的な勉強

数学

今年の残りは数学とアルゴリズムを学ぶぞー、と考えていました。
まず、大学の講義の予習を...。
ガウスの消去法。なるほど、理解した。
LU分解...。うーん難しい。

以下の講義資料などでまとめられています↓

https://www.cspp.cc.u-tokyo.ac.jp/hanawa/class/spc2019s/sp20190702.pdf

競プロ

競プロを真面目にやろう。まずは動的計画法だ。

qiita.com

Flog1,Flog2なんだ、簡単じゃないか。

しかし、すこし応用きいただけで解けなくなりました。

atcoder.jp

競プロの道も険しいです。
だめだ、300点問題も解けないなんて......。ひどく落胆。

でもDPの他にも逆元とかも学べたので悪くないです競プロ

エンジンに頼らないゲーム開発

やはりエンジンに頼らないゲーム開発は勉強になります。
DirectXOpenGLを使って、簡単なゲームを作ろうと考えました。

しかし、最近の記事はほとんどない。
いくつか見つけてコードを見てみると...HelloWorldに1000行いく勢い

tkengo.github.io

興味はあるが、明らかに敷居が高いです...... 必要な時間が大きすぎる気がして、足を入れるのをやめました

違う視点から学ぶことはいいことだ

しかし普段調べないようなレイヤーや分野を調べると、
全然違う掘り出し物が見つかったりします。

marupeke296.com

今回でいうなら特にDirectXOpenGLを用いたゲーム制作の調べものをしているときに、
ゲームに使えるデザインパターンや計算、その他さまざまな世界を見せてくれました。
記事の最後の更新が10年以上前などザラにありますが、私がみても大事だとわかるものが多いです。
なにより、ゲームと関連しているため学習意欲も増します。

ゲームエンジンの開発などは今は興味がないですが、
食わず嫌いせずに土台を固める勉強は並行してやっていきたいです。

これから

サーバーサイド楽しいから、サーバーサイドの勉強して就職もありだなー、と考えていた時期もあった。
実際賢い判断かもしれない。
しかし、私がWeb系などの会社に行ったとしたら、そこで満足できるのか怪しい。
私は利用者がエンターテインメントを楽しんでくれることを生きがいに生きていきたい。

そういうわけで、ゲーム制作に必要な知見を優先してためていく。
ゲーム業界は他の業界では通用しない専門的な知識も多いが、知ったこっちゃない。

まずはUnrealEngineとC++を学ぶために軽いゲームを。
そしてオンラインゲームを作りたい。
オンラインゲーム......壁は多そうだが、夢いっぱい