unityでいってみよう!

unityがチョットワカル位の人のブログ

Unity5.6から2017.3へ移行してみて気が付いたこと

2017.3もβ11となりいよいよ正式公開が近づいて気がしています。

年内に正式リリースされると良いですね。

さて、今回はUnity5.6から2017.3β11へプロジェクトを移行した際に自分が気になった部分を紹介します。

 

AnimatorControllerPlayableの定義位置の変更について

ついにPlayableAPIが実験段階から本採用となりました。

その為クラスの定義位置が

UnityEngine.Experimental.DirectorからUnityEngine.Animationsへ変更になりました。また一部のメソッドは廃止されていますのでご注意ください。

下記のコンパイルエラーが発生している場合は、この変更に該当しています。

 

error CS0234: The type or namespace name `Director' does not exist in the namespace `UnityEngine.Experimental'. Are you missing an assembly reference?

 

error CS0246: The type or namespace name `AnimatorControllerPlayable' could not be found. Are you missing `UnityEngine.Animations' using directive?

 ■UnityEngine.Texture2Dと新クラスUnityEngine.ImageConversionについて

UnityEngine.Texture2Dで定義されていた下記メソッドが廃止されました。

  • EncodeToPNG
  • EncodeToJPG
  • LoadImage

 代わりにUnityEngineにあらたにImageConversionクラスが追加されました。

このクラスはこれまでTexture2Dに含まれていたメソッド+αの機能を保有します。

  • EncodeToJPG   Encodes this texture into JPG format.
  • EncodeToPNG  Encodes this texture into PNG format.
  • LoadImage     Loads PNG/JPG image byte array into a texture.
  • EncodeToEXR  Encodes this texture into the EXR format. [new]

Texture2Dクラスはデータのみを定義する構造体にシフトしていく方針でしょうか。

 下記のエラーが発生した場合は、この仕様変更に該当します。

error CS1061: Type `UnityEngine.Texture2D' does not contain a definition for `EncodeToPNG' and no extension method `EncodeToPNG' of type `UnityEngine.Texture2D' could be found. Are you missing `UnityEngine' using directive?

※EncodeToPNGの部分がEncodeToJPGやLoadImageの場合も同様です。

対応策としては具体的には下記のようにコードを変更すればOKです。 

// Unity5.x

var bytes = texture2D.EncodeToPNG();

 

// Unity2017.x

var bytes = UnityEngine.ImageConversion.EncodeToPNG(texture2D); 

UnityEditor.Sprites.IPackerPolicyの仕様変更について

PackerPolicyに継承する必要のあるプロパティとして

AllowSequentialPackingが追加されました。このプロパティはatlasタグの順次処理を有効にするか否かの振る舞いを指定する為に使用するみたいです。 有効にすると、スプライトパッキングタグが1つずつ処理され、メモリ使用量が減少するとのことです。

 下記のエラーが発生した場合はこのケースが該当します。

error CS0535: `CustomSpritePackerPolicy' does not implement interface member `UnityEditor.Sprites.IPackerPolicy.AllowSequentialPacking.get'

対策としては下記のプロパティをクラスに追加して下さい。

public virtual bool AllowSequentialPacking { get { return false; } }

*1

マニュアルのサンプルコードがまだ更新されていないようですが、恐ら下記のような実装になるのでしょう。

public class DefaultPackerPolicySample : UnityEditor.Sprites.IPackerPolicy
{
       protected class Entry
       {
           public Sprite            sprite;
       public UnityEditor.Sprites.AtlasSettings settings;
           public string            atlasName;
           public SpritePackingMode packingMode;
           public int               anisoLevel;
       }

       private const uint kDefaultPaddingPower = 3; // Good for base and two mip levels.

       public virtual int GetVersion() { return 1; }

   public virtual bool AllowSequentialPacking { get { return false; } }
       protected virtual string TagPrefix { get { return "[TIGHT]"; } }
       protected virtual bool AllowTightWhenTagged { get { return true; } }
       protected virtual bool AllowRotationFlipping { get { return false; } }

}

 AndroidのBuidSystemの仕様変更について

BuildSystemからADTが削除され、InternalGradleの2種類となりました。

Gradleが初期値として設定されていますが、Gradleは非常にデリケートである為、各種プラグインの組み合わせ等でエラーが発生することがあるようです。

docs.unity3d.com

 Firebaseを使用している場合は、Firebaseのバージョンによっては下記のエラーが出ることもあるようです。

Moving

'Temp/StagingArea\android-libraries\firebase-core-xx.x.x\classes.jar' to 'Temp/StagingArea\android-libraries\firebase-core-xx.x.x\libs\classes.jar'.

この場合、BuildSystemをInternalに変更した上で

Assets->Player Service Resolver ->Android Resolver ->Force Resolveを実行することで改善される可能性があります。

詳細は下記のリンクを参照して下さい。 

https://github.com/googlesamples/unity-jar-resolver/issues/19

StandaloneOSX *の廃止

OSX:32ビットMacOSアプリケーションを対象としたサポートが削除されました。 既存のBuildTarget.StandaloneOSX *は廃止され、BuildTarget.StandaloneOSXとなりました。ここに引っかかる人はまずいませんが、AssetStoreからAssetを購入している場合はここで躓く可能性もあります。購入したAssetがUnity2017.xに対応しているか製作元に確認してみましょう。

*1:※Unity5.6との互換性という意味でfalseを返しています。