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

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

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の存在を検知して設定変更 可/不可 を制御
    • 詳細を書く設定
  • ゲームオーバー処理でツイートする

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