注意:

需要Unity2021以上版本

参考

https://forum.unity.com/threads/editor-callbacks-for-gameobject-creation-deletion-duplication-by-user-or-user-script.788792/

示例1

using System.Text;
using UnityEditor;
using UnityEngine; [InitializeOnLoad]
public class ObjectChangeEventsExample
{
static ObjectChangeEventsExample()
{
ObjectChangeEvents.changesPublished += ChangesPublished;
} static void ChangesPublished(ref ObjectChangeEventStream stream)
{
for (int i = 0; i < stream.length; ++i)
{
var type = stream.GetEventType(i);
switch (type)
{
case ObjectChangeKind.ChangeScene:
stream.GetChangeSceneEvent(i, out var changeSceneEvent);
Debug.Log($"{type}: {changeSceneEvent.scene}");
break; case ObjectChangeKind.CreateGameObjectHierarchy:
stream.GetCreateGameObjectHierarchyEvent(i, out var createGameObjectHierarchyEvent);
var newGameObject = EditorUtility.InstanceIDToObject(createGameObjectHierarchyEvent.instanceId) as GameObject;
Debug.Log($"{type}: {newGameObject} in scene {createGameObjectHierarchyEvent.scene}.");
break; case ObjectChangeKind.ChangeGameObjectStructureHierarchy:
stream.GetChangeGameObjectStructureHierarchyEvent(i, out var changeGameObjectStructureHierarchy);
var gameObject = EditorUtility.InstanceIDToObject(changeGameObjectStructureHierarchy.instanceId) as GameObject;
Debug.Log($"{type}: {gameObject} in scene {changeGameObjectStructureHierarchy.scene}.");
break; case ObjectChangeKind.ChangeGameObjectStructure:
stream.GetChangeGameObjectStructureEvent(i, out var changeGameObjectStructure);
var gameObjectStructure = EditorUtility.InstanceIDToObject(changeGameObjectStructure.instanceId) as GameObject;
Debug.Log($"{type}: {gameObjectStructure} in scene {changeGameObjectStructure.scene}.");
break; case ObjectChangeKind.ChangeGameObjectParent:
stream.GetChangeGameObjectParentEvent(i, out var changeGameObjectParent);
var gameObjectChanged = EditorUtility.InstanceIDToObject(changeGameObjectParent.instanceId) as GameObject;
var newParentGo = EditorUtility.InstanceIDToObject(changeGameObjectParent.newParentInstanceId) as GameObject;
var previousParentGo = EditorUtility.InstanceIDToObject(changeGameObjectParent.previousParentInstanceId) as GameObject;
Debug.Log($"{type}: {gameObjectChanged} from {previousParentGo} to {newParentGo} from scene {changeGameObjectParent.previousScene} to scene {changeGameObjectParent.newScene}.");
break; case ObjectChangeKind.ChangeGameObjectOrComponentProperties:
stream.GetChangeGameObjectOrComponentPropertiesEvent(i, out var changeGameObjectOrComponent);
var goOrComponent = EditorUtility.InstanceIDToObject(changeGameObjectOrComponent.instanceId);
if (goOrComponent is GameObject go)
{
Debug.Log($"{type}: GameObject {go} change properties in scene {changeGameObjectOrComponent.scene}.");
}
else if (goOrComponent is Component component)
{
Debug.Log($"{type}: Component {component} change properties in scene {changeGameObjectOrComponent.scene}.");
}
break; case ObjectChangeKind.DestroyGameObjectHierarchy:
stream.GetDestroyGameObjectHierarchyEvent(i, out var destroyGameObjectHierarchyEvent);
// The destroyed GameObject can not be converted with EditorUtility.InstanceIDToObject as it has already been destroyed.
var destroyParentGo = EditorUtility.InstanceIDToObject(destroyGameObjectHierarchyEvent.parentInstanceId) as GameObject;
Debug.Log($"{type}: {destroyGameObjectHierarchyEvent.instanceId} with parent {destroyParentGo} in scene {destroyGameObjectHierarchyEvent.scene}.");
break; case ObjectChangeKind.CreateAssetObject:
stream.GetCreateAssetObjectEvent(i, out var createAssetObjectEvent);
var createdAsset = EditorUtility.InstanceIDToObject(createAssetObjectEvent.instanceId);
var createdAssetPath = AssetDatabase.GUIDToAssetPath(createAssetObjectEvent.guid);
Debug.Log($"{type}: {createdAsset} at {createdAssetPath} in scene {createAssetObjectEvent.scene}.");
break; case ObjectChangeKind.DestroyAssetObject:
stream.GetDestroyAssetObjectEvent(i, out var destroyAssetObjectEvent);
// The destroyed asset can not be converted with EditorUtility.InstanceIDToObject as it has already been destroyed.
Debug.Log($"{type}: Instance Id {destroyAssetObjectEvent.instanceId} with Guid {destroyAssetObjectEvent.guid} in scene {destroyAssetObjectEvent.scene}.");
break; case ObjectChangeKind.ChangeAssetObjectProperties:
stream.GetChangeAssetObjectPropertiesEvent(i, out var changeAssetObjectPropertiesEvent);
var changeAsset = EditorUtility.InstanceIDToObject(changeAssetObjectPropertiesEvent.instanceId);
var changeAssetPath = AssetDatabase.GUIDToAssetPath(changeAssetObjectPropertiesEvent.guid);
Debug.Log($"{type}: {changeAsset} at {changeAssetPath} in scene {changeAssetObjectPropertiesEvent.scene}.");
break; case ObjectChangeKind.UpdatePrefabInstances:
stream.GetUpdatePrefabInstancesEvent(i, out var updatePrefabInstancesEvent);
string s = "";
s += $"{type}: scene {updatePrefabInstancesEvent.scene}. Instances ({updatePrefabInstancesEvent.instanceIds.Length}):\n";
foreach (var prefabId in updatePrefabInstancesEvent.instanceIds)
{
s += EditorUtility.InstanceIDToObject(prefabId).ToString() + "\n";
}
Debug.Log(s);
break;
}
}
}
}

示例2:

using UnityEditor;
using UnityEngine;
using UnityEngine.UI; [InitializeOnLoad]
public class ObjectChangeEventsHelper
{
static ObjectChangeEventsHelper()
{
ObjectChangeEvents.changesPublished += ChangesPublished;
} private static void ChangesPublished(ref ObjectChangeEventStream stream) {
if (Application.isPlaying) {
return;
}
for (int i = 0; i < stream.length; ++i) {
switch (stream.GetEventType(i)) {
case ObjectChangeKind.CreateGameObjectHierarchy:
//UI父节点自动挂上CanvasGroup
stream.GetCreateGameObjectHierarchyEvent(i, out var changeGameObjectParent);
var newGameObject = EditorUtility.InstanceIDToObject(changeGameObjectParent.instanceId) as GameObject;
if (newGameObject.transform.parent != null) {
if (newGameObject.transform.parent.name.Equals("Canvas") && newGameObject.GetComponent<Image>() != null) {
newGameObject.AddComponent<CanvasGroup>();
}
}
break;
}
}
}
}

unity创建物体的编辑器的回调的更多相关文章

  1. 使用Unity创建塔防游戏(Part2)

    How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...

  2. 使用Unity创建塔防游戏(Part1)

    How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...

  3. 使用unity创建塔防游戏(原译)(part1)

    塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了. 在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏. 你将会学到如何: 创建一波一波的敌人 使敌人随着路标移动 ...

  4. 使用UE4/Unity创建VR项目

    一.主要的步骤是说一下使用UE4,在此之前先说一下使用unity创建的VR项目 1.unity创建oculus rift dk2项目 在unity中创建一个简单的场景,让摄像机能看见场景中的物体,不对 ...

  5. Unity查找物体的子物体、孙物体

    Unity查找物体下的所有物体 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  6. 使用Unity创建塔防游戏(Part3)—— 项目总结

    之前我们完成了使用Unity创建塔防游戏这个小项目,在这篇文章里,我们对项目中学习到的知识进行一次总结. Part1的地址:http://www.cnblogs.com/lcxBlog/p/60759 ...

  7. Unity3d创建物体,寻找物体,加载物体,添加脚本

    GetCreateObject: using UnityEngine; public class GetCreateObject : MonoBehaviour { GameObject emptyG ...

  8. Unity - 创建C#脚本默认编码格式为UTF8

    嗨咯大家好,哈哈哈哈哈哈哈哈哈哈,今儿小黑加班,目的只有一个,解决Unity创建的脚本通过VS打开后编码格式不正确,导致从Unity的Inspector面板与Mac上边的VS看到的中文为乱码,很气,找 ...

  9. 怎样用ZBrush中的shadowbox创建物体

    ZBrush一直以方便著称业内各领域,模型师不需要在多个软件中编辑塑造模型,而在ZBrush用shadowbox创建物体的流程,在Tool面板上的Geometry子面板中,4.0版本引入了shadow ...

  10. Unity 实现物体破碎效果(转)

    感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity),中文翻译地址(Unity实现物体破碎效果) In ...

随机推荐

  1. UnoCSS原子CSS引擎

    UnoCSS是一款原子化的即时按需 CSS 引擎,其中没有核心实用程序,所有功能都是通过预设提供的.默认情况下UnoCSS应用通过预设来实现相关功能. UnoCSS中文文档: https://www. ...

  2. 【Uber 面试真题】SQL :每个星期连续5星评价最多的司机

    大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第一篇,也是[SQL 周周练]系列的第一篇.该系列是挑选或自编具有 ...

  3. 奶奶都能看懂的 CSS 选择器基础语法&常用属性&优先级

    标题都是奶奶都能看懂了,那么我们肯定从最基础的开始讲.之所以这么自信是因为能踩的坑全帮你们踩过了-- 开始之前,先来首诗感受一下,具体啥意思你看完本文就懂了. 点类井号逗为或,类多号单连为且. id ...

  4. vue3 基础-传送门 teleport

    之前介绍了一波混入 mixin 和 自定义指令 directive 其基本作用就是为了在 vue 中实现代码的复用. 而本篇介绍的是 vue3 的一个新特性叫做传送门. 一听这个名字是不是就感觉特别科 ...

  5. 使用PocketFlowSharp创建一个Human_Evaluation示例

    效果 实践 有时候AI生成的结果我们并不满意在进入下一步之前,我们需要对AI生成的结果进行人工审核,同意了才能进入下一个流程. Human_Evaluation就是人工判断的一个简单示例. inter ...

  6. VScode中的自定义模板

    1.背景 在用bootstrap框架,写前端代码时,由于每个页面都有固定的模板格式,比如都包含CDN等,所以在每次写代码的时候,都要重复写这些,效率比较低下.幸运的是,VScode中可以编辑各个语言的 ...

  7. odoo14里面附件传输接口

    @http.route('/fmcg/download/pdf', type='http', auth="public", csrf=False, cors='*') def up ...

  8. Spring注解之@Autowired组件装配

    前言 说起Spring的@Autowired注解,想必大家已经耳熟能详:对于小编而言,虽然一直知道怎么用,但是并没有去了解过,因此,本文就梳理一下@Autowired注解的功能,如有写的不准确的地方, ...

  9. 洛谷 P4820 [国家集训队]书堆

    题目描述 让N本密度均匀的相同的书摆在桌上.最下面的摆在桌子边缘,其他的书依次堆叠在一本书上.每本书都只能水平放置,宽必须垂直于桌子边缘.如(洛谷的)图: 求书本最右能到多远(这个距离是指最右边的书的 ...

  10. 【2020.11.17提高组模拟】数数(cuvelia) 题解

    [2020.11.17提高组模拟]数数(cuvelia) 题解 题目描述 给你一个长度为n的序列\(a_1...a_n\).对于所有的\(k\in [1,n]\)选择序列中的\(k\)个数(下标为\( ...