unity创建物体的编辑器的回调
注意:
需要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创建物体的编辑器的回调的更多相关文章
- 使用Unity创建塔防游戏(Part2)
How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...
- 使用Unity创建塔防游戏(Part1)
How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...
- 使用unity创建塔防游戏(原译)(part1)
塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了. 在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏. 你将会学到如何: 创建一波一波的敌人 使敌人随着路标移动 ...
- 使用UE4/Unity创建VR项目
一.主要的步骤是说一下使用UE4,在此之前先说一下使用unity创建的VR项目 1.unity创建oculus rift dk2项目 在unity中创建一个简单的场景,让摄像机能看见场景中的物体,不对 ...
- Unity查找物体的子物体、孙物体
Unity查找物体下的所有物体 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- 使用Unity创建塔防游戏(Part3)—— 项目总结
之前我们完成了使用Unity创建塔防游戏这个小项目,在这篇文章里,我们对项目中学习到的知识进行一次总结. Part1的地址:http://www.cnblogs.com/lcxBlog/p/60759 ...
- Unity3d创建物体,寻找物体,加载物体,添加脚本
GetCreateObject: using UnityEngine; public class GetCreateObject : MonoBehaviour { GameObject emptyG ...
- Unity - 创建C#脚本默认编码格式为UTF8
嗨咯大家好,哈哈哈哈哈哈哈哈哈哈,今儿小黑加班,目的只有一个,解决Unity创建的脚本通过VS打开后编码格式不正确,导致从Unity的Inspector面板与Mac上边的VS看到的中文为乱码,很气,找 ...
- 怎样用ZBrush中的shadowbox创建物体
ZBrush一直以方便著称业内各领域,模型师不需要在多个软件中编辑塑造模型,而在ZBrush用shadowbox创建物体的流程,在Tool面板上的Geometry子面板中,4.0版本引入了shadow ...
- Unity 实现物体破碎效果(转)
感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity),中文翻译地址(Unity实现物体破碎效果) In ...
随机推荐
- 【笔记】Python3|爬虫处理网页数据异步加载问题(结合Selenium完成)
文章目录 问题描述 1. 结合Selenium.Edge解析该网站搜索页面的数据 2. 结合lxml解析网页数据 3. 附加:不是异步加载的网页,结合requests直接请求数据 问题描述 一些网站会 ...
- 浅谈鸿蒙跨平台开发框架ArkUI-X
之前写过使用uniapp的跨平台开发鸿蒙项目,今天分享一下开发体验更友好的跨平台开发框架ArkUI-X. ArkUI-X看起来像是鸿蒙官方的框架,在DevEco中就可以安装和使用,而且会ArkUI就可 ...
- 【SQL 周周练】爬取短视频发现数据缺失,如何用 SQL 填充
大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第 5 篇,也是[SQL 周周练]系列的第 4 篇.该系列是挑选或 ...
- B1092 最好吃的月饼
描述 月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种"最好吃"的月饼,那势必在吃货界引发一场腥风血雨-- 在这里我们用数字说话,给出全国各地各种 ...
- 立创杯(javabasic)
Throws关键字用于对外声明方法可能发生的异常,这样调用者在调用方法时,可以明确知道方法有异常,并进行相关处理 接口中可以包含非静态成员变量 Math.round(-1.5)//-1 round(d ...
- SQL注入常用爆库语句
SQL注入的时候,找到了注入点,但是老是搞不清怎么爆库,最后还是得看大佬的WP 最后,终于下定决心自己整理一下爆库的常用语句和思路,如果哪里写的不对麻烦在评论区指出:-D 省流概要 select gr ...
- ODOO路由里面的auth="user" 的使用
一.controller介绍:Controller层在odoo里面可以认为是控制器,根据url地址来控制后端的业务和前端的内容展示,我们一般偏向于叫路由控制, 它相当于内网和外网之间的防火墙,外网的请 ...
- mac ssh 总是自动断开
创建一个ssh配置文件: vi ~/.ssh/config 写入以下内容: Host * ServerAliveInterval 120 TCPKeepAlive no
- Fiddler抓包工具安装HTTPS证书
安装好之后,打开Fiddler根目录,打开CMD 执行以下内容 makecert.exe -r -ss my -n "CN=DO_NOT_TRUST_FiddlerRoot, O=DO_NO ...
- 如何自建PT刷流盒子
如何自建PT刷流盒子 选择机器 为了刷流我们最好选择大带宽.大容量的服务器,在这里我们简称大盘鸡 在这里为了方便演示我就拿Digital Ocean的一台服务器进行搭建,如果你要正式刷流了还是买个硬盘 ...