UnityEngine.ObjectとSystem.Objectはキャストできます。
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using UnityEngine.Internal;
using UnityEngineInternal;
namespace UnityEngine
{
[StructLayout(LayoutKind.Sequential)]
public class Object
{
private int m_InstanceID;
private IntPtr m_CachedPtr;
private string m_UnityRuntimeErrorString;
public extern string name
{
略...
これはUnity側でどうこうしてるというわけではなく、C#の言語機能になります。
C#はあらゆるクラスは基底クラスとしてSystem.Objectを継承しているという言語仕様があります。
Unityは.Net(C#)を使っています。そのため、C#仕様に則り先ほどのコードは暗黙的にSystem.Objectを継承しています。
namespace UnityEngine
{
[StructLayout(LayoutKind.Sequential)]
public class Object : System.Object {}
そのためUnityEngine.ObjectはSystem.Objectにキャスト可能になっています。
しかし、このせいでいくつか注意しておくべきことがあったのでまとめておきます。
##自作クラスはUnityEngine.Objectにキャストできない
例えば次のような自作クラスがあったとして、
public class Hoge
{
}
これはSystem.Objectクラスを暗黙的に継承しています。
そのためUnityEngine.Objectにキャストしようとするとエラーが発生します。
Hoge hoge = new Hoge ();
UnityEngine.Object hoge2UnityEngine = (UnityEngine.Object)hoge; //コンパイルエラー発生
System.Object hoge2System = (System.Object)hoge; //OK
そりゃそうですよね。
もしUnityEngine.ObjectにキャストしたいならUnityEngine.Objectを継承させればOKです
public class Piyo : UnityEngine.Object
{
}
Piyo piyo = new Piyo ();
UnityEngine.Object piyo2UnityEngine = (UnityEngine.Object)piyo; //OK
System.Object piyo2System = (System.Object)piyo; //OK
間違いやすいので注意しましょう。
##自作コンポーネントはUnityEngine.Objectにキャストできる
例えばこんなコンポーネントがあったとして、
using UnityEngine;
public class Test :MonoBehaviour
{
void Start ()
{
}
}
自作コンポーネントはUnityEngine.ObjectにもSystem.Objectにもキャストできます。
自作コンポーネントの継承関係は次のようになっています。
自作 -> MonoBehaviour -> Behavior -> Component -> UnityEngine.Object -> System.Object
UnityEngine.ObjectもSystem.Objectも継承しています。
そのため2つともキャストできるのです。
##UnityEngine.Objectはいろいろオーバーライドしています。
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public override extern string ToString();
public override bool Equals(object o)
{
return Object.CompareBaseObjects(this, o as Object);
}
public override int GetHashCode()
{
return this.GetInstanceID();
}
public static implicit operator bool(Object exists)
{
return !Object.CompareBaseObjects(exists, null);
}
public static bool operator ==(Object x, Object y)
{
return Object.CompareBaseObjects(x, y);
}
public static bool operator !=(Object x, Object y)
{
return !Object.CompareBaseObjects(x, y);
}
##FindObjectOfType関数は自作クラスには使えない
FindObjectOfTypeのコードをみると次のようになっています。
public static T FindObjectOfType<T>() where T : Object
{
return (T)((object)Object.FindObjectOfType(typeof(T)));
}
where T : Object
のObjectはUnityEngine.Objectを指します。
自作クラスは基本的にはSystem.Objectを直接継承しているのでFindObjectOfTypeに使うことはできません。
各種注意しましょう。
UnityEngine.ObjectとSystem.Object紛らわしい・・・