FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Unity
カテゴリー「Unity」の記事一覧

【Unity】インスペクタの値を保持したまま変数をリネームする  


 最近は色々なオープンソーズを利用しているのだが、時折アップデートしたらプロジェクトが破壊されることもある。その1つがインスペクタの参照だろうか?

 残念ながら、インスペクタに設定されていたフィールド名を変えると、参照が外れることはよくあることだ。これが大量にあったら・・・まぁ、まともに動かなくなることは想像できるだろう(笑)。

 これは FormerlySerializedAs というものを使えば、回避できるのだが、微妙に凡例が長かったり、必要なものが欠けてたりと、ちょっとわかりずらいと思ったので、もっと簡単な例をメモ代わりに書いておこうと思った。

FormerlySerializedAsAttribute(公式マニュアル)

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



■簡単な手順

 例として、ボタンの参照しているフィールドを

[SerializeField] private Button hogeButton;
 ↓
[SerializeField] private Button _hogeButton;


のように変更したいとする。インスペクタの表示名は変わらないが(hogeButton, _hogeButton, m_hogeButton などはコード内では別物だが、インスペクタでの表示は同じになる)、普通にリネームすると、これまで設定していたボタンへの参照が外れる。これをそのまま保持してリネームしたいという感じだ。

1.「using UnityEngine.Serialization;」をファイルの先頭に追加する。

2.[FormerlySerializedAs] の属性を加え、現在のフィールド名(変更前の名前)を入れる。

using UnityEngine.Serialization;

public class Example : MonoBehaviour
{
[FormerlySerializedAs("hogeButton")]
[SerializeField] private Button hogeButton;
}


3.フィールド名をリネーム(リファクタリング)して、一旦、シーンを保存する(プレファブ化してるものは個々に保存[Override]しておく)

using UnityEngine.Serialization;

public class Example : MonoBehaviour
{
[FormerlySerializedAs("hogeButton")]
[SerializeField] private Button _hogeButton;
}


4.インスペクタで値が保持されているのを確認できたら、FormerlySerializedAs 属性や using は削除しても良い(※複数から参照しているときは注意)。

using UnityEngine.Serialization;

public class Example : MonoBehaviour
{
[SerializeField] private Button _hogeButton;
}


 まぁ、それでも大量にあったら大変だけどね。できればリリース後は、public なものや過去のリソースに影響を与える変更は、極力控えて貰いたいなぁ・・・(バグとかクリティカルなものならともかく・・・ただの命名規則の変更で無駄に時間とられるのは勘弁・・・)。|||orz


(参考)
FormerlySerializedAsAttribute(公式マニュアル)
PrefabやSceneのSerializeされた変数の値を保持したままリネームする
FormerlySerializedAs(テラシュールブログ)






(関連記事)
【C#】【Unity】enum 型と string, int 型の相互変換など
【Unity】【C#】インスペクタでの UnityEvent のコールバック登録の有無を調べる


スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング 
tb: 0   cm: --

【Unity】ライティングのデフォルト設定 メモ  


 最近はシェーダーやライティングなどの仕様変更が多い気がするので、ちょっと過去のバージョンのデフォルト状態との比較が必要になったのでメモ。

 私は Unity は4時代からいじり始めてるが(といっても、もう4のプロジェクトは動かないので、少なくとも5にアップグレードしてあるが)、作り始めたバージョンの状態を引き継いでいるものが多いので、メジャーアップデートで見た目などが変わってしまうことがよくある。

 調べてみたら、やはり微妙にデフォルト状態が変わってるね。アップグレードしたとき、新しいバージョンで最適な設定をするためにも、デフォルト設定の一覧(キャプチャ)を資料として残しておこうと思った。


(※) Unity 5.7.1 / 2017.4.30f1 / 2018.4.5f1 / 2019.2.0f1 / Windows10(x64) で確認



■Unity 2019.2.0f1 のデフォルトライティング設定






■Unity 2018.4.5f1 のデフォルトライティング設定






■Unity 2017.4.30f1 のデフォルトライティング設定






■Unity 5.7.1 のデフォルトライティング設定








(関連記事)
【Unity】【Android】Unity2019 へのアップグレードの問題点メモ
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい
【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unity資料 
tb: 0   cm: --

【Unity】【Android】Unity2019 へのアップグレードの問題点 メモ  


 Unity2019.2.0 も出たし、そろそろ VRM Live Viewer も Unity2019 にアップグレードしたいのだが、割と大きな問題点があるなぁ…。いずれは妥協しなくてはならないかもだが、しばらくは様子見と調査が必要そうなのでメモ。



 以下、問題点など

(※) Unity 2019.1.13f1, 2019.2.0f1 / Windows10(x64) / Android 8.0 で確認


Unity2019 では Standard Shader のロジックが一部変わったらしい。Standard Shader 依存のカスタムシェーダーなどを使っている場合は、見た目が変わってしまう場合があるので注意。

【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ



Android 実機で音の感じが以前と違う。具体的には Unity2018以前は端末のエフェクト(例えばベースがシステムの設定でブーストされてたり)が入ってる感じだったが、Unity2019以降はエフェクトのかかってない状態の感じになっている。
 新しいオーディオレンダリング/ミキシングエンジンとは直接関係ないかもだが、内部システムに変更があったのかも。Windows上では変わらない。

新しいオーディオレンダリング/ミキシングエンジン (Unity2019.1)



Android でサウンド再生中(特に音楽)に、例えば何らかのWebダウンロードなど、処理に負荷がかかることをすると、ブツブツとノイズが入る(音切れする)ことがある。もしかして Unity本体の負荷に対して、サウンドエンジンが影響を受ける構造になってしまったのか(Unity2018以前は割とサウンド関連は独立したシステムとなっていたため、Unity自体がカクついても音が途切れることは無かった)?
(※) とりあえずこれは、Unity公式にバグレポートとして送っておいた。

新しいオーディオレンダリング/ミキシングエンジン (Unity2019.1)



Unity2019.2.0 において、外部APIなどでの連携が上手く行かなくなったものがある。Unity2019.3ではネイティブの構造が変わるらしいが、既に一部のネイティブの構造が変わっていて、外部からの Intent などを上手く受け取れなくなった可能性がある(外部からのバラメータが一部無視されている?)。外部APIとの連携機能を使うアプリなどは注意。2019.3 になったらネイティブ関連の不具合は色々出てきそう。

【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい
Intent



Unity2019.2.0 ではなぜか PlayerSettings で Bundle Identifer にアンダーバー(アンダースコア "_")が入力できない(バリデーションで消える?)。既にリリースしているアプリでは Bundle Identifer が変わってしまうと、別のアプリとして認識されてしまうので注意。
(※) とりあえずこれは、Unity公式にバグレポートとして送っておいた。
[8/11 追記] Unity公式から、確認(バグ再現)できたので、今後のバージョンで修正されるという旨の返信メールが来ました。いずれ修正されるでしょう。

【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない



 シェーダとサウンド関連、外部APIでのアプリ連携機能は結構問題大きいので、しばらくはまた据え置きかな…。まぁ、サウンド関連は Unity2019 の状態がこれからのデフォになりそうな気がするので、ある程度ブツブツ音切れ状態が改善されたら、諦めるしかないかもだけどね。

 とりあえず今使っている Unity2018 LTS は2年間は持つから、2020~21年くらいまでには、何らかの手段・代替案が出てくれば良いが…。とは言え、いつもながらデフォの仕様/状態が変わるのはなかなかキツいものがあるな…。なるべくこれまでのものはそのままに、自分で選択して新しい機能を使えるように設計して欲しいもんだね…(※私もその辺りは気をつけよう…)。|||orz






(関連記事)
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい
【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unity資料 
tb: 0   cm: --

【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない  


 ちょっと試しに Unity 2019.2.0f1 で Android ビルドしてみようと思ったら、以下のエラーが出た。

UnityException: Package Name has not been set up correctly
Please set the Package Name in the Player Settings. The value must follow the convention 'com.YourCompanyName.YourProductName' and can contain alphanumeric characters and underscore.
Each segment must not start with a numeric character or underscore.
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

 google翻訳にかけると以下のようになる。

UnityException:パッケージ名が正しく設定されていません
プレイヤー設定でパッケージ名を設定してください。 値は「com.YourCompanyName.YourProductName」の規則に従う必要があり、英数字とアンダースコアを含めることができます。
各セグメントは、数字またはアンダースコアで始まってはいけません。

 しかし、なぜかアンダーバー[アンダースコア]("_")を入力しても、[Enter] で確定しようとすると消えてしまう。どうやらバグのようだ。入力のバリデーションでカットされてしまってる気がする。

 既にリリースしているアプリで、アンダーバーを含むパッケージ名を持っているアプリは少し困るね。削除されてしまうと、端末では違うアプリとして認識されてしまう。

 まぁ、初期バージョンでは、不具合によく出くわすのは仕方ないけどね。だが、Android ではパッケージ名は重要な情報なので、バグFixされるまでは、しばらく Unity 2019.2 にはアップグレードしない方が良いかも知れない(※他のプラットフォームも Bundle Identifer を使うものは同じ)。



[8/11 追記]
 Unity公式のバグレポートに出しておいたら、確認(バグ再現)できたので、今後のバージョンで修正されるという旨の返信メールが来ました。いずれ修正されるでしょう。






(関連記事)
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る
【Unity】IncrementalCompiler でのエラー:Unloading broken assembly Packages/com.unity.incrementalcompiler/Editor/Plugins/Unity.PureCSharpTests.dll, this assembly can cause crashes in the runtime


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング 
tb: 0   cm: --

【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: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop