【Unity】Unity 5.3 新機能メモ

# Logger

Unity 5.3 から「UnityEngine.Logger」が追加されました
Debugクラス同様にログ出力が可能なクラスですが
Debugクラスと比べると下記のような違いがあります

- ログにタグを付与することができる
- ログにフィルターをかけることができる
- ログ出力の機能のON/OFFを変更できる

### ログにタグを付与することができる

```cs
var logger = Debug.logger;
logger.Log( "タグ", "ログ" );
logger.LogWarning( "警告タグ", "ログ" );
logger.LogError( "エラータグ", "ログ" );
```

![alt](http://cdn-ak.f.st-hatena.com/images/fotolife/b/baba_s/20151227/20151227131647.png)

### ログにフィルターをかけることができる

```cs
var logger = Debug.logger;
logger.filterLogType = LogType.Warning;
```

|LogType|出力されるログ|
|:--|:--|
|Log|すべて|
|Warning|Warning、Assert、Error、Exception|
|Assert|Assert、Error、Exception|
|Error|Error、Exception|
|Exception|Exception|

### ログ出力の機能のON/OFFを変更できる

```cs
var logger = Debug.logger;
logger.logEnabled = false;
```

### 参考サイト様

http://docs.unity3d.com/ScriptReference/Logger.html

# ILogHandler

Unity 5.3 から「UnityEngine.ILogHandler」が追加されました
ILogHandlerを実装したクラスをLoggerクラスに設定することで
ログ出力時の挙動を変えることができます

```cs
public class MyLogHandler : ILogHandler
{
    public void LogException( 
        Exception           exception, 
        UnityEngine.Object  context 
    )
    {
        // ...
    }

    public void LogFormat( 
        LogType             logType, 
        UnityEngine.Object  context, 
        string              format, 
        params object[]     args 
    )
    {
        // ...
    }
}
```

例えばこのようなILogHandlerを実装したクラスを

```cs
var logger = new Logger( new MyLogHandler() );
logger.Log( "ログ" );
```

Loggerクラスのコンストラクタで指定してから
ログ出力する処理を記述します

後は、ILogHandlerを実装したクラスの
LogException関数とLogFormat関数の処理を記述することで
独自のログ出力機能を実装できます

例えば、出力されたログをテキストファイルに保存する、
サーバに送信するといった機能を実現できるようになります

### 参考サイト様

http://docs.unity3d.com/ScriptReference/ILogHandler.html

# SceneAsset

Unity 5.3 から「UnityEditor.SceneAsset」が追加されました
このクラスを使用してエディタ拡張を行うことで
シーンファイルのInspectorを拡張したり
EditorGUILayout.ObjectFieldと併用することで
Inspectorでシーンファイルをドラッグ&ドロップできるようになります

```cs
using UnityEditor;
using UnityEngine;

[CustomEditor( typeof( SceneAsset ) )]
public class SceneAssetInspector : Editor
{
    public override void OnInspectorGUI()
    {
        GUI.enabled = true;
        EditorGUILayout.LabelField( "Hoge" );
        GUI.enabled = false;
    }
}
```

![alt](http://cdn-ak.f.st-hatena.com/images/fotolife/b/baba_s/20151227/20151227133841.png)

### 参考サイト様

http://docs.unity3d.com/ScriptReference/SceneAsset.html

# Preserve

Unity 5.3 から「UnityEngine.Scripting.Preserve」が追加されました
Unityはビルド開始時にプロジェクト内の未使用のコードを削除しますが
例えばリフレクションを使用して呼び出している関数が存在する場合
その関数も削除されてしまう可能性があります

Preserve属性を関数に適用することで
ビルド開始時に削除されないようにすることができます

```cs
using System.Reflection;
using UnityEngine;
using UnityEngine.Scripting;

public class ExampleClass
{
	public static void Example()
	{
		var type = typeof( ExampleClass );
		var attr = BindingFlags.NonPublic | BindingFlags.Static;
		type.GetMethod( "Log", attr ).Invoke( null, null );
	}

	[Preserve]
	private static void Log()
	{
		Debug.Log( "ログ" );
	}
}
```

### 参考サイト様

http://docs.unity3d.com/ScriptReference/Scripting.PreserveAttribute.html

# WaitWhile

Unity 5.3 から「UnityEngine.WaitWhile」が追加されました
条件を満たす間コルーチンの実行を中断できます

```cs
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour 
{
    int frame;

    IEnumerator Start()
    {
        yield return new WaitWhile( () => frame < 10 );
    }

    void Update()
    {
        frame++;
    }
}
```

### 参考サイト様

http://docs.unity3d.com/ScriptReference/WaitWhile.html

# WaitUntil

Unity 5.3 から「UnityEngine.WaitUntil」が追加されました
条件を満たさない間コルーチンの実行を中断できます

```cs
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour 
{
    int frame;

    IEnumerator Start()
    {
        yield return new WaitUntil( () => frame >= 10 );
    }

    void Update()
    {
        frame++;
    }
}
```

### 参考サイト様

http://docs.unity3d.com/ScriptReference/WaitUntil.html

# DelayedAttribute

Unity 5.3 から「UnityEngine.DelayedAttribute」が追加されました


```cs
using UnityEngine;

public class ExampleClass : MonoBehaviour 
{
    public int value;

    void Update()
    {
        Debug.Log( value );
    }
}
```

例えば上記のようなクラスをオブジェクトにアタッチして
エディタ再生中にInspectorでvalue変数の値を変更した場合
即座にログに出力される値が変化しますが

```cs
using UnityEngine;

public class ExampleClass : MonoBehaviour 
{
    [Delayed] public int value;

    void Update()
    {
        Debug.Log( value );
    }
}
```

このようにvalue変数にDelayed属性を適用して
エディタ再生中にInspectorでvalue変数の値を変更した場合
エンターキーを入力するまでログに出力される値が変化しません

### 参考サイト様

http://docs.unity3d.com/ScriptReference/DelayedAttribute.html

# ColorUtility

Unity 5.3 から「UnityEngine.ColorUtility」が追加されました 
Color型のインスタンスをカラーコードの文字列に変換したり
カラーコードの文字列をColor型のインスタンスに変換したりできます

### ToHtmlStringRGB

```cs
Debug.Log( ColorUtility.ToHtmlStringRGB( Color.cyan ) );
// 00FFFF
```

### ToHtmlStringRGBA

```cs
Debug.Log( ColorUtility.ToHtmlStringRGBA( Color.cyan ) );
// 00FFFFFF
```

### TryParseHtmlString

```cs
Color color;
if ( ColorUtility.TryParseHtmlString( "#00FFFF", out color ) )
{
    Debug.Log( color );
    // RGBA(0.000, 1.000, 1.000, 1.000)
}
```

### 参考サイト様

http://docs.unity3d.com/ScriptReference/ColorUtility.html

# ISerializationCallbackReceiver

Unity 5.3 から「UnityEngine.ISerializationCallbackReceiver」が追加されました
このインターフェイスを実装することで
JsonUtilityでシリアライズした時やデシリアライズした時に呼び出される
コールバック関数を実装することができます

```cs
public class Character : ISerializationCallbackReceiver
{
	public void OnBeforeSerialize()
	{
		Debug.Log( "OnBeforeSerialize" );
	}

	public void OnAfterDeserialize()
	{
		Debug.Log( "OnAfterDeserialize" );
	}
}
```

```cs
var character = new Character();
var json = JsonUtility.ToJson( character );
character = JsonUtility.FromJson<Character>( json );
```

### 参考サイト様

http://docs.unity3d.com/ScriptReference/ISerializationCallbackReceiver.html