うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Hierarchy で GameObject を Duplicate したタイミングで処理を走らせる

あらまし

Hierarchy で GameObject を Duplicate (複製) した際に複製した GameObject の Scale が一致しないことがある
Duplicate した GameObject の WorldScale が1じゃないときに発生しているような気がするが正しい原因は分からない

また複製した GameObject は最後に (1) が追加され基本的には利用しないので削除する必要がある

f:id:hacchi_man:20200126211935p:plain

実装

Unity の Duplicate のデリゲートがなかったので
EditorApplication.hierarchyWindowItemOnGUI を利用してGameObject の Duplicate を監視する

EditorApplication.delayCall を呼び出さない場合
Selection.activeGameObject がDuplicate 後のGameObject にならないので注意

using UnityEngine;
using UnityEditor;

public class EditorDuplicateHelper
{
    [InitializeOnLoadMethod]
    private static void SetDelegate()
    {
        EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyWindowItemOnGUI;
    }

    private static void OnHierarchyWindowItemOnGUI(int instanceID, Rect rect)
    {
        if (Selection.activeInstanceID != instanceID)
            return;

        var e = Event.current;

        if (e.type != EventType.ValidateCommand && e.type != EventType.ExecuteCommand)
            return;

        if ("Duplicate" != e.commandName)
            return;

        var gameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
        if (gameObject == null)
            return;

        var scale = gameObject.transform.localScale;
        EditorApplication.delayCall += () =>
        {
            var activeGameObject = Selection.activeGameObject;
            if (activeGameObject == null)
                return;
            
            activeGameObject.transform.name = name;
            activeGameObject.transform.localScale = scale;
        };
    }
}