【雑記】デジゲー博2018で遊んだゲームの感想

 

デジゲー博

デジゲー博 | 同人&インディーゲームオンリー展示・即売会

 

とても素晴らしいイベントで、2016年から毎年サークル参加をさせていただいてます。

 

主催の江崎さんのインタビュー記事はこちら

www.gamecast-blog.com

 

国内のイベントで一番好きです。

 

今年は2スペースでサークル参加をさせていただいたのですがその話は置いておき、時間を無理やり空けて試遊しに行ったゲーム(少ない)の感想を書いておこうかなと思います。

 

東方3Dダンジョン - Rabbit Tail Works

www.rabbittailworks.com

 

東方Projectの二次創作ゲームで、ゲームエンジンを使わないフルスクラッチの3Dアクションゲーム。

随所に時のオカリナリスペクトの演出や機能があり、試遊しててフフッとなる箇所が多くて楽しい。

 

主人公は幻想郷に迷い込んだ一般人で、霊夢魔理沙の助けを借りながら幻想郷から脱出する・・・というストーリー。

試遊版はチルノに会う直前くらいまで遊べるようになっていた。

 

足場に乗ってジャンプすると足場に置いていかれず、ちゃんと自分が足場に沿って移動していたりしていてちゃんと作り込んでる・・・ってなった。

あと、看板が切れる。最高。

 

完成品の頒布もあるみたい、今回買えなかったのでどこかで見かけたら手に入れたい。

 

音ハメ(仮) - OY旅団

音ハメ (仮) | OY旅団

 

リズムに乗りながら攻撃、ジャンプ、特殊技、前進、後退のコマンドを入力し、お互いに攻撃を当てあう音楽対戦ゲーム。

 

暗殺者っぽい男、可愛い女の子、マヨネーズの擬人化の3キャラクターが選択できたので、可愛い女の子を使おうとしてマヨネーズの擬人化を"間違えて"選んでしまった。

間違えちゃったから仕方ないな、うん。

 

マヨネーズの擬人化は特殊技が使えないらしいと説明を受けたときに、人は深く考えずに破滅する生き物だと思った。

 

「後退して相手の攻撃を避けた後、前進して攻撃」などの動きのパターンを覚えつつ、相手のやりそうな行動を予測して行動を組み立てるのがとても面白かった。

 

開発者の人と対戦したところ、1ポイント差で負けてしまったけど、ポイントがどう計算されているのかちょっと分からなかった悲しい。

 

リンクからダウンロードできるので対戦してみよう。

 

地獄調査官 樹神妖子 (コダマヨーコ) - NOMANA INTERACTIVE

YOKO : Inquisitor of Hell(地獄調査官 樹神妖子) by NOMANA INTERACTIVE

 

東京ゲームショウ2018でも出展されていた色塗り陣取りツインスティックシューター。

 

敵の攻撃や移動で徐々に地面に色が塗られ、その上にプレイヤーが乗ってしまうと呪いゲージが上がってしまい、呪いゲージが最大になるとゲームオーバーになるとか。

プレイヤーが弾を撃つと着弾地点の周囲が自分の色になり、呪いゲージも徐々に減少する?(うろ覚え)らしいので立ち回りが大事っぽい。

 

ランダム生成されるダンジョンを探索するタイプのゲーム進行のようなので、乗ってくるゲームの要素によってはディアブロばりの廃ゲーに変貌しそうでワクワクする。

 

ゲーム性が新しくてとってもよいので完成が楽しみ。

 

Link: The Unleashed Nexus Restructured Haven(Link:RH) - Reminisce

りんく じ あんりーしゅど ねくさす りすとらくちゅあーど へいぶん

www.reminiscedev.com

 

知り合いのSigさんが開発しているゲーム、Link:RHの最新版を展示するということで壊しに遊びに行った。

 

ゲームスタートしたら新しいカットシーンが再生されて、新演出でお出迎えされた。

キャラクターのモデル、モーション、カットシーン、エフェクトが過去バージョンより洗練された印象になっていて、オヒトリデツクラレタンデスカ、ホントウニ?ワーオって感じ。

 

一番気持ちよかったのが、敵を踏みつけたときに次の敵(次の目的地)に自動でカメラが向くので、迷わずにサクサク進められたこと。

前は道に迷っちゃったことが何回かあったけど、あまり考えずに気持ちよくクリアまで進められた。

 

プレイヤーの周りに展開してるエフェクトに空を飛ぶためのスラスターゲージの残量が表示されるようになっていたり、細かな演出への気配りがすごい。

 

SigさんはたまにFaye/Sleepwalker(今僕がサークルで作っているゲーム)にスコスコにされるって言ってくるんですが、毎回僕もスコスコにされている。

早く新トレイラーとか作って反撃したい。

 

遊んでないけど気になったゲーム

今回は本当に少数しかできなかったけど、見て回ったときに面白そうだなと思ったゲームを2つ、備忘録代わりに書いておく。

 

Monaka's Sugar High Nightmare - nokturnal studioz

Monaka's Sugar High Nightmare by はちのす(Kei Kono)

 

SOULLOGUE、BATTLLOONなどのゲームに携わっているはちのすさんが、ツイッターで「なんかゲーム作りたい」から始まったらしいプロジェクト

既に完成しているのでは?三ヶ月くらい?で作ったらしい。

ゾンビの女の子が噛み付くのがフェチズムを感じるのでよい。

 

CisLugI(シスラギ) - NextVillage

nextvillage.sakura.ne.jp

 

テレビCM流してたのここだった気がする、間違いかな。

綺麗な画面だったので非常にきになる。実はフルスクラッチらしい?

 

最後に

他にも面白そうなゲームたくさんあった。

「デモリッションロボッツ K・K」とか、「RYSTEL」とか名前覚えてないコンボゲーっぽい2Dアクションとか。

宝箱か?また来年、僕は新作を引っさげて行く(強気)

 

デジゲー博はいいぞ。

 

【備忘録】Faye/Sleepwalkerの開発環境とサークルの運営について

最近ブログ書いてなかったので、サークルで開発する際に必要だった諸々の備忘録を書きます。

未来の自分と、もしかしたら誰かの参考になるかも。

 

開発環境・クライアント

ゲームエンジン

Unity 5.6 -> Unity 2017.1.1 -> Unity 2017.4.8f1

2017へ移行した理由として、Timeline機能とPostProcessingStackが使用できるのが割と決め手になりました。

LTS版のUnity 2017.4.x系から動かす気はもうありません。

Version Control System(VCS)

git + git LFS

3Dゲームは大容量のバイナリファイルを扱うので、LFSはほぼ必須です。

特にバイナリファイルのgitのログは容量を無尽蔵に食い尽くしていきます。

 

クライアントはbashを使っていたり、SourceTreeを使っていたり、人によってまちまちです。

僕はbashを使ってCUIでぽちぽちしています。

AdobeXD,Photoshop,Illustlator

UIアーティストの方が使用しています。AdobeXDは優れたプロトタイピングツールなので便利です。

特に説明は不要

開発環境・サービス

github

有料アカウント + LFS用データパックで月1700円ほど

プライベートリポジトリで開発をしています。

Trello

タスク管理はこちらで、TodoボードとStoryボードの二種類を作成し

Todoボードにタスクをストック、毎月行うタスクをStoryボードで管理しています。

・Storyボード

f:id:yutakaseda3216:20181019124341p:plain

・ToDoボード

f:id:yutakaseda3216:20181019124336p:plain

基本スクラムの手法に則り、長いですが一ヶ月でスプリントを回しています。

Slack

サークル内でのコミュニケーションや開発進捗確認を行うためのチャットツールとして。

githubと連携し、pushされた際の通知を受け取っています。また、Googleカレンダーでの期日通知もついでにやってます。

基本的にチャンネルは全てprivateにして招待するチャンネルを選別することで、外注の方をSlackに招待した際にも困らないようにしています。

Google Drive,Google Calender,Google Groups,Gmail

Google系サービス色々

Google Driveにてデータ共有

Google Calenderで各自のスケジュールとサークル全体のスケジュール管理

Google Groupsでサークルメンバーのアカウントを一括管理

Gmailは言わずもがな。

特にGoogle Groupsでのメンバーアカウントの管理は、カレンダーの共有や全体スケジュールの管理で便利ですのでオススメします。

開発サイクル

月に1回の定例会議を行なっています。

毎月の共有事項話し合いやゲームプレイ、改善案出し合いからイベント参加そのほか議論タスク管理など、月の始めに行っています。

2週間に1回の時期もありましたが、共有事項が少なくタスクの進捗もそれほどないため、会議がダレ気味になってしまい今のペースになりました。

現在はよく回っています。

 

また、イベント参加後には必ずKPT形式での反省会を行なっています。

これはポストイット

Keep(継続していくべきよかったこと)

Problem(改善するべき問題)

Try(問題を踏まえ改善していく方法)

を壁に貼って出し合い、問題を明確にし解決していく手法です。これを導入することで全員の当事者感 <- これ大事 が生まれました。とても良いです。

金銭管理

金銭で揉めたくなかったので、責任者を僕以外にし、全てその人の管轄で行なってもらっています。

僕以外に責任を持ってもらった理由は「権力の分散」です。一人が権力を持ちすぎていいことは一つもありません。

毎月の支出、収入をスプレッドシートでまとめてもらい定例会議で共有してもらっています。

また、アセット購入などは全員で議論した上で、その人に承認してもらい初めて購入することができるようにしました。

タスク配分について

基本的に機能ごとに担当者を決め、敵なら**さん、UIなら**さん、という形で意図的に属人化させています。

サークルでの作業は全て本業の傍らになりますので、モチベーションを持ってもらう必要があります。

美味しいところは自分でやりたくなりますが、機能を全て任せてしまうことで当事者感を持ってもらい、また全員に均等に作業が行き渡るようにしています。

 

もちろん、設計やディレクションなどはゲームデザイナーの僕が行なっている上での話です。

これをやらなかったせいで、僕が全てを握ってしまい「俺いらないんじゃないか」と面と向かって言われ一度サークル崩壊間際になったことがあります。

 

まとめ

他にもあると思うんですが、備忘録なので思い出したら追記していこうと思います。

サークルの運営とゲーム開発って両立させるの難しいと思うんですよね、その点会社ってよくできてます。

社長とディレクターは分けるべきだなと常々思いますし、個々人を見て適切な対応をするのはとても難しいです。

 

現在のサークルメンバーは全員、技術はもちろん人間性自体がとても素晴らしい人達で、いつも助けられてばかりです。

でも助けられることが少なくなるのはレッドシグナルだと思うので、今の状態はそれなりに健全な方向に向かっているんだろうなと思ってます。

多人数をまとめるなら色々気を使いましょう。

 

終わり。

【Unity】複雑なアニメーション遷移を制御するAnimatorの作り方

 

昔こんな記事を書きました。

 

yutakaseda3216.hatenablog.com

 

さらに、最近Gotanda.unity - connpass という集まりでもAnimatorについてのLTを行いました。

 

ここらへんで、皆一度は悩むであろうAnimatorのそれなりにマシな作り方、設計の仕方をまとめていこうと思った次第です。

 

Animatorの矢印が多くて困っている、どういう指標で作ればわからない

という方への手助けとなれば幸いです

 

既知の手法でAnimatorを作った際の問題点

 

まず、既知の手法でAnimatorを作るとこういった形になると思います

 

https://docs.unity3d.com/jp/540/uploads/Main/MecanimAnimatorControllerWindow.png

 

1つ1つAnimatorのステートを作り、それらをトランジションで繋ぐ作り方です

 

トランジションの制御にはそれぞれboolやTriggerといったパラメータを用意し、スクリプトでAnimator.SetBool()などを呼び出す...

 

 

ありがちですね

 

UIなどに使用するシンプルなアニメーションであれば、上記手法でも良いかと思います

 

しかし、キャラクターの制御などにこれをそのまま当てはめてしまうとこのようになっていくと思います

 

https://forum.unity.com/attachments/all-animations-small-jpg.67588/

 

これは極端な例ですが、矢印とパラメータが量産され視認性が悪くなっていきます

 

視認性の悪さを改善できる、サブステートマシンという機能が存在します

 

https://gametukurikata.com/wp-content/uploads/img/substate2.png

 

サブステートマシンとは、複数のステートをまとめておくことのできる機能です

 

詳細な説明はこちらの方が詳しく載っていますので割愛します

tsubakit1.hateblo.jp

 

サブステートマシンは良いグルーピングの手法ではありますが、この手法ではパラメータが量産されることを防止できません

 

また、グルーピングされた結果サブステートマシンの中の特定のステートから、他のサブステートマシンの特定のステートへ直接遷移する

などの手法はトランジションでは取りづらくなります

 

つまるところ、根本的な解決にはなっていません

 

 

必要な要件について

 

現在開発している3Dアクションゲーム、SLEEPWALKERでは

  • 大量にあるステートの全てが自由に遷移を組むことができること
  • ステートの追加、組み替えが容易であること
  • 時間に応じたモーションブレンディング設定
  • 時間に応じたエフェクト設定、etc

が必要でした

いろいろと試行錯誤し、このような非常にスムースな遷移を実現できました

 

youtu.be

 

 

具体的な設計、実装について

Animator部分

まず、Animator自体はこのようになっています

 

f:id:yutakaseda3216:20171219123349p:plain

 

トランジション、パラメータは一切ありません

デフォルトのステートはIdle(待機)モーションになるように設定してあり、AnyStateやExitなどの機能も使用していません

 

遷移は全てAnimator.CrossFadeInFixedTime()を使用しています

これについてはこちらをご覧ください

 

 

yutakaseda3216.hatenablog.com

 

 

遷移の方法について

遷移はStateMachineBehaviourを継承したスクリプトを全てのステートに付け、制御を行っています

 

docs.unity3d.com

 

StateMachineBehaviourを継承することで、現在のステートのNormalizedTime(アニメーション経過時間)を取ることができるため

 

経過時間に合わせた処理を行うことができるようになります

 

まず基底クラスを作成し、NormalizedTimeなどを取得しやすくしました

かなりレガシーコードです、整理もしてません。Rxを使用しているのと、TODOとか書いてあるので、設計自体はあまり参考にしないでください

 

gist.github.com

 

ResetTime()メソッドは、NormalizedTimeはステートにいる限り加算され続ける仕様のため、ループ設定をした際にNormalizedTimeが0.0f~1.0fで見れるようにtimeを初期化する処理です

 

気をつけないとループするアニメーションの際に設定したエフェクトなどが再生されなくなるので気をつけましょう

 

 

この基底を使いこのような設定を行うことのできるスクリプトができました

 

トランジション設定スクリプト

f:id:yutakaseda3216:20171219124202p:plain

 

遷移が可能なステートのenumを定義し、遷移優先度、遷移可能時間などを設定しています

 

ソースコードもそのまま乗せておきます、こちらもかなりレガシーなコードなのであまり参考にはせず、ニュアンスだけの理解にとどめてもらえると嬉しいです

 

gist.github.com

 

今見てもシングルトン経由したりしてやべえコードだ・・・

 

上記のようにAnimatorでアニメーション時間に関連する処理を書いていますが

AnimatorのStateと連動したStateMachineを作成し、Animatorの外側でゲームに関連する処理を書いています

 

gist.github.com

 

アニメーション時間に応じたその他の処理

 

攻撃判定発生スクリプト

f:id:yutakaseda3216:20171219124243p:plain

 

こちらも時間軸で動作を定義しています

 

SE再生スクリプト

f:id:yutakaseda3216:20171219124314p:plain

 

ループ設定などもできるようにしてあります 

 

 

まとめ

というわけで、トランジション設定をStateMachineBehaviourのスクリプトに寄せ、アニメーション時間が必要な処理もまとめてぶちこんでいます

 

 

トランジション設定を作っていくのに比べて

ので視認性、拡張性に優れます

 

また、Unity2017で追加されたPlayableを使用した完全スクリプトベースの手法も存在しますが

  • Animatorでステートの制御をぽちぽち作れること
  • ステートをビジュアル化しておけること
  • コード量の少なさ

で優位です

 

もちろん適材適所ですが、1つの指標になれば幸いです

 

 

宣伝

現在開発中のゲーム、SLEEPWALKERの体験版がweb公開されました!

よろしければぜひプレイしてみてください

 

https://www.studiophantomisland.com/

【Unity】OnPostProcessAllAssetsを使う時に特定の方法で無限ループする

 

OnPostProcessAllAssetsについて

docs.unity3d.com

 

このクラスを継承したEditorクラスは、OnPostProcessAllAssetsメソッドを定義することでアセットインポート時に処理をフックすることができる。

 

ScriptableObjectやなんやに自動登録したり、asset判別して何かする時によく使う。

 

無限ループする原因

 

  1. OnPostProcessAllAssetsを定義したクラスが2つ以上ある
  2. そのどちらも、処理の中でAssetDataBase.StartAssetEditing()とAssetDataBase.StopAssetEditing()を呼んでいる。
  3. どちらもAssetDataBase.Refresh()を呼んでいる。

 

以上です。

 

docs.unity3d.com

 

 

アセットインポート時に、さらにアセットをインポートする処理を書いてしまうとOnPostProcessAllAssetsをお互いに呼び合ってしまうので無限ループするっぽいです。

 

 

回避方法

 

  1. OnPostProcessAllAssetsは引数に変更されたアセットのパスが入っているので、パスを使用し処理を行うべきか否かを判別する
  2. OnPostProcessAllAssetsを受け取るルートクラスを作成し、個別に受け取らない

 

 

最後に

 

回避はこれで可能、原因も多分あってる。

ただどうにも釈然としないので、何かピンと来た方Twitterまでぜひご連絡ください。

 

【Unity】Timelineで使用するPlayableAssetとPlayableBehaviourを参照を追加しながら作成するエディタ拡張

 

リポジトリ

github.com

 

ここにプロジェクトとUnitypackageがあがってるのでダウンロードなりcloneなりをどうぞ

 

 

使い方

 

メニューに表示されているPhantomIsland -> Windowからエディタを開いてください。

 

 

設定できる項目は

 

  • 使用するnamespace
  • 変数の型、変数名、参照タイプ

です

 

参照タイプはシーン上のオブジェクトはExposedReferenceを選択してください。

大体ExposedReferenceだと思います、多分・・・。

 

CreateScriptボタンを押すと、保存先と名前を指定するウィンドウが出るので設定して保存して下さい。

 

保存した名前の末尾に~Assetと~Behaviourという名前が付くので、~Playableという名前がよいかも。

 

保存すると、設定した参照がすべて記入されており、PlayableAssetはいじる必要がなく、基本的にPlayableBehaviourにロジックを記述するだけでよくなっています。

 

最後に

 

まだまだTimelineは進化しそうなので、情報を追っていきますぞ。

【C#】NSubstituteを使用してクラスをモックとして偽装する

 

NSubstituteとは?

 

定義されたinterfaceを使用して、クラスの振る舞いをモックとして定義することが出来るライブラリ

 

interfaceに定義されているフィールドやメソッドの返す値や動作を一つずつ定義できるので、テストしたいクラスに渡すデータなどの偽装が可能

 

とにかく非常に便利で、使いやすく有用

 

入手はこちら

github.com

 

 

Unityで使用する際はUnity Test Tools を入手して、Pluginsの中にdllを入れると動作する

 

https://www.assetstore.unity3d.com/jp/#!/content/13802

 

基本的に実機動作はしません、UnityならEditor上のみで使用するようにしてください 

 

簡単な使い方

 

クラスとフィールド、メソッドの動作を偽装した例

 

gist.github.com

 

 

割と簡単に定義できる

 

 

ちょっとした小技

 

メソッドの中で自身のフィールドを変更したい時などは、一度データをキャッシュするとよい

 

gist.github.com

 

直接フィールドを書き換えることはできないので、気をつけよう

 

 

ある特定の機能だけ動作させたいけどデータがないよ〜という時はガンガン使っていこう

ブログ名とかを変えました。

 

 

ブログ名とか、中のデザインを一部変えました。

 

開発とかメモ -> かせの開発とかメモ。 -> かせノート。 <- New!

 

書くことはほとんど変わらないと思いますので、今後ともご愛読くだされば幸いでございます。

 

よろしくお願いします。