ゲーム会社を退職しました
お久しぶりです、しもむ~です。
2021年最初の記事かつ、2021年最後の記事です
タイトルにある通り、某ゲーム会社を退職しました
書類上の退職日は本日ですが
11月後半からずっと有給消化期間中でした
前職
前職には新卒で入社し、スマホゲーのサーバーサイドを主にやっていました
入社当初はC++でリアルタイムサーバを作っていましたが、最終的には
- C++でリアルタイムサーバを書く
- Ruby on RailsでAPIサーバを書く
- 上記のものをkubernetesに乗っけて色々する
- 開発環境や本番環境の管理ツールに手を出す
- 制作設定向けのUnityのエディタ拡張を書く
などの様々なことをやる機会に恵まれました
特に「同時接続数n万想定*1のサーバ構築」というのは貴重な経験になったと思います
また、プロジェクトに配属されたときはまだリリースされる前のものだったため、
リリース前の開発段階から、サービス開始後の運用、
サービスのクローズ作業まで見届けることになったのも、
売れなければ短命のスマホゲー界隈ならではの経験だったかもしれないです
クローズドβテストを巨大Enterキー(↓これ)を使ってこの手でオープンさせたのはいい思い出です
www.amazon.co.jp
しかし、会社の業績の影響による拠点売却等によって
会社の体制*2や開発への考え方が大きく変わり
それが自分に合わなく感じたのが辞めた原因の一つになります*3
転職活動
c++製のgame server触ったり、
— しもむ~ (@simomutter) 2021年6月2日
ruby製のapi server触ったり
それをk8s上に乗せてゴニョったりしてました
雇ってください
前述の通り、いろんなことに手を出していたので
所謂スキルシートみたいなものだけ見れば面白そうな人材に見えたのかもしれないですが
実際面接をすると、広く浅くやっていだけで深堀されると大した人間じゃないことがわかる みたいなパターンが多かった印象です
もともと自分のやってきたことや売りみたいなものを示すのが苦手なほうなのもあって
新卒の時の就活ほどではないものの苦戦しました
来年
次の会社はゲーム業界ではないので、これまでの経験が活かせる場面もあれば
違った考え方が必要になる場面が出てくるとは思いますが、臆せず頑張ろうと思います
ゲーム制作自体は、unity1weekのようなゲームジャム自体は好きなので
今後も時間があれば参加していこうと考えいます
それでは良いお年を
unity1week「DeepMining」制作ログ
2019/07/07~2019/07/07にunityroomで開催された1週間ゲームジャムに
参加しました。
お題は「集める」でした。
作ったもの
タイトルは「DeepMining」です。
潜水艦を操縦し、海底に眠る資源を集めるゲームを作成しました
— しもむ〜 (@simomutter) 2019年7月7日
集めた資源を使って潜水艦を強化し、さらなる深海へと向かいましょう!https://t.co/YRd08Ch97a#unity1week #DeepMining pic.twitter.com/hGjbRLgcMj
潜水艦で深海に潜り、資源を集めるゲームです
完成したものはこちらで遊べます。
https://unityroom.com/games/deep_mining
ゲーム内容決め
実は今回制作したものに似たゲームを4年前のGlobal Game Jamで作っていました
当時作ったのは潜水艦で燃料を集めてロケットを打ち上げるとかそんな感じのものだったと思います
「集める」というお題に合致していたので、4年前から自分がどれだけ変わったのかが気になり、
リメイクしてみることにしました
モデル作成
潜水艦、鉱石、機雷をBlenderで雑に作成し、
壁はSubdivideのFractalを適当に弄って作成しました
演出等
深度が下がるごとに暗くするために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環境ではうまく動作しないっぽかったので見送りました
実装上の反省点
今回は深度ごとの資源数や機雷数、資源のサイズごとの獲得量、アイテムなどを
設定ファイルに書き出していました
設定の増減を簡単にできる点は良かったのですが、
パーサを用意するのをめんどくさがってjsonを用いてしまったためとても弄りにくかったです
常日頃から言ってますが、jsonは人間が書くべきものではない
発生したトラブル等
トラブルというほどではないですが、
WebGLビルド後にScene内のUGUIのTextの色が全部黒になってしまう現象が発生することが多々ありました
おそらくUnity 2019.1.3fのバグ…?
実際の*.unityに保存されている値は変わっていなかったのですが、
Sceneの再読込では解決しない時があり、結局Unity再起動させることで治りました
どうも2019はバグが多い気がします
次回
次回のunity1weekでは昔作った「肉アツステーキ」ぐらいの
勢いのあるものを作りたいと考えています
また、今までずっと一人で作ってきたので誰かと一緒に作ってみたいです
WindowsTerminalのPreview版でキーバインド等の設定を行う
お久しぶりです、しもむ~です。
先日、Windown TerminalのPreview版がリリースされたようです
動作要件はWindows Update 1903が入ってること?かと
早速インストールして使ってみましたが、使って30秒ほどで...
WindowsTerminalのPreview版入れてみたけど、vim触る時にctrl+wでターミナルのタブ閉じてしまってそっかぁって感じ
— しもむ〜 (@simomutter) 2019年6月24日
このような悲しい事になったので、Windows Terminal(Preview)のキーバインド等の設定方法をメモとして残しておきます
各種設定方法
各種ニュース記事にもあるようにGUIでのSetting(+ボタンの横->Setting)は2019/06/24 現在の時点では動かないため、
(jsonを開く既定のエディタが指定してあった場合、設定ファイルを直接開くようになってるようです)
設定ファイルを直接いじる必要があります
設定ファイルは
C:\Users\{UserName}\AppData\Local\Packages\Microsoft.WindowsTerminal_{hoge}\RoamingState\profiles.json
にあります
keybindings
にキーバインドの設定が書いてあるので、ctrl+wに該当する部分を削除するなり別のキーに割り当てるなりします
また、defaultProfile
でWindowsTerminal起動時に開くターミナルをguidで指定できます
このguidはWindowsTerminalを起動したときに割り振られるようです
他にも、profiles
以下にwsl、PowerShell、cmd等を起動した時のフォントサイズや背景色等
schemes
に各カラースキーム等を設定することができるようですy
ただし、まだPreview版なだけあって動作が不安定な部分がありそうです
unity1week「10secSUSHI」制作ログ
お久しぶりです、しもむ~です。
2018-11-19~2018-11-24にunityroomで開催された1週間ゲームジャムに
参加しました。
お題は「10」でした。
作ったもの
タイトルは「10secSUSHI」です。
「10」という文字を横にしたら寿司に見えたので作りました
— しもむ〜 (@simomutter) 2018年11月25日
10秒以内により多くの寿司を食らわせるゲーム
「10secSUSHI」を公開しました、https://t.co/p39J3v6Gil
また、今回はAndroid版をGooglePlayにて同時公開していますhttps://t.co/2Lnao59i6l#unity1week #10secSUSHI pic.twitter.com/RjchMQSS1r
大量の寿司をサラリーマンに食らわせるゲームです
完成したものはこちらで遊べます。
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の文字列、横にしたら寿司に見えるのでは」
と思い
こんなものを試作、これがそのままタイトル画面になりました
また、今ちょうどFactorioという生産ライン構築系のゲームをやっていて、
何か大量生産したい欲があったので、
「寿司をできる限り量産するゲーム」
という形になりました
モデル作成
寿司の3DモデルをMagicaVoxelで制作
ボクセル作品は前々作以来ですね
奥にいるサラリーマンですが、開発後半で作ったもので、
時間短縮のために前しか作ってないです
実装
今回の実装は全体的に凝ったことはしていないです。シンプルです
当初は下の寿司の選択肢もゲーム毎にランダムに変わるようにしていましたが、
スコア差が出にくくなってしまいそうだったのと、
正直あまりいい難易度の上げ方とは思えなかったで公開直前で廃止しました
上のボクセルに本編では出てこないやつがあるのはその影響です
また、ゲーム開始前に成功例2回、失敗例1回を見せるチュートリアルを導入しました
これはマリオパーティーのミニゲームでも開始前にこんな感じのチュートリアル
が入るゲームがあったと思うのでそれを参考にしました
発生したトラブル等
今回は今までと比べてトラブルが多めでした
まずはこれです。
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ヶ月ぶりの参加になります。
作ったもの
タイトルは「肉アツステーキ」です。
肉を分厚く切って、いい感じに焼き上げるゲームです。
完成したものはこちらで遊べます。
https://unityroom.com/games/nikuatu_steak
ゲーム内容決め
とりあえず「あつい」で思いつくのは
- 厚い
- 熱い
あたりだったので、両方を取り入れ
厚い→肉厚
熱い→ガスバーナー
で、ガスバーナーで厚い肉を焼くゲームに決定。
最後に参加した「あてる」の反省点から、ゲームのテンポを優先し
結果の勢いで楽しませにかかる方針に。
モデル作成
肉や皿のモデルをBlenderでサクッと制作
クオリティを高くせず、それっぽく見えればいい程度に
AssetStoreのモデルとかを入り交えて見た目のクオリティにばらつきが出るよりかは、
雑でも自作してクオリティを統一した方が、個人的にはいい感じに見える気がします。
実装
肉を切るフェーズでは、実際にその場でポリゴンを動的に切断しています。
切断の実装はこちらを利用させていただきました
https://github.com/BLINDED-AM-ME/UnityAssets
ポリゴン切断処理は若干重いので、対象の肉のモデルはそこまでポリゴン数をもたせることはできなかったです。
焼く部分に関しては、
機械学習界隈ではおなじみのシグモイド関数を焼き加減の値に使用
シグモイド関数の真ん中を焼き加減ジャストに設定しいい感じに狙いづらくしています
結果の画面で完成したステーキに名称が付きますが、
あれは厚さ、焼き加減に応じて予め用意したテキストを組み合わせているだけです。
(時間があれば設定ファイルか何かに書き出したかった)
時間とセンスがあればもう少しバリエーションを増やしたかったです。
ゲームサイクルは「切る」→「焼く」→「リザルト」で、
それぞれのステップの時間を調整し1週3秒ほどで終わるようにしています。
反省点
ゲーム内で得点に関して切説明されていないため、
厚く切ったほうが点数が高いことに気が付かなかった人が何人か見受けられました。
(タイトルの肉の厚さが常識的な厚さだったせいもありそう)
あとは切る部分が割と運要素高めっぽいので、もう少し実力に寄せれたらよかったかと。
一応、参考にならないソースコードはこちらになります
https://bitbucket.org/simomu-/nikuatu_steak
MeshLab2016.12をビルドした時のメモ
こんにちは、しもむ~です。
ある事情によりCentOS7に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をビルドするのに別途必要なプログラムを
以下のURLからダウンロードします。
また、後ほど説明しますがソースコードに内包している
特定のライブラリが原因でビルドが失敗する可能性があるので、
それの対策用に以下の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
にあります。
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
で、エースコンバットというゲームには「スキマニア・クグロフ」と呼ばれる物があります。
所謂「任務そっちのけで高速で隙間をくぐり抜けることに快感を覚える人達」です。
今回はそういう快感に特化したゲームにしようと考えました。
実装開始
内容を早めに決めることが出来たので実装は早めに取り掛かることができました。
プレイヤー挙動
プレイヤーはシンプルに立方体に少し手を加えたものにしました。
最初はただの立方体だったのですが、
次の隙間が見辛い
伸縮方向がわからない
の二つの問題点があったので半透明&伸縮方向のエッジのカラーを変更しました。
回転と変形はそれぞれVector3.Lerp
を使用し滑らかに変形します。
当たり判定のみ即時に回転、変形し、メッシュがそれに追従する形になります。
迫りくる隙間
プレイヤーの挙動に合わせて2種類の隙間を用意し、生成時に角度を決定しています。
3DモデルはBlenderで作成しました。
隙間は一部の色が通過時にシアン、失敗時にレッドに変わるようにしました。 通過時の低音はこの隙間を発生源にすることにより「通過した感」を出しています。
周辺パーティクル
前に進んでる感を出したかったのでまわりに適当な物を飛ばそうと考えました
通常のパーティクルでも良かったのですが、
今回はプレイヤーと同じ物体を飛ばしました。
また、生成範囲はプレイヤーと被らないように
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);
このような実装にしました。
さらに、試遊時に知人から
「スピードアップ時の集中線的な何かが欲しい」
との要望から
このようなパーティクルを用意し、平行投影に設定した別カメラからこのパーティクルを写すようにしました
※参考
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を誤って削除し、それにしばらく気が付きませんでした。
これはuGUIが動作する上で必要なコンポーネントなので、
Buttonが一切反応せずに焦りました。
(Unityのバグまで真面目に疑ってしまいました)
完成
タイトルはこの記事冒頭の「スキマニア・クグロフ」から取り
「Sukimania」にしました。
完成したものはこちらで遊べます。
https://unityroom.com/games/sukimaniaunityroom.com
なお、自分の記録は80ぐらいなのですが今記録を見たら100超えがいて驚いてます。