同人ゲームサークル reverse snare 開発ブログ

主に2DSTGを作ってる同人ゲームサークル reverse snareの開発記、イベント・作品宣伝を行うブログです。

マジカルブラスター 2021体験版 公開!

というわけでこちらのリィンクからDLできます。

www.dropbox.com

正月の期間で何回か更新入れると思います。

・敵表示レイヤの修正(地上敵、ボスとパーツ)
・ボスの爆発演出の実装
・難易度変更(体験版のみの仕様になるかも?)
・英語対応
・音声ファイル更新(中型機爆発音の持続のせいで小爆発音が発声できない and ステージクリアジングルを実装したい)

このあたりを目標に頑張ります。

(20220101追記:描画レイヤとボス撃破演出実装しました!)
(20220102追記:トップメニューの英語対応を行いました。readmeの用意とオプションメニューの翻訳修正はもう少し時間かけて行うようにします…また、難易度と残機数の変更がゲームに適用されるようになりました。)
(20220103追記:BGMの実装(タイトル・ステージクリアジングル)、効果音の更新(妖精・金ショット撃破効果音)これにて2021体験版の更新は以上です。)

今年はコロナの動向がまだわからなかったので冬コミ/デジゲー博への応募はしませんでした。
来年もまだ不透明なところがありますが、できたらMB完成版とAD体験版を用意してイベント参加したいですね…!

ということでIndieLiveExpoから時間が空いたうえ、体験版での公開となってしまいました。
これからも開発を続けていきますので、来年もよろしくお願いいたします。

過去ツイからちくちくを検知!!!!!

新作横STG開発中!「マジカルブラスター 」

新作発表!「マジカルブラスター」

本日のINDIE Live Expo 2021にて、新作「マジカルブラスター」の発表をさせていただきました!!
f:id:Y__revSD:20210605013555p:plain

妖精たちを引き連れ大量の敵に立ち向かうハイスピード・シューティングゲーム
それぞれの妖精が持つ技を駆使して敵を倒し、宝石と金塊をゲットしてハイスコアを目指せ!

f:id:Y__revSD:20210604125652p:plain

f:id:Y__revSD:20210604125701p:plain

f:id:Y__revSD:20210604125703p:plain

本作はレトロハード(G〇A)風の表現を行っており、解像度低め、サウンドも粗PCM・PSG・ノイズをバリバリに使っております。
効果音が鳴っているときはBGMのパートが抜けるレトロハードあるある再現もキアイで行っております。
f:id:Y__revSD:20210604125850p:plain

PVに使用したステージ1BGMの曲ラフとGB〇化音源のフル尺を公開!
ついでにノイズのみのステムも特別公開!!!!!!!震えて聞け!!!!!!!

mac PCとiPhone SEが手に入ったのでアルデスをiPhoneで実行してみた

iPhone買い替えたかったのとmacを購入できたのでせっかくなのでiPhoneで動かしてみよう!

動いた。やったね!

開発環境の準備

Unity 2019 4.7f1(LTS)

winと同じバージョン。
UnityHubからインストールしていない場合、後からプラットフォーム別プラグインを追加するときはインストーラをもう一度起動して追加する。

Visual Studio 2019 for Mac

Unityインストール時のオプションで選択可能。
この記事の作業中はこちらを使ったが、結構不満がある。(すべての参照検索で検索中...のまま進まないとか、キーバインドVSCodeメインにしてもいいかもしれない。

VScode

win機からsetings.jsonをコピペして設定完了。
拡張はそんなに入れてないので手動で入れる。
変更ファイルの差分が見やすいのでVS2019と併用する。

Xcode

UnityでiOSビルドするとXcodeプロジェクトが生成されるので、こちらでappをビルドして実機やシミュレータに突っ込む。
本来はSwiftなりObj-CなりでiOSmac向けのアプリ開発ができる開発環境。

winからmacへデータ転送

最初はzipしたプロジェクトフォルダをUSBで転送して解凍失敗して、それは7Zipで圧縮したものなのでwinデフォルトのzipと両方用意して渡すようにすると解凍できた。最初は。
2回目以降は両方失敗するようになり、mac側で圧縮解凍ソフト用意したけどダメでした。
同LAN内で直接ファイルをやり取りできれば非圧縮でファイルコピーできるのでは?と思ったんで「mac win ファイル共有」あたりで検索。
https://support.apple.com/ja-jp/guide/mac-help/mchlp1660/mac
http://iphone.f-tools.net/Question/PC-File-Sharing.html
これでデータの受け渡しはOK。文字化けなどの問題もなし。
macに持ってきたときに画像ファイルなどが変更としてソース管理に上がってきてしまう。ひとまず、主な開発作業はwinで行い、iOSアプリの書き出しが必要になったときにプロジェクトをmacに転送。macで編集が必要あった場合は編集したファイルのみwinに転送し取り込む。取り込んだらmacの編集は破棄。ひとまずこの運用で。

ポーズメニューだけのプロジェクトで起動確認

esc押したときのメニューね

iOS実機で実行するまでの手順

xcodeのアカウント設定(一度でOK)

xcodeの環境設定でiTunesアカウントを設定する。
(AppStoreでのアプリリリースにはApple Developer Programに登録したアカウントが必要だが、まだリリースしないので普段使いのアカウントを設定。)

Unityでxcodeプロジェクト生成、xcodeでappをビルド

UnityでiOSビルドすると、xcodeプロジェクトが生成されるので、xcodeで起動する。
プロジェクト設定(xcode左のファイル一覧のrootの項目)の Signing & Capabilities から automatically manage signingを選択、その後teamのプルダウンから環境設定で設定したiTunesアカウントを選択。
この状態でiOSバイスmacに有線接続すればxcodeで実行先をデバイスに設定できるので、いよいよ実行!

プラットフォームによって読み書き可能なディレクトリに制限がある

win standaloneのアプリなら次のメソッドで実行ディレクトリにdatフォルダが出来上がる。
Directory.CreateDirectory("dat");
この中に設定ファイルやキーコンフィグのファイルを保存していた。

PCのアプリなら実行ディレクトリにフォルダ作成で問題ないが、その他のプラットフォームではファイルの読み書きができるディレクトリは限定される。
使用可能なディレクトリは、次の内容で取得できる。 UnityEngine.Application.persistentDataPath
ここにフォルダを作成し、ファイルを生成した。
Directory.CreateDirectory(UnityEngine.Application.persistentDataPath + "/dat");

プラットフォーム別の実行処理分岐

#if で書くやつ。UNITY_EDITORやDEVELOPMENT_BUILDを指定する時と同じ。
IDEでは現在の環境しかサジェストされないので公式ドキュメント https://docs.unity3d.com/ja/2018.4/Manual/PlatformDependentCompilation.html からコピペがよい。

#if UNITY_EDITOR || UNITY_STANDALONE_WIN
    Debug.Log("エディタかwinアプリで実行時に動作");
#elif UNITY_IOS
    Debug.Log("iOSで実行時に動作");
#endif

ゲームパッドでメニュー操作できたので確認完了

読み書きの問題が終わったところで、無事動いた。
iOS13から箱1コンやPS4コンをBlueTooth接続できるので接続したうえでアプリを起動すれば操作可能。
大体の環境でコントローラが左スティックにAxis1,2が設定されているのでとりあえず動く。
しかし、問題は方向キーで…方向キーにボタンが割り当たっているっぽい。
まだ調べていないが1方向に対して軸一つ、ボタンも同時入力されている????
PCでは方向キーがボタン扱いのコントローラを使わせない想定だったが、iOS向けにリリースするのであれば対応せざるを得ないかもしれない。

また、ボタンも連続で押しはじめ判定になっている。チョン押しじゃないとメニュー階層が一気に進む。
この時は抜き出した際に一部入力処理を書き直しているのでそのせいだと思っていたが、実際にアルデス本体が実行できた時にも発生した。

アルデスのプロジェクト起動確認

まずmacのUnityEditor上で動かないのでeffekseerをとりあえず外す

Effekseerがmacの描画ライブラリのmetalに対応していない的なエラーだったと思う。
あまり調べていないがmacに対応したバージョンは割と最近だったはず。

これまでもEffekseerで用意したエフェクトは描画レイヤーの制御ができないので今後も使うか悩んでいた。
呼び出すオブジェクトのlayerに依存しているはずだが、弾幕やアイテムの描画順はsortingLayerで指定していたため、書きたい描画タイミングを指定できなかった。

エフェクト量産するにあたってEffekseerが必要になったらまた入れるとして、今は外すことにした。 ちなみに使っていた場所は近接のエフェクトと溜めボムです。

外部プラグインは対応するOSバージョンを確かめよう!

これでエディタ上ではwinと同様に動作するようになった。

iOSビルド。カクツきがあるが、ゲーム動作した

メニューの抜き出しプロジェクトで確認したファイル読み書き権限について対応してiOSビルドしたら起動>クレ投入してゲーム開始までできた。
1番目のツイートの段階。
内容としてはADX2LEを使用した音声再生がされない。
また、敵の撃破時や一部の敵の攻撃時にnullポで短時間フリーズする。

音が出ない

キャラセレのインタラクティブミュージックの試作Prjを移植し確認。 結構ググって、ビルド後の設定が抜けているとか情報を見たけど最終的にはプラグイン更新で動いた。

外部プラグインは対応するOSバージョンを確かめよう!(2回目)
ついでにIMの動作確認もできてちょうどええわい。

ほかのエラー対処

これもファイル保存のディレクトリの話でした♨
設定ファイル、キーコンフィグファイルの読み書きだけ対応してゲーム開始はできたが、ほかにもファイル読み書きするクラスはあり…
ランキングとリプレイの対応が漏れてStartの途中でコケていたのでエフェクト用の一部リソースが取れず、敵撃破のエフェクト発生時などでnullポになっていたようだ。

nullポのフリーズを解消したら普通に動くようになった!

3番目のツイートの段階。録音はできてないけどBGM/SEともに再生されるようになりました。

アルデスで実装した要素がiOSでも動く!

エントリーポイントが1つの構成でも問題なく動く

UnityイベントのUpdateを実装しているスクリプトが一つ(で、ゲーム動作全体を制御する構成)でも動く。
まあアカブルで実現できるのを見てからUnityに来たので、できないはずがないが。

その他アニメ再生なり敵の動作リソース管理などもロジック部分は普通に動く。

KeyCodeを使ってゲームパッドのボタン押下状況の取得ができる

これ使ってキーコンフィグ作ってたからな。 ほかにもInputSettingにAxisをすべて列挙して入力方向をとる方法もうまくいっている。

問題はボタン長押し時の連射判定で、入力処理のどこが悪いか調査しなければ。

  • レーザー(A)長押しはできる。
  • 烈怒(A+C)はソード(A押しながらC短)に化ける。
  • メニューの決定が一気に階層すすんでしまう。(決定はレーザーボタンなんだが?????)

FPSを指定して動作できる(ゲーム中に変更可)

Application.targetFrameRate = 60;
疑似処理落ちはこの値を下げて表現してます。 Effekseer製エフェクトを動作させるときは併せてTime.timeScaleも下げたり。

FPS下げたときの入力遅延がNAOMI斑鳩のボス爆発中の遅延に近い。
無線接続してるので素でも遅延が大きいかも?
FPSは60固定で内部ロジック通す/通さないの切り替えにすべきかも。

その他

  • Spriteのtransform変形やLineRendererのなどの表示範囲が変わる系が問題なく描画できている。
  • 低速移動の残像シェーダが問題なく描画できている。
  • 確認できなかったこと
    • normalmapでのライティング適用
      • シェーダもプラットフォーム別に記述する部分があるかもしれない
      • クオリティセッティング触れるようにしたの、メニュー改修時に消しちゃってた(テヘ

これから

CAVEのアケ移植スマホSTGのようにスワイプで相対移動、ボタンでショット切り替えを実装したい。
併せてアカブルのような触れている間ショット・2個押しでボムのようなスクリーンボタンが不要な操作も試してみたい。
スクリーンボタンが不要のショットレーザーボムのだし分けを考えたので。

でそれがうまくいったら短期間でアルデスのガワだけ変えて複数プラットフォームで外伝作品をだしたいな~ガワだけって言っても素材作成の負荷たかいとおもいますが

製作記(ツイッターぬきだし)

ブログ移転して元のブログも閉じず1年以上経過している。サムネで元ブログへのリンクになってるの差し替えめんどくさい。

新しい自機を作成中。併せて自機共通部分や既存キャラも修正中。 前作3面の赤い女の子です。ワイドショット、DDPレーザー、移動速度低な感じのキャラです。

Cubase proのセールがあったので8 Elementsから10.5 proへバージョンアップ。 32bitVSTが反応しなくなったり音源を外付SSDに移したためこれまでのプロジェクトが開かなくなってしまった… とりあえずST1BGMプロジェクトを復元。

Cubase proはUSBの認証機器(ドングル)が必要となり、メーカーSteinbergの本場ドイツから送られてきた。 最初は机の上のUSBハブにつけたが結構光るし他のケーブル扱ってる間に壊さないか心配になったんで、 外付ストレージと合わせて導入したセルフパワーのUSBハブに押し込んだ。

前作通常被弾じゃ赤くならなかったような?うろ覚え。 C97版でシールドの回復速度を落としたけど、まだ緩いのでもっと遅くしてアイテム取得でも回復するようにしようかと

時間かかったアナログ入力対応。 Unityデフォの起動時ダイアログを出せば解決する話なのだが…

罪罰は神ゲーはっきりわかんだね。前作同様ポインターレーザーも出します。 久々にグラVやバガン遊んだけどやっぱりトレジャー好きだわ。

さて今年はイベント参加予定はありません。 デジゲー博は縮小開催のようだけど自粛します。コミケもやらないようだし。 年末年始でできたところまでのバージョンを配布するかもしれません。

ADX2LEでインタラクティブミュージック(横遷移)の実装

製作中の「アルカイック・デスブリンガー」ではインタラクティブミュージックを実装したい。
その一歩として、次の体験版で実装予定のキャラセレ/チュートリアルのBGMでの実装を試みる。

インタラクティブミュージックとは

(以下IM)

ゲームの進行状態や操作に応じて音楽の展開を制御して、場面に合わせた音楽でゲームプレイを盛り上げる手法。

  1. 縦遷移…マリオシリーズヨッシー搭乗パーカッションやマリカwii以降のメニューの階層を進めたときに楽器が増えていくあたりがわかりやすい。
    強化状態やピンチな状態で楽器の追加変更を行う。

  2. 横遷移…F-ZERO GXファイナルラップBGMに遷移するとき、急に切り変わらず音楽的な区切り(4小節毎など)まで待ってから切り替える。
    ゲームの進行が固定的なスクロールシューティングでは、道中は曲流しっぱなしで十分だが、横遷移を使うのであれば、「ボス戦の形態によって曲が進む」などだろうか。

大復活の裏中ボスは、ステージ開始時に別曲を読み込んで再生しているが、条件によってゲーム進行を一部だけ変えるのであれば、IMで実装してもよいかもしれない。

キャラセレ/チュートリアルでIMをどう使う?

実現したいのは以下の通り。
横遷移を使用する。

太文字はチャレンジングな内容で問題になりそうな事項。

  • キャラセレのループからチュートリアルのループに遷移
    • 遷移するときは専用のセクションを通過したい
  • キャラセレのループが終わらないままチュートリアル終了した場合、Aジングルでゲーム開始、
    チュートリアルのループならBジングルでゲーム開始
  • 変拍子の曲でインタラクティブしたい
    • 主にボス戦で多用する予定だし、先にどのようなデータ用意/実装が必要か見ておきたい
  • セクションごとに微妙にテンポチェンジしたら生演奏っぽいかな?
    • 普段やってるわけでもないのになんでこれ目標にしたの?????
  • 曲のセクションを遷移しても空間系の余韻を残すべき。なので遷移タイミングすべてでwavを分割しておく

曲の作成

というわけで曲が出来上がった。

  • Aパート:キャラセレ用パート「7776」
    • その名の通り7/4 x3と6/4で構成されたパート
    • キャラセレ中はこのパートでループする
    • ゲームがチュートリアルに遷移した場合は、4,8小節目を遷移用フレーズ(8/4)に切り替えてBパートへ遷移
    • ゲームがゲーム開始状態に遷移したときは各小節の終わりからジングル:end1に遷移
  • Bパート:チュートリアル用前半パート「piano」
    • ピアノのメロが主体のパート
    • 自動的にCパートに遷移する。最後の小節だけ7/8拍子
    • ゲームがゲーム開始状態に遷移したときは4小節の区切りからジングル:end2に遷移
  • Cパート:チュートリアル用後半パート「DHE」
    • switchのユグドラを遊んでいたせいかスティング作品の戦闘準備BGMぽくなったパート
    • チュートリアル中はこのパートでループする
    • ゲームがゲーム開始状態に遷移したときは2小節の区切りからジングル:end2に遷移
  • Aパートで終了時ジングル「end1」
  • B,Cパートで終了時ジングル「end2」

音楽的なつながりとか、ディミニッシュのフレーズでゴリっとやってしまった。
end2の最初の3音のヒット、「THE ASTONISHING」で聞いたような場面転換感。

というわけで遷移ポイントごとにwavに書き出してCRI Atom Craftに取り込む。
空間系の余韻を残すという目標によってデータサイズ爆上げ君。

CRI Atom Craftでデータ作成

テンポ/拍子設定

イムルーラ横のボタンを押すと時間基準表示かビート表示が選べる。
https://game.criware.jp/manual/adx2_tool/jpn/contents/criatom_tools_atomcraft_edit_timeline_timebase_setting.html?highlight=%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%99%E3%83%BC%E3%82%B9

テンポ/拍子を設定できる。7/8とか分母も設定できる。

ミリ秒指定は面倒なのでクオンタイズされた操作ができるのはありがたいが、同一キュー内でテンポチェンジがあった場合は変更できない。

タイムラインの右クリックからビート同期情報を作成できるが、ここでテンポ/拍子変更してもタイムルーラには反映されない。ビート同期情報は縦遷移のテンポ合わせに必要なものなので、横遷移のみの今回には関係ない。
変拍子だけなら、正直、小節頭がずれててもクオンタイズされていれば目的のデータ設定はできそうだが、テンポチェンジとなると厳しい。

タイムライン上で右クリック>サブシーケンス作成で編集中のキュー内でサブシーケンスを持てる。
サブシーケンスの中では別のテンポ/拍子設定が使えるので、変更があるたびにサブシーケンス内に波形を置いていく。

ブロックの設定

https://game.criware.jp/manual/adx2_tool/jpn/contents/criatom_tools_atomcraft_sequence_block_property.html

キュー内でのみブロックを設定する。 サブシーケンスや子キューで持つと親キューの進行にかかわらず内部でループすることがあるので。

  • ブロックの終端ミリ秒
    • テンポチェンジと変拍子が絡む場合は自前のexcelで計算する。変拍子では付属の計算機で出しにくいのでね…
  • ブロック遷移先
    • デフォルトの遷移先。次のセクションに続けるなら「次のブロック」、ループするなら戻したいブロックを指定。遷移先を設定するときはインスペクタの下のブロックの情報設定を開く必要あり。
  • ブロック遷移タイミング
    • 今回のAパートのような、「遷移先によって遷移タイミングを変える」を実装したい場合はブロックエンド時に限定してブロック数を増やしたほうが良い。プログラムで現在ブロックIndexはとれるが、現在の指定分割位置が取れないため
    • 他には「XからYに遷移する時は、2小節目はX’につなぐが4小節目はX''につなぐ」などつなぎ部分を切り替えた曲を用意する場合もブロックエンドのほうがよさそう
    • 上記に該当しなければ、入力の手間が省けるため、指定分割でもよい
  • ブロック遷移の振る舞い
    • 余韻を残したい場合は「何もしない」

多重再生が発生しないか確認

ここからが本当の地獄だ…

  • テンポ変更によってクオンタイズされた操作がほぼ不可
  • 余韻云々のためwavが分割されすぎている
  • ブロック遷移の振る舞い「何もしない」により、一度wav再生されると1フレーズ流れっぱなし

上記のためか、下記が起こる場合がある。

  • 同セクションループ時に、次ブロックサブシーケンスが再生される
  • 分割ブロックから遷移したとき繊維前の次波形が再生される

必要に応じて5~15ミリ秒程、各wavを後ろにずらす。

確認がすんだら書き出し

ついでにCSVで情報を書き出しておくと便利かも。

Unityに取り込む

ブロック制御するときの再生プログラム

CriAtomExPlaybackで次ブロック指定や現在の再生情報の取得を行うことができる。

宣言

CriAtomExPlayer player;
CriAtomExPlayback playback;

//CSVからブロック名を抽出すると楽。識別しやすい命名にしよう!!!!!!!
enum SectionState : int {
    fillin
    , _7776_123
    , _7776_4
    , _7776_567
    , _7776_8
    , _7778_8
    , piano_123
    , piano_4
    , DHE_1_peak
    , DHE_2to8and1peakless
    , end2
    , end1
}

再生ファイル指定

player = new CriAtomExPlayer(true);

//Assets\StreamingAssets以下を参照してファイル指定
player.SetCue(CriAtom.GetAcb("CharactorSelect_Tutorial"), 1);

再生

playback = player.Start();

現在のブロック取得と遷移先ブロック指定

int cur = playback.GetCurrentBlockIndex();
if(cur==(int)SectionState._7776_123){
  playback.SetNextBlockIndex((int)SectionState._7778_8);
}

ブロック設定で触れた、

今回のAパートのような、「遷移先によって遷移タイミングを変える」を実装したい場合はブロックエンド時に限定してブロック数を増やしたほうが良い。プログラムで現在ブロックIndexはとれるが、現在の指定分割位置が取れないため

について、もし分割で設定してしまっている場合は、別途フラグの用意、シーケンス位置で判定してどうにかする(敗北)。
曲前半であるほどブロックの差し込みによる手間が爆増するため、データ修正をあきらめてコードを書く。

const long _7776_3_START = 6884;
const long _7776_3_END = 9558;

const long _7776_7_START = 17202;
const long _7776_7_END = 19877;

bool is7776_3or7() {
    long seqPos = playback.GetSequencePosition();
    return (seqPos >= _7776_3_START && seqPos <= _7776_3_END) ||
      (seqPos >= _7776_7_START && seqPos <= _7776_7_END);
}

----

//ゲーム状態操作時
if (is7776_3or7()) {
    playback.SetNextBlockIndex((int)SectionState._7778_8);
} else {
    waitFor7776_3or7 = true;
}

----

//遷移タイミング待ち
if(is7776_3or7() && waitFor7776_3or7){
   playback.SetNextBlockIndex((int)SectionState._7778_8);
   waitFor7776_3or7 = false;
}

多重再生が発生しないか確認

地獄は終わらない…

ツールで多重再生などが発生しないことを確認したにもかかわらず、Unity上で発生してしまう… 各wavをさらに8msほど遅くして解決。

ビルドして、Application.targetFrameRateでFPSを下げたり、PCの省電力設定で多重再生が起きないか確認。
ほかのプロセスで走ってるはずなのでFPSは確認の意味ない気もする。

実装完了!

お疲れさまでした。

その他気になった点など

  • ツール付属のマニュアル.chmファイルよりウェブ公開されてるユーザーズマニュアルのほうが詳細。
  • 多重再生については読み込み速度や処理速度の問題か?と見ていたが、ツールデフォルトのオンメモリ再生から変更していないので、サンプル位置の調節でしか対処できない?
    • CriAtomExPlayer.Prepare()はストリーミング再生での事前読み込みなので関係ない。

今後の製作でIMをどう用いるか

今回横遷移のIMを実装したのは、曲の展開がある場合だと横遷移だろうと決めつけていたため。(F-ZERO GXの制御だけ想定していた)
縦で楽器の差し抜きに限らず曲展開も可能だということを、IMについて調べてる間に気づいたが、対応する曲制作が技術的に可能かわからない、データ作成の手間が多そう、変拍子で縦はさらに難度高そうで、今後やるかどうかはわからない。
(「この小節だけ1拍抜き」とかやりたいので縦で同期とるの絶望的では?)
縦を使うならコード進行に影響のないパーカッションの増減が最もエコノミーか。
強化状態になったらドラムをズンドコさせたバージョンに切り替えるとか?

IM用のデータを用意するなら

  • 拍子は自由でOK!
  • テンポチェンジは音楽的に必要がない場合は使用しない(演奏感のブレを求めて使用しない)
    • 次の作成時、テンポチェンジがない曲で多重再生が発生するのであれば、サンプル位置補正は作業手順に含めてしまう
  • ブロック遷移タイミングは基本ブロックエンドで、プログラム側で制御しやすくする。
  • 遷移可能タイミングを増やすと分割wav数が増えるので、絞る
    • 短いループに留めて縦のパート増減で尺稼ぎ?

以上、IMの試作でした。 今月はキャラセレ/チュートリアルの画面素材作成に入ります。

イベント参加告知!!【デジゲー博2019】【コミケ97_4日目】

前ブログの後始末や過去記事の画像整理をしないまま半年以上たっております。

デジゲー博

2019年11月17日(日)
秋葉原UDX2階 アキバ・スクエア&4階 UDXギャラリーで開催

配置場所:2階 AKIBA_SQUARE D-20a reverse snare

digigame-expo.org

参加サークル一覧 | デジゲー博

お疲れさまでした。 多くの方に試遊いただいて感謝です!

コミケ 97

配置場所:12/31(火) 4日目 南地区 "メ " 20b

おしながき

【体験版】アルカイック・デスブリンガー 2019 体験版 - ¥100

横スクロール弾幕STGです。
去年頒布したステージから変わって正式なステージ1が…遊べる…かもしれない
システムも一部変更が入っています。
デジゲー博とコミケで同じDLカードを頒布しますが、内容は進捗に応じて更新していきます。

ダウンロードリンクは以下となります。
https://www.dropbox.com/s/3viwjmev3wmvjh9/AD_Tr2019.zip?dl=0
カード記載のリンクはhttp://bit.ly/AD_tr2019ですが、上記の短縮URLとなっています。
Zipの解凍はDLカード裏面のパスワードを使用してください。

11/17 初版公開(設定ミスにより、11/17 25時ほどまでDL不可の状態でしたが現在は復旧しています。)
11/21 描画不具合の修正ほか、画質クオリティの変更をオプションで可能にしました。

【既刊】stolen explosive - ¥100(予定)

装備の熱量をコントロールして、強力な攻撃を放て!縦STGです。
DLカードになるか白ロムCDに焼くかDL販売サイトの宣伝ビラになるかまだわかりません。 デジゲー博ではCD焼いて頒布していました。多分コミケもそうなる。

それではまずはデジゲー博でお会いしましょう~~ではでは~~~~~~~~ 次はコミケです~~~~~よろしくです~~~~~~~~

Twitter連携の実装

ブログ中のDLリンク確認は完了して無効リンクの差し替えなど行いましたが、サムネ画像の差し替えがめんどくてやってない…結構な量あるよなぁ

では本題です。

RebRank製のTwitter連携ツールを使いたい

SimpleTwitterClient
https://www.rebrank.org/products/SimpleTwitterClient/

RebRankさんが公開している、ツイッターのアプリ連携を行うツールの存在を以前から知っていました。

GitHubで公開されており、MITライセンス内で使用できます。
RebRankさんのゲームはもちろん、∀kashicforceなどの他サークルの同人ゲームでも利用されているツールです。

こういうやつ

エゴサってあんまりやってないんですけど、これでタグ付けツイートさせれば感想とかたどりやすくなるんじゃないかなーという目論見で、去年の体験版の時点で実装したかったのですがTwitter側の設定がわからず実装をあきらめました。
つい先日思い立って設定を見直したら連携できたのでサクッと実装してみました。

Twitter側の設定

https://developer.twitter.com/

ここでdeveloper登録する。(1年前なので覚えてない)

アカウントを作ったら、連携するアプリケーションの情報を入力します。
右上の下矢印からApp
f:id:Y__revSD:20190630203444p:plain

右上のCreate an appで
f:id:Y__revSD:20190630203447p:plain

アプリケーションの情報入力画面に入ります。
f:id:Y__revSD:20190630203637p:plain

アプリ名はまあいいとして、

  • Website URL (required)
    開発者や製品ページのURLを記載します。
    ここに入力した内容がユーザーに表示され、連携設定を行う画面やTwitter設定内の「アプリと端末」内に表示されます。
    ほかのURL欄は入力しなくてもOKです。多分。

  • Application description (required)
    "ゲームプレイ結果をツイートします"など書いておきます。 これもユーザーから見えます。

  • Allow this application to be used to sign in with Twitter / Enable Sign in with Twitter
    Callback URLs
    チェックなしのURLなしでOKです。
    去年はここでやられてました。
    Enable...にチェックを入れるとCallback URLsがrequiredになります。

f:id:Y__revSD:20190630204814p:plain

f:id:Y__revSD:20190630204819p:plain

読み違えて「ログインが必要?そりゃそうだろうな…」でチェックを入れ 「このツール使ってるゲームではこのPIN画面が出るけど、ここのURLはどうやって調べるんだ!?」と去年は必死でググり混乱を重ねていましたが、
f:id:Y__revSD:20190701005314p:plain 別にチェックなしのURLなしでOKです。この画面が表示されるようになります。

入力が終わったらKeys and tokensタブでConsumer API keysAccess token & access token secret 両方を生成します。
Access tokenは不要かも?(よくわかってない)

SimpleTwitterClientを設定変更してビルド

https://github.com/Sheile/SimpleTwitterClient

ZIPダウンロード。
readmeどおりに進めていけばOK!

コマンド打って稼働確認しておきます。

--configで設定を行ったかどうかは、twitter-config.xmlが存在しているかを判定するとよいと思われます。

Unity/C#の実装方法を確認

  • exeを呼ぶには?
    System.DiagnosticsのProcessクラスを使用します。
void callSSTwitter(string currentPath, string arg) {
    var app = new ProcessStartInfo();
    app.FileName = currentPath + "sstwitter.exe";
    app.Arguments = arg;
    app.UseShellExecute = true;
    Process.Start(app);
}

引数に渡す文字列にはダブルクォートを忘れずに…(1敗)(最初のスペース以降すっぽ抜けた図)


public string getCurrentPath() {

    string FilePath;

#if UNITY_EDITOR
    FilePath = Application.streamingAssetsPath;
    FilePath = FilePath.Replace("Assets/StreamingAssets","");
#else
    FilePath = System.AppDomain.CurrentDomain.BaseDirectory;
#endif
    UnityEngine.Debug.Log(FilePath);
    return FilePath;
}

エディタでの動作確認はプロジェクトディレクトリ直下にsstwitter.exeを配置。
ビルドしたらゲーム本体exeと同じ階層に配置。

ツイート内容を考案

  • ゲーム名ハッシュタグ
  • キャラ
  • バージョン
  • スコア
  • 到達面
  • 設定で追加情報をツイートに含める
    • アイテム素点などスコア回りの内容

字数を稼ぐために半角英数でカバーしたい
(最近の文字数仕様だと全角文字だと140字、半角だと200?字で、混在してるとその間で文字数可変だったような気がする)

あと英語でもツイートできるようにしたい。

言語化対応

UnityのTextAssetを使った多言語対応(ローカライズ)の方法
https://taiyoproject.com/post-430
こちらの、Asset/Resourcesに言語別ファイルを置いて読み込む形式を使用。コピペして下さいとあるのでコピペする。

Dictionaryって処理・メモリ重いんじゃないかな?と思うけどツイートタイミングはゲーム終了時だしツイート時のみ言語別の文章を知ってればいいので、staticでないクラスにして必要な時だけ読み込み、解放するようにした。
ゲーム内容の多言語化はどうしようか。文章ボリュームの想定がつかないのでまた今度考える。

日本語と英語で文章構成が変わってくるので使用する単語置き換え用の単語を含んだ文章を書いておく。 $hennsuu 的な

多言語用ファイルの内容はこんな感じ。

tweet_ja.csv

HashTag  #ARCAIC_DEATH_BRINGER
Stage   ステージ
Boss    ボス
TrueBoss    真ボス
Reached $charaで$stageに到達!
GameClear   $charaでクリア!
DefeatedTrueBoss    $charaで真ボス撃破!!!!
UseContinue (Continue有)
Sies    シエス
Alsy    アルシィ
hogehoge    名称未設定
Seg セグ

tweet_en.csv

HashTag  #ARCAIC_DEATH_BRINGER
Stage   Stage
Boss    Boss
TrueBoss    True Boss
Reached $chara reached $stage!
GameClear   Game cleared with $chara!
DefeatedTrueBoss    $chara has Defeated True Boss!!!!
UseContinue (UsedContinue)
Sies    Sies
Alsy    Alsy
hogehoge    (unnamed)
Seg Seg

この短い英文でも怪しい…怪しくない?

Reachedの例で言えば、
1. ゲームで使用しているキャラの名称を取得。(ファイル後半の4項目)
2. ゲームの進行に合わせて、StageBossキーから単語を取得。
3. ステージ数はゲーム管理から取得してstringにする。
4. ステージ数とStage or Bossの単語を合成する
5. Reached文章を取得。
6. $hennsuuの文字列を用意したキャラ名、ステージ数に置き換え
7. シエスでステージ1に到達! Sies reached 1Boss!のような文字列が完成する。

追加情報をツイートに含める内容については、字数稼ぎのため英字で固定にする予定だけどハードコード脱却のためにあとで両方に同内容移すかも。

あと文字コードUTF-8で保存すること。

テストを書く

今までのゲーム、テストを全く書いていない
最近になって書いたほうがいいんだろうなと思いつつもゲームロジックはカウント多用や他オブジェクトとの会話が多めで書きづらいためできていない。

今回は動的な部分が少ないので、導入するきっかけにできた。

Unity Test Runnerを導入
https://docs.unity3d.com/ja/current/Manual/testing-editortestsrunner.html

public class TweetUtilTest {

    [Test]
    public void Test01_callTwitterConfig() {
        TweetUtil tu = new TweetUtil();

        tu.configTwitter();

    }

    [Test]
    public void Test02_stage1GameOver_Ja_Simple() {

        Settings.languege = Settings.Languege.Ja;

        TwitterSetting.enableAdditionalInfo = false;

        TweetUtil tu = new TweetUtil();

        StringAssert.AreEqualIgnoringCase(
            "\"#ARCAIC_DEATH_BRINGER " + Settings.version + " / シエスでステージ1に到達! Score:999,999\"",
            tu.Tweet(TweetUtil.Progress.St1, false, Player.NewGamePlayerBase.Chara.Sies, 999999, 123, 1.23f, 1, "hogehoge")
        );
    }

    [Test]
    public void Test03_1bossGameOver_En_Detail() {

        Settings.languege = Settings.Languege.En;
        TwitterSetting.enableAdditionalInfo = true;

        TweetUtil tu = new TweetUtil();
        StringAssert.AreEqualIgnoringCase(
            "\"#ARCAIC_DEATH_BRINGER " + Settings.version + " / Sies Reached 1Boss! (UsedContinue) Score:999,999 ITEM:+123 ElmMult:1.23 Orb:1 \"",
            tu.Tweet(TweetUtil.Progress.St1boss, true, Player.NewGamePlayerBase.Chara.Sies, 999999, 123, 1.23f, 1, "hogehoge")
        );
    }
}

StringAssert.AreEqualIgnoringCase
単純なequalアサートがないっぽい? 正規表現じゃないからisMatchじゃないし、containsも含むって変だなと思ったのでAreEqualIgnoringCaseにした。

完成! あと残作業

ヤッタネ!

  • C97版で画面遷移など整理しなおす予定なので正式な実装箇所にはまだ載せられない…
  • 設定画面で
    • sstwitter.exe 設定画面呼び出し
    • ツイート許可設定
      • twitter-config.xmlの存在を検知して設定変更 可/不可 を制御
    • 詳細を書く設定
  • ゲームオーバー処理でツイートする

うん、完成といえないのでは?