気ままなUnityエンジニアブログ

新米Unityエンジニアが送る解説アウトプットブログです。Twitter : @UjinUnity

MENU

Unity Objectを任意の型に変換する拡張メソッドを作ってみました

スポンサーリンク

f:id:Wojtek:20191031230201p:plain


最近はResources生成用のコントローラクラスを作っているのですが、その最中で出来上がったものをブログに書き起こしました。

というのも、指定したクラス (Prefab) を自動でInstantiate する処理を作っていたときに、オブジェクトの型変更をスムーズと思い、サクッと作ってみました。

ソースコード

  using System.Collections.Generic;
  using System.Collections;
  using System.IO;
  using System.Runtime.Serialization.Formatters.Binary;
  using System.Runtime.Serialization;
  using UnityEngine;

  /// <summary>
  /// UnityEngine.Objectの拡張クラス
  /// </summary>
  public static class ObjectExtension {

      /// <summary>
      /// UnityEngine.Objectを任意の型に変更する
      /// </summary>
      /// <param name="selfObj"></param>
      /// <typeparam name="T"></typeparam>
      /// <returns></returns>
      public static T ConvertAsObject<T> (this Object selfObj) where T : Object {

          // ObjectがNullの場合
          if (selfObj == null) {
              return null;
          }

          // 取得した情報がComponentの場合
          if (typeof (T).IsSubclassOf (typeof (Component))) {
              // GameObjectに変換する
              GameObject obj = (selfObj as GameObject);

              // GameObjectであった場合、Componentを返す
              if (obj != null) {
                  return obj.GetComponent<T> ();
              }
          }

          // Objectの型を変更して返す
          return (selfObj as T);

      }
  }

説明

まずC#の拡張クラスを使っています。

this Object selfObj でこの関数を読んだオブジェクトの型を変換できるようになりました。

/ ObjectがNullの場合
          if (selfObj == null) {
              return null;
          }

ではこの関数を読んだオブジェクトがnullだった場合、nullを変換するifを読んでいます。
Nullチェックは本当に大事で、特にObject系は必ず行いましょう。

// 取得した情報がComponentの場合
          if (typeof (T).IsSubclassOf (typeof (Component))) {
              // GameObjectに変換する
              GameObject obj = (selfObj as GameObject);

              // GameObjectであった場合、Componentを返す
              if (obj != null) {
                  return obj.GetComponent<T> ();
              }
          }

この部分はテンプレート先のクラスがComponent型の場合、ObjectをGameObjectに変換します。
GameObjectだった場合のみ、型変換先のクラスをGameObjectにアタッチする仕組みです。

Component型でなかったらそのまま型変換したObjectを変換されています。

使い方

個人的には Instantiateを行うときに使用しています。
Instantiateする際の型変換時に行うと、汎用的に使えてとても便利です。

是非皆さんも試してみてください。