インディーゲームクリエイター目指すやつのブログ

インディーゲームクリエイター目指す、20歳の学生ですのブログです。開発環境はUnity、ドット調の2dゲームを主に作っています。

HierarchyにMonoBehaviorを継承したスクリプトをドラッグアンドドロップしたらスクリプトをAddComponentされたGameObjectを生成する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

using System.IO;
using System.Reflection;
using System;


[CreateAssetMenu]
public class SpriteAnimationClip : ScriptableObject {
	public Sprite[] sprites;
	public float speed;
}



#if UNITY_EDITOR
public class DropScript
{
	static bool idDragExited;

	//Editor起動またはゲーム起動時に呼び出される。
	[InitializeOnLoadMethod]
	static void AutoStart()
	{
		Debug.Log("DropScript AutoStart");

		//ヒエラルキーに描画範囲にマウスが入ったら呼び出されるコールバック
		EditorApplication.hierarchyWindowItemOnGUI += HierarchyOnGUI;
	}
		

	//ヒエラルキーの描画範囲のコールバック
	static void HierarchyOnGUI(int instanceID, Rect selectionRect)
	{
		//ユーザーが現在どのような入力を行ったか
		var curr = Event.current;

		switch (curr.type)
		{
		case EventType.DragPerform://ドラッグアンドドロップ開始
		case EventType.DragUpdated://ドラッグアンドドロップ中
			idDragExited = true;
			break;
		case EventType.DragExited://ドラッグアンドドロップ終了
			if (idDragExited)
			{
				idDragExited = false;
				OnDragExited();
			}
			break;
		}
	}

	//ドラッグアンドドロップ終了したときの処理
	static void OnDragExited()
	{
		//ドラッグアンドドロップしているファイルパスが0(なにももっていなかったら)
		if (DragAndDrop.paths.Length > 0)
		{
			//すべてのファイルを列挙
			foreach (var path in DragAndDrop.paths)
			{
				//オブジェクトを生成
				CrateScriptObject(path);
			}
		}
	}
		
	static void CrateScriptObject(string assetPath)
	{

		//CSScriptだったら
		if (Path.GetExtension (assetPath) != ".cs")
			return;

		//拡張子を抜いたファイル名を取得
		var className = Path.GetFileNameWithoutExtension(assetPath);

		//クラス名からTypeを取得
		//MonoBehaviorを継承した大抵のものはAssembly-CSharp.dllに含まれるのが普通.
		var type = Assembly.Load("Assembly-CSharp").GetType(className);
		//生成したクラスのタイプ型が取得できる
		if (type != null) {
			//new GameObjectでゲームオブジェクトを生成
			var go = new GameObject (className);

			//タイプ型をアドコンポーネントする
			Component comp = go.AddComponent (type);

			//nullならアドコンポーネントできないクラスだから削除
			if (comp == null) {
				UnityEngine.Object.DestroyImmediate (go);
			}
		}
	}
}

#endif