ブログ中のDLリンク確認は完了して無効リンクの差し替えなど行いましたが、サムネ画像の差し替えがめんどくてやってない…結構な量あるよなぁ
では本題です。
RebRank製のTwitter連携ツールを使いたい
SimpleTwitterClient
https://www.rebrank.org/products/SimpleTwitterClient/
RebRankさんが公開している、ツイッターのアプリ連携を行うツールの存在を以前から知っていました。
GitHubで公開されており、MITライセンス内で使用できます。
RebRankさんのゲームはもちろん、∀kashicforceなどの他サークルの同人ゲームでも利用されているツールです。
こういうやつ
#ARCAIC_DEATH_BRINGER C97_trial_1.00 / シエスでステージ1に到達! Score:999,999
— Y_ (@Y__revSD) 2019年6月30日
エゴサってあんまりやってないんですけど、これでタグ付けツイートさせれば感想とかたどりやすくなるんじゃないかなーという目論見で、去年の体験版の時点で実装したかったのですがTwitter側の設定がわからず実装をあきらめました。
つい先日思い立って設定を見直したら連携できたのでサクッと実装してみました。
Twitter側の設定
https://developer.twitter.com/
ここでdeveloper登録する。(1年前なので覚えてない)
アカウントを作ったら、連携するアプリケーションの情報を入力します。
右上の下矢印からApp
右上のCreate an appで
アプリケーションの情報入力画面に入ります。
アプリ名はまあいいとして、
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になります。
読み違えて「ログインが必要?そりゃそうだろうな…」でチェックを入れ
「このツール使ってるゲームではこのPIN画面が出るけど、ここのURLはどうやって調べるんだ!?」と去年は必死でググり混乱を重ねていましたが、
別にチェックなしのURLなしでOKです。この画面が表示されるようになります。
入力が終わったらKeys and tokens
タブでConsumer API keys
、 Access 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敗)(最初のスペース以降すっぽ抜けた図)
— Y_ (@Y__revSD) 2019年6月30日
- 実行カレントディレクトリを知るには?
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. ゲームの進行に合わせて、Stage
かBoss
キーから単語を取得。
3. ステージ数はゲーム管理から取得してstringにする。
4. ステージ数とStage
or Boss
の単語を合成する
5. Reached
文章を取得。
6. $hennsuu
の文字列を用意したキャラ名、ステージ数に置き換え
7. シエスでステージ1に到達!
Sies reached 1Boss!
のような文字列が完成する。
追加情報をツイートに含める内容については、字数稼ぎのため英字で固定にする予定だけどハードコード脱却のためにあとで両方に同内容移すかも。
テストを書く
今までのゲーム、テストを全く書いていない
最近になって書いたほうがいいんだろうなと思いつつもゲームロジックはカウント多用や他オブジェクトとの会話が多めで書きづらいためできていない。
今回は動的な部分が少ないので、導入するきっかけにできた。
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にした。
完成! あと残作業
#ARCAIC_DEATH_BRINGER C97_trial_1.00 / Sies reached 1Boss! (UsedContinue) Score:999,999 ITEM:+123 ElmMult:1.23 Orb:1
— Y_ (@Y__revSD) 2019年6月30日
ヤッタネ!
- C97版で画面遷移など整理しなおす予定なので正式な実装箇所にはまだ載せられない…
- 設定画面で
- ゲームオーバー処理でツイートする
うん、完成といえないのでは?