Cooooding!!

Unity(C#)を使ったゲーム開発関連Tipsなど

Unity2019に移行して発生したトラブルとその対処【Unity】

概要

これまでUnity2018.4で作っていたプロジェクトをそろそろ2019.1に乗り換えようと思い移行してみたところいくつかトラブルが発生しました。そのトラブル内容と対処内容をメモしておきます。

トラブル

1. prefabがおかしくなった

prefabに付けた自作のコンポーネントのSerializeFieldに保存していた値の一部が何故か初期値に戻っていました。Nestして配置した先やProjectViewで選択してInspectorを見ると初期値に戻っていますが、ダブルクリックして編集画面を開くと何故か正しい値が保存されている奇妙な状態になっていました。

これはUnityを再起動しても直りませんでしたが、Libraryフォルダを削除してから再起動したら直りました。

2. UnityEngine.Vector3.magnitudeの計算結果が微妙に変わった

これは計算誤差を許容するように実装していなかった自分が悪いのですが、UnityEngine.Vector3.magnitude(もしくはその中で使われている関数)の計算結果が微妙に変わったようで処理に影響が出たところがありました。

サンプルコード

var vec = new UnityEngine.Vector3(1, 2, 3).normalized * -5.0f;
Debug.LogFormat("{0} == {1}: {2}", 5, vec.magnitude.ToString("r"), 5 == vec.magnitude);

Unity2018.4.2f1の出力結果

5 == 5: True

Unity2019.1.9f1の出力結果

5 == 4.99999952: False

これは計算誤差を許容するように修正して解決しました。

3. NUnit.Framework.Assert.AreEqualの比較結果が一部変わった

これも自分の実装が悪かったのですが、NUnit.Framework.Assert.AreEqualの比較処理が一部変更になったようでTest Runnerでエラーが出るようになりました。

Unity2018.4では通るがUnity2019.1では通らないサンプルコード

Assert.AreEqual(
    new Vector3(float.NaN, float.NaN, float.NaN),
    new Vector3(float.NaN, float.NaN, float.NaN)
);

NaN同士を==で比較した場合はfalseになるのが正しいのでこちらの結果の方が正しいように思えます。これはIsNaNという関数を作って判定することで解決しました。

public static bool IsNaN(UnityEngine.Vector3 value)
{
    return float.IsNaN(value.x) &&
        float.IsNaN(value.y) &&
        float.IsNaN(value.z);
}

ちなみに、float.NaN同士をAreEqualで比較した場合は通ってしまうのでこの変更は意図したものではないのかもしれません。

Assert.AreEqual(float.NaN, float.NaN); // 何故かこれは通る

環境

  • Unity 2018.4.2f1
  • Unity 2019.1.9f1