Unity Android で Twitter に投稿する
Unity Android から Twitter に投稿するために、Android プラグインを書いた。
概要
- Android Plugin 開発環境を整える
- Twitter に投稿するプラグインを書いて jar 化する
- jar を Unity にインポートして、プラグインを呼び出す
環境
- Android 6.0.1
- Unity 5.3.1p3
手順
Android Plugin 開発環境を整える
調べたらいろいろ見つかるので、好きな方法で整える。
- 参考 1: AndroidStudioを使ってUnityとAndroidの連携 - ほげほげ(仮)
- 参考 2: Create An Android Plugin For Unity Using Android Studio | The Game Contriver
好みの問題で、以下のようにする。
- aar よりも jar を使う
- Android Application プロジェクトを Android Library プロジェクトに変換するよりも、Android Application プロジェクトの中に Android Library モジュールを作る
やることは、以下のとおり。詳細は、参考 1 & 2 に丁寧に書いてくれている。
- 空の Android Studio プロジェクトを作成する
- File > New > Module から、Android Library モジュールを作成する
- Gradle で Unity の jar を import する
- Gradle タスクで jar を export する
注意点
Unity 5.3.1 では classes.jar の場所が以下に変わっていた。
/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar
ので build.gradle の dependencies は以下のような感じにした。
build.gradle (抜粋)
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile files('/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
}
Twitter に投稿するプラグインを書く
さくっと書く。
DDDTwitter.java
package com.kakeragames.dddtwitter;
import android.app.Activity;
import android.content.Intent;
import com.unity3d.player.UnityPlayer;
public class DDDTwitter {
public void post(String message) {
Activity currentActivity = UnityPlayer.currentActivity;
Intent tweet = createTweetIntent(message);
tweet.setPackage("com.twitter.android");
if (tweet.resolveActivity(currentActivity.getPackageManager()) != null) {
currentActivity.startActivity(tweet);
return;
}
Intent share = createTweetIntent(message);
currentActivity.startActivity(share);
}
private Intent createTweetIntent(String message) {
Intent tweet = new Intent();
tweet.setAction(Intent.ACTION_SEND);
tweet.putExtra(Intent.EXTRA_TEXT, message);
tweet.setType("text/plain");
return tweet;
}
}
Twitter 公式クライアントがあれば、それ目掛けて Intent を投げる。 無ければアプリ一覧を開く。という感じにした。
アプリ一覧に、Twitter クライアント以外は表示したくない
という場合は、自分で Intent.createChooser
したら良い。
スクリーンショットを投稿したい
という場合は、Intent にファイルの URI を追加することになる。
ただし、ファイルが Intent を受け取る側のアプリから読み取りできる必要があるので、次のいずれかの方法をとることになる。
- ファイルを ExternalStorage に保存する
- FileProvider を使って読み取り可能な URI を渡す
プラグインを書き出す
Gradle タスクでさくっと書き出す。
build.gradle (抜粋)
task deleteJar(type: Delete) {
delete 'release/dddtwitter.jar'
}
task exportJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
rename('classes.jar', 'dddtwitter.jar')
}
exportJar.dependsOn(deleteJar, build)
プラグインを Unity にインポートする
Assets/<WHATEVER_YOU_LIKE>/Plugins/Android/dddtwitter.jar
に追加する。
プラグインを呼び出す
DDDTwitter.cs
using UnityEngine;
public class DDDTwitter
{
public void Post(string message)
{
using (var dddTwitter = new AndroidJavaObject("com.kakeragames.dddtwitter.DDDTwitter"))
{
dddTwitter.Call("post", message);
}
}
}
using ブロックについては、Unity の API リファレンスのサンプル では使っていないので、使わなくても良いのかもしれない。 AndroidJavaObject は IDisposable を実装しているためか、using を使うサンプルが多いので、右に倣えしている。
まとめ・感想
Android プラグインを書けば、ネイティブの機能で Twitter に投稿することも簡単にできる。 とは言っても、まだテキストだけしか渡していないので、序の口である。