FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Unityリファレンス
このページの記事一覧

【Unity】【Android】自動バックアップの対象/除外設定をする  


 Android には自動でアプリのデータをバックアップしてくれる機能がある(Googleアカウントで Google Drive に保存される。無料で提供され、バックアップ データはユーザーの容量にはカウントされない)。デフォルトではオンになっていて、少なくとも Unity2017 の頃は何もしなくても入っていたのだが、Unity2018 以降ではマニフェストには入ってないようだ。まぁ、入って無くても、通常はオンとして扱われるハズだが、Android もバージョンアップするごとにセキュリティ関連が強化・仕様変更されているので、手動で設定する方法も覚えていた方が良いかも知れない。

アプリの自動バックアップがシンプルに
自動バックアップでユーザーデータをバックアップする

 また、自動バックアップはデータが 25MB までらしいので(掲載時点)、必要なものとそうでないものを分けておいた方が良いだろう。その方法も書いておく。というより、気がついたら半年以上バックアップとられてなかったので、調べてみたらサイズオーバーで止まっていたという状態だった。なので、自分で設定しておく必要性を感じたんだけどね(笑)。

 ちなみにバックアップがとられるデータはデータベース、共有プリファレンス、アプリケーションのプライベート ディレクトリ内のその他のコンテンツで、キャッシュ用のデータは除外されるらしい(Unity での場合、Application.persistentDataPathPlayerPrefs はバックアップされ、Application.temporaryCachePath はバックアップされないと考えて良い)。

 特に画像や動画、サウンドデータ、3Dモデルなどはあっという間に 25MB を超えるので、バックアップ対象からは除外しておいた方が良いだろう(要するにメディア本体はバックアップせず、URIやメタデータなど、復元に必要な情報だけバックアップ対象にするしかない→アプリ側でその情報からメディア本体をサーバからダウンロードして復元するなど)。


(※) Unity 2018.4.4f1 / Android 8.0 で確認



■AndroidManifest.xml での自動バックアップ設定

 自動バックアップを設定する AndroidManifest.xml のタグは application タグである。Unity の場合、「Assets/Plugins/Android/」フォルダ以下に AndroidManifest.xml が置かれるので、それを適当なテキストエディタで開き、application タグ を見つけて、「android:allowBackup="true"」を入れておく(オンの場合。オフにしたいなら false)。


 もし、プラグインなど全く使ってないのなら、デフォルトでは AndroidManifest.xml は用意されていないので、フォルダを含めて自分で作る必要がある。テンプレは Windows の場合「(インストールした Unity のフォルダ)\Editor\Data\PlaybackEngines\AndroidPlayer\src\com\unity3d\player」にあり、Mac の場合「(アプリケーションフォルダ)/Unity.app/Contents/PlaybackEngines/AndroidPlayer/src/com/unity3d/player 」にあるので、コピーして手を加えれば良いだろう。詳細は公式マニュアルを参照して欲しい。

Android 用のプラグインをビルド

 ここでは簡略した例を書いておこう。

●AndroidManifest.xml に allowBackup="true" を入れ、自動バックアップを明示的にオンにする
<?xml version="1.0" encoding="utf-8"?>
<manifest ~(中略)~
<application ~(中略)~ android:allowBackup="true">
~(中略)~
</application>
</manifest>

 なお、単純に allowBackup="true" にすると問題が出る機能もあるので、以下の記事も参考にして欲しい。例えば、gcm(プッシュ通知)などを使っている場合後述する除外設定をしておかないと通知が来なくなるという問題も出るようだ(端末ごとに一意のIDのようなものが必要な場合、バックアップから除外しておかないと不具合の原因になり、セキュリティ的にも良くない)。

Android M AutoBackup機能で開発者が対応しておいた方がよいことまとめ
allowBackupの設定は適切ですか?
allowBackup が true のときに Application Class が呼ばれないことがあって困った話



■バックアップ対象/除外を指定する

 バックアップの対象/除外を設定するにはマニフェストの他に、xml ファイルを作る必要がある。xml ファイルはテキストファイルなので、適当にファイルを作って、拡張子を「.xml」にしておけば良い。ただし、Android の仕様上、「Assets/Plugins/Android/res/xml/」フォルダ直下に置いておかないといけない。またテキストエンコードは UTF-8 にしておく。


 以下は簡略した AndroidManifest.xml での書き方である。前述の例に対して「android:fullBackupContent="@xml/my_backup_rules"」を追加しただけだが、値の「@xml」が xml フォルダを表し、「my_backup_rules」がファイル名の my_backup_rules.xml に対応している(リソース用のフォルダ名は以下を参照)。

リソースの提供 - リソースタイプをグループ化する

●AndroidManifest.xml にバックアップ対象/除外指定ファイルを設定する
<?xml version="1.0" encoding="utf-8"?>
<manifest ~(中略)~
<application ~(中略)~ android:allowBackup="true" android:fullBackupContent="@xml/my_backup_rules">
~(中略)~
</application>
</manifest>

●バックアップ対象/除外指定ファイル「my_backup_rules.xml」(※名前は任意:マニフェストに合わせる。内容は適当)
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="gcm"/>
<include domain="file" path="."/>
<exclude domain="file" path="Thumbnails"/>
<include domain="database" path="."/>
<exclude domain="database" path="local_secrets.db"/>
</full-backup-content>

 「include」は含む(※ただし、書いてないものは含まない)、「exclude」は除外(include の中から除外という感じ)となる。

 上記の例は適当なものなので、自分の環境によって書き換えて欲しいが、簡単に言えば「PlayerPrefs をバックアップ対象にするが、gcm(プッシュ通知のIDみたいなもの)は除外、files フォルダも対象とするが、「Thumbnails」以下は除外、データーベースも対象とするが、local_secrets は除外」といった感じだ。path の値は適当に置き換えて欲しい。

 それ以外には「root」(アプリプライベートフォルダ)「external」(外部ストレージ)などもあり、Android 9.0 以降なら「暗号化したもののみバックアップ」のようなこともできるらしいが、その辺りは公式マニュアルを参考にして欲しい。

Back up user data with Auto Backup - XML config syntax
Back up user data with Auto Backup - Define device conditions required for backup



 なお、バックアップを確認するには以下の adb を使う方法、または、単純にスマホの設定画面から「Google>バックアップ」で「今すぐバックアップ」ボタンを押せばバックアップできる。しかし、以前のデータがあったりすると(特に 25MB 超えてたりすると)上手く行かないようなので、なるべく初期段階で設定しておいた方が良いかも知れない(既に自動バックアップされなくなったアプリを再び対象にする方法がググっても見つからないんだよね…なぜかバックアップ削除してもダメなものあるし…|||orz)。





(関連記事)
【Unity】PlayerPrefs, persistentDataPath, temporaryCachePath の保存場所(パス)一覧表
【Unity】Firebase のプッシュ通知と FantomPlugin の共存(Firebase と他のプラグインの共存方法)
【Unity】Android アプリでパーミッション(権限)要求をする
【Unity】AssetStore版 FantomPlugin のセットアップ


スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityプラグイン  Unityリファレンス 
tb: 0   cm: --

【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧  


 以前「Windows日本語キーボードでのKeyCodeにはバグがある」みたいな記事を見たことがあったが、Unity4 時代の頃からなので、単純にキーボードによる違いと考えて、改めて確認した。特に記号の KeyCode が公式マニュアルとは少し違うので、簡単な一覧表としてまとめてみた。

[Unity]KeyCodeについて


(※) Unity 2018.4.4f1 / Windows10 (x64) で確認



■Windows 日本語キーボードでの記号の KeyCode 一覧

 基本的には公式マニュアルで十分なので、ここでは記号のみで、日本語キーボードでは見た目が違うものがわかるように挙げておこう。ショートカットキーみたいなものを作るときに、ちょっと困ったりするんだよね(笑)。

KeyCode(公式マニュアル)

●Windows 日本語キーボードでの記号の KeyCode 一覧

キーKeyCode備考
-Minus 
^Quoteキャレット
Backslash右[Shift]隣の[\_ろ]と同じになる。
[LeftBracket 
]RightBracket 
@BackQuoteアットマーク
;Equalsセミコロン
:Semicolonコロン
,Commaカンマ(コンマ)
.Periodピリオド(ドット, ポイント)
/Slashスラッシュ
Backslashバックスラッシュ。[Backspace]隣の[¥|]と同じになる。
ClearDeleteテンキー[Clear]。[Delete]と同じになる。
PrtScnSysReqPrint Screen
MenuMenu右[Ctrl]隣のメニューキー
WindowsキーLeftCommandWindowsアイコンのキー

※[Shift]キーを押さない状態。
※テンキー(Keypad~)は公式マニュアルとほぼ変わらないので割愛([Clear]のみ)。



■KeyCode をリアルタイムで調べるコード

●KeyCode をリアルタイムで調べる
using System;
using UnityEngine;

public class KeycodeTest : MonoBehaviour { //※クラス名は任意

Array keyCodes = Enum.GetValues(typeof(KeyCode));

// Update is called once per frame
private void Update () {
if (Input.anyKeyDown) //※KeyDown のみ
{
foreach (KeyCode key in keyCodes)
{
if (Input.GetKeyDown(key))
{
Debug.Log(key);
}
}
}
}
}

 内容的には KeyCode の列挙型の一覧(※Array 型)を何らかのキーが押された時(Input.anyKeyDown)に調べているだけだ。ここでは KeyDown (押下した瞬間)を使っているので、押してる間ずっとにしたいなら Input.GetKey を使っても良いだろう。

 Unity の場合、記号は使っているキーボードによって値が変わる可能性があるから(Mac 上では大丈夫と記事にあるが)、あまり使わない方が良いのかもね(笑)。

Array Class
Enum.GetValues(Type) Method
Input.anyKeyDown
Input.GetKey





(関連記事)
【C#】【Unity】enum 型と string, int 型の相互変換など


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  C# 
tb: 0   cm: --

【Unity】PlayerPrefs, persistentDataPath, temporaryCachePath の保存場所(パス)一覧表  


 ただのチートシート。公式マニュアルにも書いてあるのだが、ちょっと見づらいので、表にして楽に確認したかっただけ(笑)。

 ただし、iOS, Mac についてはマニュアルや資料からの抜粋のみ。また、iOS, Mac はバージョンによって結構変わるみたいなので、最新情報をググった方が良いかも知れない。


(※) 掲載時点:Unity 2018.4.1f1 / Windows10 / Android 8.0 / iOS, Mac はマニュアル・資料から抜粋



■PlayerPrefs の保存場所(パス)

(マニュアル)
PlayerPrefs

●PlayerPrefs 保存場所 一覧
Android/data/data/[pkg-name]/shared_prefs/[pkg-name].xml
iOS~/Library/Preferences/[bundle identifier].plist
Windows[レジストリ]
(ランタイム) HKCU/Software/[company name]/[product name]
(エディタ) HKCU/Software /Unity/UnityEditor /[company name]/[product name]
Mac~/Library/Preferences/unity.[company name].[product name].plist
Windows Store App%userprofile%/AppData/Local/Packages/[product name]/LocalState/playerprefs.dat
Windows Phone 8(ランタイム) <main drive>:/Users/<user name>/AppData/Local/Packages/<package id>/LocalState
(エディタ) <your project path>/LocalState
Linux~/.config unity3d[CompanyName]/[ProductName]
WebGLブラウザーの IndexedDB API

※[company name], [product name], [bundle identifier], [pkg-name](パッケージ名:bundle identifier) は Build Setting のもの。
※iOS, Mac はバージョンによって結構変わるみたいなので、最新情報をググった方が良いかも知れない。

 ちなみにネイティブ(Java)ではもう少し細かくファイルが分かれる。必要なら以下の記事を参考にして欲しい。

Preference 機能を使って設定データを読み込み・保存する



■Application.persistentDataPath の保存場所(パス)

(マニュアル)
Application.persistentDataPath

●Application.persistentDataPath 保存場所 一覧
Android/data/data/[pkg-name]/files
iOS/Application/<guid>/Documents
Windows<main drive>:/Users/<user name>/AppData/LocalLow/[company name]/[product name]
Mac~/Library/Application Support/[company name]/[product name]
Windows Store App%userprofile%/AppData/Local/Packages/[ProductPackageId]/LocalState

※[company name], [product name], [bundle identifier], [pkg-name](パッケージ名:bundle identifier) は Build Setting のもの。
※iOS, Mac はバージョンによって結構変わるみたいなので、最新情報をググった方が良いかも知れない。



■Application.temporaryCachePath の保存場所(パス)

(マニュアル)
Application.temporaryCachePath

●Application.temporaryCachePath 保存場所 一覧
Android/data/data/[pkg-name]/cache
iOS~/Application/<guid>/Library/Caches
Windows<main drive>:/Users/<user name>/AppData/Local/Temp/[company name]/[product name]
Mac/var/folders/<id>/<guid>/T/[company name]/[product name]

※[company name], [product name], [bundle identifier], [pkg-name](パッケージ名:bundle identifier) は Build Setting のもの。
※iOS, Mac はバージョンによって結構変わるみたいなので、最新情報をググった方が良いかも知れない。



(マニュアル)
PlayerPrefs
Application.persistentDataPath
Application.temporaryCachePath

(参考)
Unityのリソース保存パス
unityのプラットフォームによるデータの保存パス
unityでplatformによって取得できるパス





(関連記事)
【Unity】オブジェクト(クラス・構造体)、配列、リスト、辞書をJSONでPlayerPrefsに保存する
【Unity】【C#】テキストファイルの読み書きをする(リソース/ストレージ)
【Android】【Java】Preference 機能を使って設定データを読み込み・保存する
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス 
tb: 0   cm: --

【Unity】【C#】RectTransform の矩形の実座標を取得する  


 ちょっとパネルのドラッグ機能を付けたときに必要だったので、備忘録的にメモ。


 特にスマホなどは解像度によって見た目の大きさと実際のピクセルサイズが違うので、動的に取得する必要があった。調べたらすぐにわかったが、視覚的な解説が無かったので、簡単に書いてみた。

(※) Unity 2018.2.1f1 / Windows10(x64) で確認


●RectTransform の矩形の実際の座標を取得する
using UnityEngine;

public class Sample : MonoBehaviour {

public RectTransform target;

//RectTransform の矩形の実座標を Rect にして返す
public Rect GetRect(RectTransform rt)
{
Vector3[] corners = new Vector3[4];
rt.GetWorldCorners(corners);
return new Rect(corners[0], corners[2] - corners[0]);
}

//Rect 型にして、左下-右上座標を表示
void DisplayRect()
{
Rect rect = GetRect(target);
Debug.Log("(" + rect.xMin + ", " + rect.yMin + ") - ("
+ rect.xMax + ", " + rect.yMax + ")");
}

//4コーナー(左下, 左上, 右上, 右下)座標を表示
void DisplayCorners()
{
Vector3[] corners = new Vector3[4];
target.GetWorldCorners(corners);

for (var i = 0; i < 4; i++)
{
Debug.Log("corners[" + i + "] : " + corners[i]);
}
}

// Use this for initialization
private void Start () {
if (target == null)
target = GetComponent();

DisplayCorners();
DisplayRect();
}
}

corners[0] : (460.0, 240.0, 0.0)
corners[1] : (460.0, 480.0, 0.0)
corners[2] : (820.0, 480.0, 0.0)
corners[3] : (820.0, 240.0, 0.0)
(460, 240) - (820, 480)

 RectTransform.GetWorldCorners() は画面の左下を(0, 0)、右上が解像度の最大座標として、[0]:左下, [1]:左上, [2]:右上, [3]:右下 の座標を返す。


 この例では Canvas の設定が「Canvas Scaler」で「UI Scale Mode>Scale With Screen Size」, 「Reference Resolution>800x600 となっていて、パネルのサイズは 300x200 となっている。また、画面解像度は 1280x720 になっているときの値だ。


 ちなみに画面解像度を 2560x1440 にすると以下の値となる。
corners[0] : (920.0, 480.0, 0.0)
corners[1] : (920.0, 960.0, 0.0)
corners[2] : (1640.0, 960.0, 0.0)
corners[3] : (1640.0, 480.0, 0.0)
(920, 480) - (1640, 960)

 また、DisplayCorners() は公式のサンプルそのものだが、ちょっと手を加えて Rect 型で返す関数を GetRect() としても定義しておいた。矩形領域だけなら [0]:左下 - [2]:右上 の座標だけでも十分なことも多いからだ。


 冒頭に書いたパネル上での使用方法は、パネルをロックしたときに、パネル外ではカメラ回転、パネル内では無視するために座標を取っている(パネル上でマウスでカーソル合わせたりして、動かすたびにカメラが回転するのは鬱陶しいので(笑))。

 私はエクスプローラからのファイルドラッグ&ドロップにも対応しているが、UIの矩形座標を取れば、ドロップした先で処理を分岐するのも可能だろう。色々使える気がする(笑)。






(関連記事)
【Unity】【C#】uGUI ドロップダウンの要素をコードで設定と取得、外観のカスタマイズなど
【Unity】VRM(VRoid)をライブステージで踊らせるアプリを作ってみた


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  C# 
tb: 0   cm: --

【Unity】【C#】テキストファイルの読み書きをする(リソース/ストレージ)  


 Unity では内部リソースからテキストファイルを読み込む方法が非常に簡単に用意されているが、それとは別に外部のリソース(ストレージ等)でテキストファイルを読み書きする方法も書いておこう。

 またついでに Android でプラグインを利用して読み書きする方法も紹介しておく。ちなみに Unity から C# で直接 SDカードに書き込もうとすると、アクセス拒否で失敗するが、プラグインを利用する場合は、SDカードにも書き込むことが可能だ。エクスプローラみたいなファイル選択も使えるので、ユーザーが自由にファイルの読み書きを行えるようなシステムを作るには役に立つだろう。

 ここでは C# スクリプト例はインスタンスメソッドとして書いておくが、static なライブラリとして利用したいなら、例外処理を throw などすれば良いと思う。とりあえず簡単な実装を書いておこう。自由に改造でもして使って欲しい。


(※) Unity 5.6.3p1 - 2018.1.8f1 / Windows10(x64) で確認



■リソースからテキストアセットを読み込む(Unity ビルトイン機能)

 ここでは Unity の機能を使って、アプリに内包したテキストファイルを読み込んでみよう。

 これは Unity のエディタ上であらかじめリソースとして持っておき、ランタイム時にロードする方法だ。Unity では「Resources」というフォルダを作っておくと、起動後にリソースとしてテクスチャやデータなどを読み込むことができる。ここにテキストファイルを置いておけば、「TextAsset」として簡単に扱える。それを利用して読み込んでみよう。

●リソースからテキストアセットを読み込む(メソッド定義)
using UnityEngine;
using UnityEngine.UI;

public string textAssetName = "Texts/テスト"; //拡張子はいらない
public Text displayText; //表示するUI-Text

//リソースからテキストアセットを読み込む
void LoadTextAsset(string name)
{
if (string.IsNullOrEmpty(name) || displayText == null)
return;

TextAsset textAsset = (TextAsset)Resources.Load(name, typeof(TextAsset));
if (textAsset != null)
displayText.text = textAsset.text;
else
Debug.Log("Not found TextAsset : " + name);
}

●使用例(メインでのコードなど)
using UnityEngine;

//ロードボタンのコールバックハンドラ
public void OnLoadTextAsset()
{
LoadTextAsset(textAssetName);
}

 読み込み先テキストには UI-Text(displayText)を用いているが、もちろん string 型の引数のメソッドを作って直接読み込んでも良い。これはあくまでも例なので、その辺りは用途に応じて書き換えて欲しい。

●「Resources」フォルダを作り、その配下にテキストファイル(UTF-8)をインポートしておく。

 テストするには UI-Button などを適当に配置し、「Button」の「OnClick()」にスクリプトの「OnLoadTextAsset()」を登録すれば良い。





●「テスト用スクリプトのアタッチ例


●ファイルの内容は任意(UTF-8)

※ランタイム時にログを見るにはプラグインライブラリのプレファブ「DebugConsole」をシーンに置き、コード中の Debug.Log() を XDebug.Log() に置き換えて下さい。また、インスペクタで「displayText」に「DebugConsole」以下の「Text」を登録します。



■ローカルストレージなどでテキストファイルの読み書きをする(C# スクリプト)

 次にパス(ファイル名)を指定してテキストファイル(UTF-8)を読み書きすることをやってみよう。

 例ではフォルダ(ディレクトリ)に「Application.persistentDataPath」を使っているが、これはプラットフォームによって変わるデフォルトの永続的な保存先となる。また、会社名(company name)やアプリ名(product name)でもフォルダ分けされる。詳しくは公式マニュアルで確認して欲しい。

(参考)Application.persistentDataPath

●ローカルストレージなどでテキストファイルの読み書きをする(メソッド定義)
using System;
using System.IO;
using System.Text;

//テキストをファイルから読み込む(行読み)
//※Android で SD カードから読み込みをするには、「AndroidManifest.xml」にパーミッション("READ_EXTERNAL_STORAGE" または "WRITE_EXTERNAL_STORAGE")が必要。
string LoadText(string path)
{
StringBuilder sb = new StringBuilder(1024); //※capacity は任意

try
{
using (StreamReader reader = new StreamReader(path))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
sb.Append(line).Append("\n");
}
}
}
catch (Exception e)
{
Debug.Log(e.Message);
return null;
}

return sb.ToString();
}

//テキストをファイルに保存
//※Android で External Storage に書き込みをするには、「AndroidManifest.xml」にパーミッション("WRITE_EXTERNAL_STORAGE")が必要。
//※セキュリティ上、Unity から直接 SD カードには保存できない。
bool SaveText(string text, string path)
{
try
{
using (StreamWriter writer = new StreamWriter(path))
{
writer.Write(text);
writer.Flush();
writer.Close();
}
}
catch (Exception e)
{
Debug.Log(e.Message); //Access to the path "filename" is denied. → パーミッションが無い, 書き込みアクセス不可(SDカードなど)
return false;
}
return true;
}

●使用例(メインでのコードなど)
using UnityEngine;
using UnityEngine.UI;

public string filename = "test.txt";
public Text displayText; //表示するUI-Text

//ロードボタンのコールバックハンドラ
public void OnLoadClick()
{
if (string.IsNullOrEmpty(filename) || displayText == null)
return;

string path = Path.Combine(Application.persistentDataPath, filename); //プラットフォームによってパスは異なる

if (!File.Exists(path))
{
Debug.Log("Not found : " + path);
return;
}

string text = LoadText(path);
if (!string.IsNullOrEmpty(text))
displayText.text = text;
}

//セーブボタンのコールバックハンドラ
public void OnSaveClick()
{
if (string.IsNullOrEmpty(filename) || displayText == null)
return;

string path = Path.Combine(Application.persistentDataPath, filename); //プラットフォームによってパスは異なる

if (SaveText(displayText.text, path))
Debug.Log("Save to : " + path);
}

 テストするには UI-Button などを適当に配置し、「Button」の「OnClick()」にスクリプトの「OnLoadClick()」「OnSaveClick()」をそれぞれ登録すれば良い。
●UI-Button 配置とテスト用スクリプトのアタッチ例

●UI-Button のコールバック登録例

 読み書きするテキストには UI-Text(displayText)を用いているが、もちろん string 型の引数のメソッドを作って直接読み書きしても良い。これはあくまでも例なので、その辺りは用途に応じて書き換えて欲しい。

 なお、Android でSDカードに読み書きする場合は以下のパーミッションが必要になる。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />'

 パーミッションについての説明が必要なら以前の記事を参照して欲しい。


※ランタイム時にログを見るにはプラグインライブラリのプレファブ「DebugConsole」をシーンに置き、コード中の Debug.Log() を XDebug.Log() に置き換えて下さい。また、インスペクタで「displayText」に「DebugConsole」以下の「Text」を登録します。



■Android でファイル選択+テキストファイルの読み書きをする(プラグイン利用)

 ついでにプラグインに入っている「StorageLoadTextController」と「StorageSaveTextController」(~/FantomLib/Prefabs/System/ 以下。検索で探すと簡単)というテキストファイル読み書きの機能を使ってみよう。これら「~Controller」は Android 標準のファイル選択機能を使い、テキストファイルを読み込み・書き込みをしてくれるものだ。これら機能はプラグイン内部に実装されているので、自分でコードを書く部分は、機能呼び出しと結果受け取りだけで良い。

 ではまず、その機能呼び出しと結果受け取りのコードだけ書いてしまおう。名前は任意で良い。これらは各「~Controller」や UI-Button のコールバックハンドラとなる。

●コールバックハンドラ例(メインでのコードなど)
using UnityEngine;
using UnityEngine.UI;
using FantomLib;

public Text displayText; //表示するUI-Text

//読み込んだテキストを UI-Text に表示する
public void OnStorageLoad(string text)
{
if (string.IsNullOrEmpty(text) || displayText == null)
return;

displayText.text = text;
}

public StorageSaveTextController storageSaveTextController; //※インスペクタで登録

//UI-Text のテキストをファイルに保存する
public void OnStorageSave()
{
if (displayText == null || string.IsNullOrEmpty(displayText.text)) //※空は保存しない場合
return;

if (storageSaveTextController != null)
storageSaveTextController.Show(displayText.text);
}

//エラーステータス用コールバックハンドラ
public void OnError(string message)
{
Debug.Log(message);
}

 あとはヒエラルキーに「StorageLoadTextController」と「StorageSaveTextController」(~/FantomLib/Prefabs/System/ 以下。検索で探すと簡単)を置き、UI-Button など(※名前は任意)を Canvas に配置したら、インスペクタでコールバックを設定するだけだ。

●「StorageLoadTextController」と「StorageSaveTextController」を置く。テスト用スクリプトのアタッチ例。

●スクリプト(TextFileTest)へコールバック登録する
※または、StorageLoadTextController.OnResult に直接 UI.Text.text を登録しても良い。

●UI-Button から機能呼び出しをする


 あとはビルドするだけだが、プラグインを含む場合のビルドは「AndroidManifest.xml」が必要になる。その辺りは以前の記事にまとめてあるので参照して欲しい。もちろん「Build Settings...」にシーンを追加するのを忘れずに。

●ファイルの内容は任意(UTF-8)

※ランタイム時にログを見るにはプラグインライブラリのプレファブ「DebugConsole」をシーンに置き、コード中の Debug.Log() を XDebug.Log() に置き換えて下さい。また、インスペクタで「displayText」に「DebugConsole」以下の「Text」を登録します。


※この記事のUnityアセットはプラグインとして配布されています。


※とりあえず試してみたい方は、最新版をビルドした apk デモをダウンロードできます。動作確認にもどうぞ。


プラグインデモをダウンロード
(Google Drive を利用)


Android 4.2以上
※「提供元不明アプリのインストール」許可が必要です。






(関連記事)
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  Unityプラグイン  C# 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop