石像備忘録

モアイ像がいろんなメモを書き残す場

ゲーム会社を退職しました

お久しぶりです、しもむ~です。
2021年最初の記事かつ、2021年最後の記事です
タイトルにある通り、某ゲーム会社を退職しました
書類上の退職日は本日ですが
11月後半からずっと有給消化期間中でした

前職

前職には新卒で入社し、スマホゲーのサーバーサイドを主にやっていました
入社当初はC++でリアルタイムサーバを作っていましたが、最終的には

  • C++でリアルタイムサーバを書く
  • Ruby on RailsAPIサーバを書く
  • 上記のものをkubernetesに乗っけて色々する
  • 開発環境や本番環境の管理ツールに手を出す
  • 制作設定向けのUnityのエディタ拡張を書く

などの様々なことをやる機会に恵まれました
特に「同時接続数n万想定*1のサーバ構築」というのは貴重な経験になったと思います

また、プロジェクトに配属されたときはまだリリースされる前のものだったため、 リリース前の開発段階から、サービス開始後の運用、
サービスのクローズ作業まで見届けることになったのも、
売れなければ短命のスマホゲー界隈ならではの経験だったかもしれないです

クローズドβテストを巨大Enterキー(↓これ)を使ってこの手でオープンさせたのはいい思い出です
www.amazon.co.jp

しかし、会社の業績の影響による拠点売却等によって
会社の体制*2や開発への考え方が大きく変わり
それが自分に合わなく感じたのが辞めた原因の一つになります*3

転職活動

前述の通り、いろんなことに手を出していたので
所謂スキルシートみたいなものだけ見れば面白そうな人材に見えたのかもしれないですが

実際面接をすると、広く浅くやっていだけで深堀されると大した人間じゃないことがわかる みたいなパターンが多かった印象です

もともと自分のやってきたことや売りみたいなものを示すのが苦手なほうなのもあって
新卒の時の就活ほどではないものの苦戦しました

来年

次の会社はゲーム業界ではないので、これまでの経験が活かせる場面もあれば
違った考え方が必要になる場面が出てくるとは思いますが、臆せず頑張ろうと思います
ゲーム制作自体は、unity1weekのようなゲームジャム自体は好きなので
今後も時間があれば参加していこうと考えいます

それでは良いお年を

*1:あくまで"想定"です、想定数値で負荷試験も行いましたが
実際のユーザはそこまで集まらなかったです
実際に想定通りの同時接続数があればプロジェクトが閉じられることも
会社の業績が悪化して拠点売却されることも
最終的に私が辞めることもなかったかもしれないですね

*2:というより会社そのものが変わった

*3:余談ですが、このゴタゴタによってもはや某拠点で新規にゲーム開発することは難しいのではと思えるほど人材が流出しました

unity1week「DeepMining」制作ログ

2019/07/07~2019/07/07にunityroomで開催された1週間ゲームジャムに
参加しました。
お題は「集める」でした。

作ったもの

タイトルは「DeepMining」です。

潜水艦で深海に潜り、資源を集めるゲームです
完成したものはこちらで遊べます。
https://unityroom.com/games/deep_mining

ゲーム内容決め

実は今回制作したものに似たゲームを4年前のGlobal Game Jamで作っていました
当時作ったのは潜水艦で燃料を集めてロケットを打ち上げるとかそんな感じのものだったと思います
「集める」というお題に合致していたので、4年前から自分がどれだけ変わったのかが気になり、
リメイクしてみることにしました

モデル作成

f:id:simomuuu:20190709230531p:plainf:id:simomuuu:20190709230534p:plainf:id:simomuuu:20190709230538p:plain

潜水艦、鉱石、機雷をBlenderで雑に作成し、

f:id:simomuuu:20190709230541p:plain:w300

壁はSubdivideのFractalを適当に弄って作成しました

演出等

f:id:simomuuu:20190709230827p:plain:w600

深度が下がるごとに暗くするためにScene内のライトだけでなくambient lightも調整されるようになっています また、BloomはいつものPost Processing Stackでやってます

また、潜水艦のスポットライトはV-Light Volumetric Lightsを使用しています

https://assetstore.unity.com/packages/tools/particles-effects/v-light-volumetric-lights-2037

Volume Lightで有名なAssetはAuraがあり、最初はこれを試していましたがWebGL環境ではうまく動作しないっぽかったので見送りました

実装上の反省点

今回は深度ごとの資源数や機雷数、資源のサイズごとの獲得量、アイテムなどを
設定ファイルに書き出していました

f:id:simomuuu:20190709231203p:plain:w300

設定の増減を簡単にできる点は良かったのですが、
パーサを用意するのをめんどくさがってjsonを用いてしまったためとても弄りにくかったです
常日頃から言ってますが、jsonは人間が書くべきものではない

発生したトラブル等

トラブルというほどではないですが、

f:id:simomuuu:20190709231426p:plain:w600

WebGLビルド後にScene内のUGUIのTextの色が全部黒になってしまう現象が発生することが多々ありました
おそらくUnity 2019.1.3fのバグ…?
実際の*.unityに保存されている値は変わっていなかったのですが、
Sceneの再読込では解決しない時があり、結局Unity再起動させることで治りました
どうも2019はバグが多い気がします

次回

次回のunity1weekでは昔作った「肉アツステーキ」ぐらいの
勢いのあるものを作りたいと考えています
また、今までずっと一人で作ってきたので誰かと一緒に作ってみたいです

WindowsTerminalのPreview版でキーバインド等の設定を行う

お久しぶりです、しもむ~です。

f:id:simomuuu:20190624232301p:plain:w600

先日、Windown TerminalのPreview版がリリースされたようです

www.microsoft.com

動作要件はWindows Update 1903が入ってること?かと

早速インストールして使ってみましたが、使って30秒ほどで...

このような悲しい事になったので、Windows Terminal(Preview)のキーバインド等の設定方法をメモとして残しておきます

各種設定方法

各種ニュース記事にもあるようにGUIでのSetting(+ボタンの横->Setting)は2019/06/24 現在の時点では動かないため、
(jsonを開く既定のエディタが指定してあった場合、設定ファイルを直接開くようになってるようです)
設定ファイルを直接いじる必要があります

設定ファイルは
C:\Users\{UserName}\AppData\Local\Packages\Microsoft.WindowsTerminal_{hoge}\RoamingState\profiles.json
にあります

f:id:simomuuu:20190624232309p:plain:w600

keybindingsキーバインドの設定が書いてあるので、ctrl+wに該当する部分を削除するなり別のキーに割り当てるなりします

また、defaultProfileでWindowsTerminal起動時に開くターミナルをguidで指定できます
このguidはWindowsTerminalを起動したときに割り振られるようです

f:id:simomuuu:20190624232311p:plain:w600

他にも、profiles 以下にwsl、PowerShell、cmd等を起動した時のフォントサイズや背景色等 schemes に各カラースキーム等を設定することができるようですy

ただし、まだPreview版なだけあって動作が不安定な部分がありそうです

unity1week「10secSUSHI」制作ログ

お久しぶりです、しもむ~です。

2018-11-19~2018-11-24にunityroomで開催された1週間ゲームジャムに
参加しました。
お題は「10」でした。

作ったもの

タイトルは「10secSUSHI」です。

大量の寿司をサラリーマンに食らわせるゲームです
完成したものはこちらで遊べます。
https://unityroom.com/games/ten_sec_sushi

また、今回初の試みとしてAndroid版をGoogle Playにて公開しています
https://unityroom.com/games/ten_sec_sushi.google.com/store/search?q=10secSUSHI

ゲーム内容決め

「10」で最初に思いついたネタは

  • n進数の10(0b10、0x10等…)

でしたが、ゲームの形にするまで詰められなかったので断念

そこでふと
「10の文字列、横にしたら寿司に見えるのでは」

と思い

f:id:simomuuu:20181126222658g:plain:w300

こんなものを試作、これがそのままタイトル画面になりました

また、今ちょうどFactorioという生産ライン構築系のゲームをやっていて、
何か大量生産したい欲があったので、
「寿司をできる限り量産するゲーム」
という形になりました

モデル作成

f:id:simomuuu:20181126223011p:plain:w300

寿司の3DモデルをMagicaVoxelで制作
ボクセル作品は前々作以来ですね

f:id:simomuuu:20181126223229p:plain:w300

奥にいるサラリーマンですが、開発後半で作ったもので、
時間短縮のために前しか作ってないです

実装

今回の実装は全体的に凝ったことはしていないです。シンプルです

f:id:simomuuu:20181126223558p:plain:w300

当初は下の寿司の選択肢もゲーム毎にランダムに変わるようにしていましたが、
スコア差が出にくくなってしまいそうだったのと、
正直あまりいい難易度の上げ方とは思えなかったで公開直前で廃止しました
上のボクセルに本編では出てこないやつがあるのはその影響です

f:id:simomuuu:20181126223803g:plain:w300

また、ゲーム開始前に成功例2回、失敗例1回を見せるチュートリアルを導入しました
これはマリオパーティーのミニゲームでも開始前にこんな感じのチュートリアル
が入るゲームがあったと思うのでそれを参考にしました

発生したトラブル等

今回は今までと比べてトラブルが多めでした

f:id:simomuuu:20181126223943p:plain:w300

まずはこれです。
WebGL出力したらSpriteが描画されない現象が発生しました
Unity組み込みのデフォルトUIのSpriteは描画されたり、
SpriteをReimportし直したあとにビルドしたら表示されるようになったりと
よくわからん挙動でした

また、近いものにAndroid版をビルドしたときに
一部の音が鳴らなくなったりしたものあり、
こちらもReimport -> ビルドでとりあえず解決

どうもUnity2018.2.16にビルドインアセットの
構築周りでバグがあるんじゃないかと勝手に予想しているんですが、
謎です
Unityなんもわからん

あとはAndroid周りだと、ビルドしたアプリを起動したら
Made with Unityの画面でフリーズする現象もありました
これはUnity再起動してビルドしたら直りました、謎

11-25 09:07:51.871 12200 12265 E Unity   : Error: Cannot create FMOD::Sound instance for resource sharedassets1.resource, (Unsupported file or audio format. )  
11-25 09:07:51.871 12200 12265 E Unity   :  
11-25 09:07:51.871 12200 12265 E Unity   : (Filename:  Line: 877)  
11-25 09:07:51.871 12200 12265 E Unity   :  
11-25 09:07:51.871 12200 12265 E Unity   : Function SoundHandle::Instance::~Instance() may only be called from main thread!  
11-25 09:07:51.871 12200 12265 E Unity   :  
11-25 09:07:51.871 12200 12265 E Unity   : (Filename:  Line: 21)  
11-25 09:07:51.871 12200 12265 E Unity   :  

また、いわゆる「アプリが落ちる」現象も起こりました
自分が書いたプログラムが吐く例外等はUnityが勝手にキャッチされるはずで、
落ちることはあまりないはずなので:thinking_face:でしたが、
adb logcatでみると上のログで死んでることが判明
これは拡張子の違う音源ファイルを入れていた?あたりが原因だったかと

反省点

前作ほどゲームの勢いというか、
非現実性が少なかったため微妙な仕上がりな気がします
無難と言うか、ありがちなゲームというかそんな感じですね

また、知人にプレイしてもらったところ、最初の3回が自動チュートリアル
であることが認識されにくかったです。
マリパだと「プレイ可能前のチュートリアル」が理解できるのは
なぜなんだろうと思った次第です

いつのもの、参考にならないソースコードはこちらになります
(最初の5コミットぐらいまでは真面目に設計する気がありました)
https://bitbucket.org/simomu-/ten_sec__sushi

unity1week「肉アツステーキ」制作ログ

お久しぶりです、しもむ~です。

調べたら出てくることは記事にしなくていいかの考えでいたら
全く記事を書いてこなかったので、久しぶりの投稿なります。

2018-09-03~2018-09-09にunityroomで開催された1週間ゲームジャムに
参加しました。
お題は「あつい」でした。

前回の「ぎりぎり」には参加しなかったので約7ヶ月ぶりの参加になります。

作ったもの

タイトルは「肉アツステーキ」です。

f:id:simomuuu:20180911230710g:plain:w300

肉を分厚く切って、いい感じに焼き上げるゲームです。
完成したものはこちらで遊べます。
https://unityroom.com/games/nikuatu_steak

ゲーム内容決め

とりあえず「あつい」で思いつくのは

  • 厚い
  • 熱い

あたりだったので、両方を取り入れ
厚い→肉厚
熱い→ガスバーナー
で、ガスバーナーで厚い肉を焼くゲームに決定。

最後に参加した「あてる」の反省点から、ゲームのテンポを優先し
結果の勢いで楽しませにかかる方針に。

モデル作成

肉や皿のモデルをBlenderでサクッと制作
クオリティを高くせず、それっぽく見えればいい程度に

f:id:simomuuu:20180911224516j:plain:w300
f:id:simomuuu:20180911224523j:plain:w300

AssetStoreのモデルとかを入り交えて見た目のクオリティにばらつきが出るよりかは、
雑でも自作してクオリティを統一した方が、個人的にはいい感じに見える気がします。

実装

肉を切るフェーズでは、実際にその場でポリゴンを動的に切断しています。

f:id:simomuuu:20180911224816j:plain:w300

切断の実装はこちらを利用させていただきました
https://github.com/BLINDED-AM-ME/UnityAssets
ポリゴン切断処理は若干重いので、対象の肉のモデルはそこまでポリゴン数をもたせることはできなかったです。

f:id:simomuuu:20180911225141j:plain

\displaystyle f(x) = \frac{1}{\sqrt{1+x^{2}}}

焼く部分に関しては、
機械学習界隈ではおなじみのシグモイド関数を焼き加減の値に使用
シグモイド関数の真ん中を焼き加減ジャストに設定しいい感じに狙いづらくしています

f:id:simomuuu:20180911230349j:plain:w300

結果の画面で完成したステーキに名称が付きますが、
あれは厚さ、焼き加減に応じて予め用意したテキストを組み合わせているだけです。 (時間があれば設定ファイルか何かに書き出したかった)
時間とセンスがあればもう少しバリエーションを増やしたかったです。

ゲームサイクルは「切る」→「焼く」→「リザルト」で、
それぞれのステップの時間を調整し1週3秒ほどで終わるようにしています。

反省点

ゲーム内で得点に関して切説明されていないため、
厚く切ったほうが点数が高いことに気が付かなかった人が何人か見受けられました。
(タイトルの肉の厚さが常識的な厚さだったせいもありそう)

あとは切る部分が割と運要素高めっぽいので、もう少し実力に寄せれたらよかったかと。

一応、参考にならないソースコードはこちらになります
https://bitbucket.org/simomu-/nikuatu_steak

MeshLab2016.12をビルドした時のメモ

こんにちは、しもむ~です。

ある事情によりCentOS7にMeshLabをソースコードからビルドする必要があったので
その作業中に詰まったところ等のメモを書いておきます。

なお、今回ビルド時に発生したエラー等は
今後修正&改善されると思われるのであくまで参考までに

Meshlab

MeshLab

Meshlabは3Dデータの編集、変換が可能なフリーのソフトウェアです。
モデリングソフトではないので1からモデルを作成することは出来ませんが、
点群処理の機能も備えており、
点群に法線を付与、ダウンサンプリング、メッシュ化等を行うことが出来ます。

今回ビルドしたMeshLabのバージョンは2016.12です。

環境

今回の作業環境です。

  • CentOS 7.1

  • gcc4.8.5

  • qmake 3.0

  • Qt 5.3

特にQtのバージョンは5以上が必須です。
それ以前のQtではmeshlab内部で呼び出している関数の一部に互換性なく、
ビルドに失敗します。

ダウンロード

MeshLabのページからソースコードをダウンロードできます。

MeshLab

また、MeshLabをビルドするのに別途必要なプログラムを
以下のURLからダウンロードします。

github.com

また、後ほど説明しますがソースコードに内包している
特定のライブラリが原因でビルドが失敗する可能性があるので、
それの対策用に以下のURLからファイルをダウンロードしておきます。
http://mpir.org/mpir-2.4.0.tar.bz2

ビルド

ビルドする前に、先程ダウンロードしてきたファイルのうち、
meshlabとvcglib-1.0.1を解凍し、vcglib-1.0.1をリネームします。

tar xvzf meshlab-2016.12.tar.gz  
unzip vcglib-1.0.1.zip  
mv vcglib-1.0.1 vcglib  

以下のような配置になればOKです。

Downloads/  
    |  
    ├──meshlab-2016.12  
    │      ├──docs  
    │      ├──README.md  
    │      ├──src  
    │      ├──...  
    │      └──...  
    └──vcglib  
           ├──apps  
           ├──doc  
           ├──eigenlib  
           ├──...  
           └──...  

まずmeshlab-2016.12/src/external内のプログラムをビルドします 。

cd meshlab-2016.12/src/external  
qmake -r external.pro  
make 

次に一つ上の階層に戻り、
MeshLab本体をビルドします。

cd ../  
qmake -r meshlab_full.pro  
make  

//中略  

Cannot find file: .../Downloads/meshlab-2016.12/src/plugins_experimental/io_TXT/io_TXT.pro.  
make: *** [sub-plugins_experimental-io_TXT-make_first-ordered] エラー 2  

ここでこのようなエラーメッセージがでました。
.proの名前が想定されたものと微妙に違うようです。

mv plugins_experimental/io_TXT/io_txt.pro plugins_experimental/io_TXT/io_TXT.pro

リネームし再度make

make

//中略

g++ -Wl,-O1 -Wl,-z,relro -shared -o libfilter_csg.so filter_csg.o moc_filter_csg.o  -L../../distrib -lcommon -lGLU ../../external/lib/linux-g++/libmpirxx.a ../../external/lib/linux-g++/libmpir.a -lQt5OpenGL -lQt5Widgets -lQt5Gui -lQt5Xml -lQt5XmlPatterns -lQt5Network -lQt5Script -lQt5Core -lGL -lpthread
/usr/bin/ld: ../../external/lib/linux-g++/libmpir.a(lt4-clear.o): 認識できない再配置 (0x2a) がセクション `.text' にあります
/usr/bin/ld: 最終リンクに失敗しました: 不正な値です
collect2: エラー: ld はステータス 1 で終了しました
make[1]: *** [../../distrib/plugins/libfilter_csg.so] エラー 1

次にこのようなエラーが発生しました。
どうやらexternalビルド時に生成したlibmpirをリンクできないようです。
もしこのエラーが発生した場合、先程ダウンロードしておいた
mpir-2.4.0.tar.gz2が必要になるので、解凍しmakeします。

cd ../../
tar xf mpir-2.4.0.tar.gz2
cd mpir-2.4.0
./configure --enable-cxx --enable-static --with-pic  
make 

makeが上手く言った場合、生成されたライブラリファイルを   meshlab/externalの中の所定の場所にコピーします  

cp .libs/libmpir*.a ../meshlab-2016.12/src/external/lib/linux-g++/  
cd ../meshlab-2016.12/src/  

再度makeし、無事成功しました。
実行ファイルは  

./distrib/meshlab

にあります。

f:id:simomuuu:20171123155540p:plain:w500

Hello MeshLab
あとはpathを通すなり移動させるなりして完了です。  

※参考 github.com
github.com

unity1week「Sukimania」制作ログ

こんにちは、しもむ~です。

Unity 1週間ゲームジャム | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

2017-11-13 〜 2017-11-19にunityroomで開催された1週間ゲームジャムに参加しました
お題は「space」でした。

ゲーム内容決め

とりあえず「space」と聞いて「隙間」という単語を思い浮かべました
dic.nicovideo.jp で、エースコンバットというゲームには「スキマニア・クグロフ」と呼ばれる物があります。
所謂「任務そっちのけで高速で隙間をくぐり抜けることに快感を覚える人達」です。
今回はそういう快感に特化したゲームにしようと考えました。

実装開始

内容を早めに決めることが出来たので実装は早めに取り掛かることができました。

プレイヤー挙動

f:id:simomuuu:20171120145512p:plain:w300

プレイヤーはシンプルに立方体に少し手を加えたものにしました。
最初はただの立方体だったのですが、

  • 次の隙間が見辛い

  • 伸縮方向がわからない

の二つの問題点があったので半透明&伸縮方向のエッジのカラーを変更しました。

f:id:simomuuu:20171120145713g:plain:w300

回転と変形はそれぞれVector3.Lerpを使用し滑らかに変形します。
当たり判定のみ即時に回転、変形し、メッシュがそれに追従する形になります。

迫りくる隙間

f:id:simomuuu:20171120145527p:plain:w300

プレイヤーの挙動に合わせて2種類の隙間を用意し、生成時に角度を決定しています。
3DモデルはBlenderで作成しました。

f:id:simomuuu:20171120145530p:plain:w300

隙間は一部の色が通過時にシアン、失敗時にレッドに変わるようにしました。 通過時の低音はこの隙間を発生源にすることにより「通過した感」を出しています。

周辺パーティクル

前に進んでる感を出したかったのでまわりに適当な物を飛ばそうと考えました
通常のパーティクルでも良かったのですが、   今回はプレイヤーと同じ物体を飛ばしました。

f:id:simomuuu:20171120152135g:plain:w300

また、生成範囲はプレイヤーと被らないように
min半径以上max半径以下に生成します。

float angle = Random.Range(0.0f, 360.0f);
float radius = Random.Range(minRadius, maxRadius);
float x = Mathf.Cos(angle * Mathf.Deg2Rad) * radius;
float y = Mathf.Sin(angle * Mathf.Deg2Rad) * radius;
gameObject.transform.position = new Vector3(x, y, 22.0f);

このような実装にしました。

さらに、試遊時に知人から
「スピードアップ時の集中線的な何かが欲しい」
との要望から

f:id:simomuuu:20171120145532p:plain:w300

このようなパーティクルを用意し、平行投影に設定した別カメラからこのパーティクルを写すようにしました
※参考
akeyunitydev.hatenablog.jp

ImageEffect

https://www.assetstore.unity3d.com/jp/#!/content/83912
Post Processing Stackを使用しました。
使用したのは

  • Antialiasing

  • Motion Blur

  • Bloom

です。

ランキング、ツイート

blog.naichilab.com
ランキングはnaichiさんのunity-simple-rankingを使用
ツイートはこんな感じの実装をしました。

public static void Tweet(int score, int level) {
    string text = string.Format("{0}個の隙間をすり抜けました\n到達レベル:{1}\n#unity1week #unity3d #Sukimania\n", score, level);
    text += "https://unityroom.com/games/sukimania";
    string url = "http://twitter.com/intent/tweet?text=" + WWW.EscapeURL(text);
    if (Application.platform == RuntimePlatform.WebGLPlayer) {
        Application.ExternalEval("window.open(\"" + url + "\",\"_blank\")");
        return;
    }
    Application.OpenURL(url);
}

その他アクシデント

基本的にアクシデントなく開発は出来たのですが、締め切り2時間前に
CanvasのGraphicRaycasterを誤って削除し、それにしばらく気が付きませんでした。

f:id:simomuuu:20171120145534p:plain:w300

これはuGUIが動作する上で必要なコンポーネントなので、
Buttonが一切反応せずに焦りました。
(Unityのバグまで真面目に疑ってしまいました)

完成

タイトルはこの記事冒頭の「スキマニア・クグロフ」から取り
「Sukimania」にしました。

完成したものはこちらで遊べます。
https://unityroom.com/games/sukimaniaunityroom.com

なお、自分の記録は80ぐらいなのですが今記録を見たら100超えがいて驚いてます。