ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Unityトラブルシューティング
このページの記事一覧

【Unity】5.6 の Collider2Dは非アクティブ化で On~Exit2D イベントが発生する(5.6のコライダ2D挙動の違い)  


 これも前回同様、単なるバグっぽい気がするのだが、パッチリリースバージョン(掲載時点:5.6.0p2, p3)でも同じ挙動だったので、念のため書いておく。

(※) Unity 5.5.3p2, 5.6.0p2-p4 / Windows10(x64) で確認

 簡単に説明すると、全体を囲むような領域に何らかの Collider2D を設置し(形状は何でも良い)、その中に Collider2D を持ったオブジェクトを置いたとき、そのオブジェクトを「非アクティブ化」または「破棄(Destroy)」したとき、5.5以前では何も起こらず、5.6では OnCollisionExit2D や OnTriggerExit2D のコールバックイベントが発生するという挙動だ。ちなみに 3Dのコライダでは発生しない。以下の動画を見てみると簡単にわかるだろう。


 この挙動は「ある一定エリアから外れた場合は破棄(Destroy)し、エリア内で非表示(非アクティブ)にしたときはメモリに残す」ように作ってあったものが上手く動かなくなっていたので気づいた。つまり 5.6 では非表示にしたオブジェクトがすべて破棄されてしまい、再表示ができなくなっていた。キャッシュシステムのようなものを組んでいる場合、この挙動は気をつけておいた方が良いだろう。


 前回の 5.6.0f3 のアニメーション挙動バグ のように特定のバージョン不具合もあるようなので、特に必要性が無いならアップグレードしない方が良いかも知れない。開発中のものがあるなら、5.5.3p2 までにしておいた方が無難だろう。結構面倒臭い修正が多い。以下に参考URLを載せておこう。

(参考資料)
【Unity】「Unity5.6のわりと地雷なバグ」についての補足


(関連記事)
【Unity】5.6 のアニメーションは非アクティブ化でリセットされない(5.6のアニメーション挙動の違い)
【Unity】【C#】モバイルビルド中の警告:Game scripts or other custom code contains OnMouse_ event handlers.~ を消す
【Unity】アイコン画像のフォーマット警告:Compressed texture XXX is used as icon. This might compromise visual quality of~ を消す
【Unity】5.6 の Canvas の警告:Shader channels Normal and Tangent are most often used with lighting~ を消す
【Unity】InitializeUnityExtensions: Must have a valid path for the plugin [XX] (XX:番号) というエラーの修正方法
【Unity】"~\Temp\Assembly-CSharp.dll.mdb" is denied. と出たら…


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【Unity】5.6 のアニメーションは非アクティブ化でリセットされない(5.6のアニメーション挙動の違い)  


 これは正直マイッタ…。エラーや警告も出ず、旧機能廃止(obsolute)でもない、ロジックも合ってるハズなのに、なぜか以前のように上手く行かない…。5.5以前のものを5.6に読み込んでみたら何もおかしくないのにバグった(笑)。…と思ったらどうやら 5.6 ではアニメーションの挙動が変わってしまったようだ。Animator の継承関係も変わってるのでメソッドも違うしね。どうやら内部的に変わってしまったらしい。道理でおかしな所が無いわけだ(笑)。

(※) Unity 5.5.3p2, 5.6.0f3 / Windows10(x64) で確認

※この挙動は 5.6.0p1 以降(パッチリリース)では元に戻っている(非アクティブでアニメーションが最初からになる)。

 たぶん、他にも色々変わったところもあるだろうけど、一番困った挙動を書いておこう。それはプレファブを「インスタンス生成→非アクティブ化→再アクティブ化」したとき、アニメーションはリセットされず、終了位置のままになる点だ。以下の動画を見てみると簡単にわかるだろう。


 5.5以前ではオブジェクトを非アクティブ化するとアニメーションはリセットされ、再びアクティブ化すると初期位置からアニメーションが再生されていたが、5.6では非アクティブ化でリセットされなくなった。なので、最適化などインスタンス生成の負荷を減らすため、使い終わったオブジェクトをプールしておき、再利用するようなキャッシュシステム等は注意する必要があるだろう。アニメーションは初期位置から自動で再生されることはないので、手動でリセットする必要がある。

(元ネタ) 最適化編 オブジェクトプーリング

 例えばコードでリセットするなら以下のようにできる。

Animator animator = GetComponent<Animator>();
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
animator.Play(stateInfo.fullPathHash, 0, 0.0f); //初期位置に戻す

 他にはアニメーションファイルの設定を「ループ(Loop TIme をオン)」にしておき、アニメーションイベントなどを最後のフレームに入れ、そのイベントをスクリプトで受信して SetActive(false) で非アクティブ化する方法でも上手く行った。

 実は 5.6 って obsolue(廃止予定・非推奨)も多くなったし、実際に廃止されてエラーも出たりするのもある。またアニメーションだけでなく、他にも挙動が変わってしまったものがあるようだ(コライダやライティング、更にバグもあるらしい)。特に必要性が無いならアップグレードしない方が良いかも知れない。開発中のものがあるなら、5.5.3p2 までにしておいた方が無難だろう。結構痛い目に会うかも(笑)。以下に参考URLを載せておこう。

(参考資料)
【Unity】「Unity5.6のわりと地雷なバグ」についての補足
UnityのGameObjectを非アクティブにするとAnimatorがリセットされる挙動、その対処法


(関連記事)
【Unity】5.6 の Collider2Dは非アクティブ化で On~Exit2D イベントが発生する(5.6のコライダ2D挙動の違い)
【Unity】【C#】モバイルビルド中の警告:Game scripts or other custom code contains OnMouse_ event handlers.~ を消す
【Unity】アイコン画像のフォーマット警告:Compressed texture XXX is used as icon. This might compromise visual quality of~ を消す
【Unity】5.6 の Canvas の警告:Shader channels Normal and Tangent are most often used with lighting~ を消す
【Unity】InitializeUnityExtensions: Must have a valid path for the plugin [XX] (XX:番号) というエラーの修正方法
【Unity】"~\Temp\Assembly-CSharp.dll.mdb" is denied. と出たら…


category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【Unity】【C#】モバイルビルド中の警告:Game scripts or other custom code contains OnMouse_ event handlers.~ を消す  


 Unity5.6 で obsolute になったものも多いけど、エラーや警告もやたら出るようになったね。しかしファイル名や行番号はおろか、ある一定のビルドでしか出ない警告は非常に直しずらい。とりあえず英文を翻訳にかけて、色々試してみたら警告が消えたので記録しておく。


(※) Unity 5.6.0f3 / Windows10(x64) で確認

●コンソールログの警告
Game scripts or other custom code contains OnMouse_ event handlers. Presence of such handlers might impact performance on handheld devices.
(※) Android ビルド中に出た

●Google翻訳
ゲームスクリプトやその他のカスタムコードには、OnMouse_イベントハンドラが含まれています。 このようなハンドラが存在すると、ハンドヘルドデバイスの性能に影響を与える可能性があります。

●対処法
1.MonoBehaviour を継承した OnMouseDown() などを使っているスクリプトを探す(Visual Studio の場合「Edit>Find and Replace>Find in Files」[Ctrl+Shift+F] で探すとラク)。

2.モバイル時のビルドで除外するようにスクリプトを修正する → 例えば以下の例のようにプリプロセッサで囲んでしまうとか(または OnMouseXXX() 以外の方法にする等)。

●モバイルビルド時に OnMouseXXX() を無効にする例(プリプロセッサで囲む)
public class Sample : MonoBehaviour {
#if !UNITY_ANDROID && !UNITY_IOS
void OnMouseDown()
{
//(なんらかのコード)
}
#endif
}

 ちなみに実際に使用してなくてもプロジェクトにあるだけでも警告が出るようなので注意。私の場合アセットストアからダウンロードしたものの中にこれが含まれていたため、警告が出ていた(使用はしてない)。

 どうやら MonoBehaviour を継承した OnMouseXXX() [XXX は Down/Up/Drag など] はモバイルなどでは負荷が高いようだね。 また、このイベントハンドラはドキュメントを読むと「GUIElement」または「Collider」でクリックが取得できるとなっていて、「uGUI」では無論使えなかった。もしかしてレガシーなものになるのかもね。場合によってはこれからは使わない方が良いのかも。


(関連記事)
【Unity】アイコン画像のフォーマット警告:Compressed texture XXX is used as icon. This might compromise visual quality of~ を消す
【Unity】5.6 の Canvas の警告:Shader channels Normal and Tangent are most often used with lighting~ を消す
【Unity】InitializeUnityExtensions: Must have a valid path for the plugin [XX] (XX:番号) というエラーの修正方法
【Unity】"~\Temp\Assembly-CSharp.dll.mdb" is denied. と出たら…


category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【Unity】アイコン画像のフォーマット警告:Compressed texture XXX is used as icon. This might compromise visual quality of~ を消す  


 古いバージョンではどうかわからないけど、Unity5.6 にアップグレードしたらやたらと警告が出るようになったので、いつものようにとりあえず英文を翻訳にかけて、試してみたら警告が消えたのでこれも記録。


(※) Unity 5.6.0f3 / Windows10(x64) で確認

●コンソールログの警告
Compressed texture XXX is used as icon. This might compromise visual quality of the final image. Uncompressed format might be considered as better import option.
(※) XXX : アイコンのファイル名

●Google翻訳
圧縮テクスチャアイコンがアイコンとして使用されます。 これは、最終画像の画質を損なう可能性があります。 非圧縮形式は、より良いインポートオプションと考えられます。

●対処法
・素材のアイコン(テクスチャ)の Import Setting(プロジェクトエクスプローラで画像をクリックする)でプラットフォームを Android(iOS) に切り替え、「Override for Android(iOS)」をチェックし、Format を「RBGA 32 bit」にする。



 ちなみに Android ではアイコン画像は最大で 192x192 らしいので、「Max Size」は 256 でも十分かもね。ファイルサイズもかなり小さくなるし。iOS などではまたサイズが違うので以下に参考資料を載せておこう。

(参考)
Android,iOSアプリ用画像リソースとアイコンサイズのまとめ
Android の 2D テクスチャ オーバーライド
iOS 2D テクスチャ オーバーライド




(関連記事)
【Unity】5.6 の Canvas の警告:Shader channels Normal and Tangent are most often used with lighting~ を消す
【Unity】InitializeUnityExtensions: Must have a valid path for the plugin [XX] (XX:番号) というエラーの修正方法
【Unity】Japanese Otaku City(秋葉原モデル)のピンクテクスチャの修正方法
【Unity】"~\Temp\Assembly-CSharp.dll.mdb" is denied. と出たら…


category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【Unity】【C#】Android実機でエラーログをファイルに書き出す  


 本来なら Android 実機のエラーは「Unity Performance Reporting」(※Unity Plus/Pro 用)を使ったり、Android SDK の「DDMS」(※PCとAndroid端末をUSBで繋ぐ)を使うべきなのかも知れないが、以前「Java で書いたエラー書き出し」のような簡単なものが Unity で欲しかったので、資料を色々組合せて作ってみた。

(※) Unity 5.6.0f3 / Windows10(x64) で確認

●実機でエラーログをファイルに書き出す
using System;
using System.IO;
using UnityEngine;

/// <summary>
/// エラーログをファイルに出力する
///・空の GameObject にアタッチして使う(DontDestroyOnLoad によりシーン変更でも残る[※本来はシングルトンモデルにした方が良い])。
///・ログは内部ストレージの "Android/data/[PackageName]/files/~" に出力
///(機種によっては外部ストレージになることもあるらしい)。
///・Debug.LogError() も保存される(LogType が Error または Exception で判断する)。
///・「Build Settings」の「Development Build」「Script Debugging」オンにすれば行番号も出力できる。
/// </summary>
public class ErrorReporter : MonoBehaviour {

public string reportFileName = "error_report.txt"; //出力するファイル名(任意)
public bool addDateTime = false; //ファイル名に日時を付加する

public bool typeException = true; //Exception のスタックトレースを保存する
public bool typeError = true; //Debug.LogError() を保存する

void OnEnable()
{
//Application.RegisterLogCallback(HandleLog); //obsolute
Application.logMessageReceived += HandleLog;
}

void OnDisable()
{
//Application.RegisterLogCallback(null); //obsolute
Application.logMessageReceived -= HandleLog;
}

//ログハンドリンング
void HandleLog(string condition, string stackTrace, LogType type)
{
if ((typeException && type == LogType.Exception) || (typeError && type == LogType.Error))
{
DateTime dt = DateTime.Now;
string text = dt.ToString("[yyyy-MM-dd HH:mm:ss]")
+ "\ncondition : " + condition + "\nstackTrace : " + stackTrace.Trim() + "\ntype : "
+ type.ToString() + "\n";

string outfile = reportFileName;
if (addDateTime)
{
string file = Path.GetFileNameWithoutExtension(reportFileName);
string ext = Path.GetExtension(reportFileName); //"."を含む拡張子
outfile = file + "_" + dt.ToString("yyyyMMddHHmmss") + ext;
}

SaveText(text, Path.Combine(Application.persistentDataPath, outfile));
}
}

// Use this for initialization
void Start () {
DontDestroyOnLoad(this);
}

// テキストファイルファイル保存
public static bool SaveText(string text, string path)
{
try
{
using (StreamWriter writer = new StreamWriter(path, true))
{
writer.Write(text);
writer.Flush();
writer.Close();
}
}
catch (Exception e)
{
Debug.Log(e.Message);
return false;
}
return true;
}
}


 使い方は空の GameObject を作って、それにアタッチしておくだけでOK。DontDestroyOnLoad によりシーン変更でも残る(※本来はシングルトンモデルにした方が良い)。

 インスペクタでは「Add Date Time」がオンでファイル名に日時を付加する(例:"error_report_20170414171928.txt" のようになる)。つまり1秒単位で小分けにファイル保存することになる。

●「error_report.txt」出力例
[2017-04-14 17:24:53]
condition : IndexOutOfRangeException: Array index is out of range.
stackTrace : TestScript.ExceptionTest () (at D:/unity5/ErrorReportTest/Assets/Scripts/TestScript.cs:8)
UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:154)
UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:637)
UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:773)
UnityEngine.Events.UnityEvent.Invoke () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:52)
UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44)
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)
UnityEngine.EventSystems.EventSystem:Update()
type : Exception
[2017-04-14 17:24:56]
condition : Debug.LogError Test!
stackTrace : UnityEngine.Debug:LogError(Object)
TestScript:ErrorTest() (at D:/unity5/ErrorReportTest/Assets/Scripts/TestScript.cs:18)
UnityEngine.EventSystems.EventSystem:Update()
type : Error

(※)「Build Settings」の「Development Build」「Script Debugging」オンの時

 ログの出力場所は「Application.persistentDataPath」を使っているのでプラットフォームごとに異なるが、Android の場合、主に内部ストレージの "Android/data/[PackageName]/files/~" のようになる(機種によって微妙に異なる)。端末に付属している「マイファイル」などのアプリで覗くと良いだろう。また Android の場合、機種によっては外部ストレージになることもあるらしいので注意。以下に参考資料を載せておく。

(参考)
AndroidのpersistentDataPathがカオス
Unity,Androidのデータ保存領域まとめ

 ちなみにこのスクリプトは「Java で書いたエラー書き出し」と違い、例外捕捉のコールバックではなくて、ログ受信のコールバック「Application.logMessageReceived」となっている。なので、コールバックハンドラ:HandleLog 内の条件を修正すれば Warning なども保存できる(引数の LogType(Enum型)で判別してるだけ)。ただしあまり出力し過ぎると、ファイルが巨大になるので気をつけた方が良いだろう。

 ただ、これは Unity スクリプト内で発生したエラーしか捕捉できないので注意。OS による強制終了やグラフィックAPIなどで直接落ちたときなどにはコールバック自体が発生しないので無効になる。徹底的にログをトレースしたいのなら、冒頭に書いた「DDMS」や「Unity Performance Reporting」を使った方が良いかも知れない。ちょっとした確認用程度のものと思って欲しい。

(参考)
[Unity][Unity3d]例外発生時にコールバック関数が呼ばれる様にする方法
Unityでテキストデータを保存,取得
Androidの実機ログを調査しやすくするTips


(関連記事)
【Unity】アイコン画像のフォーマット警告:Compressed texture XXX is used as icon. This might compromise visual quality of~ を消す
【Unity】5.6 の Canvas の警告:Shader channels Normal and Tangent are most often used with lighting~ を消す
【Unity】InitializeUnityExtensions: Must have a valid path for the plugin [XX] (XX:番号) というエラーの修正方法
【Unity】"~\Temp\Assembly-CSharp.dll.mdb" is denied. と出たら…


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  C#  Unityトラブルシューティング 
tb: 0   cm: --
IS<インフィニット・ストラトス> アーキタイプ・ブレイカー
キルドヤ


プロフィール

Twitter

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop