【unity编辑器扩展】几行代码,实现从自定义窗口里直接拖拽预制体到场景中

最近开始做自己的游戏啦。
然后开发游戏需要的工具,之前一直都是用现成的轮子,现在决定自己也写点小工具好了。

在搭建原型关卡的过程中,发现要把不同文件夹中的预制体拖拽到场景,此过程中需要大量的时间去切换不同的预制体文件夹,也不能把所有的预制体都集中放一起。

想了一下就用最简单的方法去解决吧,所以决定做一个如标题所示的功能:把我需要的预制体放到我自定义的窗口里,然后直接从这个自定义的窗口中去拖拽预制体。

为了完成这个功能,我们差不多需要以下几个步骤。

首先是创建继承了EditorWindow的脚本,下面的代码可以帮助我们实现一个自定义窗口:

[MenuItem("Tools/EditorWindows/ PropsPrefabEditorWindow ")]
    private static void ShowWindow()
    {
        GetWindow<PropsPrefabEditorWindow>(" PropsPrefabEditorWindow ");
    }

然后我们需要获取要实例化到场景中的预制体:

 GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(propsPath + "/" + name + stringPrefab);
  //propsPath是预制体的路径,stringPrefab是.prefab后缀

接着是我们需要让预制体显示在窗口上,为了实现这个功能,我们首先需要获得预制体的缩略图,用以下的语句就可以实现:

   Texture2D thumbnail = AssetPreview.GetAssetPreview(prefab);

把获取到的缩略图“画”到自定义的窗口上,这里就使用unity的UIElemt方案来画,需要在脚本开头使用它的命名空间:

		using UnityEngine.UIElements;
		...
		...
		...
 		var box = new Box();
        box.style.width = 70;
        box.style.height = 70;

这样一个70X70的盒子就画好了,我们再让这个盒子的背景图变成我们上面获取到的缩略图:

 box.style.backgroundImage = thumbnail;

有了box,我们还需要给它加上拖拽相关的回调方法:

  		box.RegisterCallback<MouseDownEvent>(evt =>
        {
            DragAndDrop.PrepareStartDrag();
            DragAndDrop.StartDrag("Dragging");
            DragAndDrop.objectReferences = new Object[] { prefab };
        });
        box.RegisterCallback<DragUpdatedEvent>(evt =>
        {
            DragAndDrop.visualMode = DragAndDropVisualMode.Move;
        });

最后别忘记把box添加到rootVisualElement中,否则它将不会出现在窗口上:

 rootVisualElement.Add(box);

最终效果如图所示

新创建的几个窗口都放在scene窗口的左边了,是不是非常简单呢?
在这里插入图片描述

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity,如果要在非编辑器模式下或真机上获取未实例化的GameObject预制体上的组件,需要使用Resources.Load方法来加载预制体资源。 下面是一个简单的示例,演示如何在非编辑器模式下获取未实例化的GameObject预制体上的组件: 1. 首先,打开Unity编辑器并创建一个新场景。 2. 在项目视图创建一个新的预制件。 3. 选择预制件并在Inspector视图添加一个新组件。例如,您可以添加一个名为“TestComponent”的C#脚本。 4. 在TestComponent脚本添加以下代码: ``` using UnityEngine; public class TestComponent : MonoBehaviour { public int testValue = 0; } ``` 5. 然后,将预制拖动场景。 6. 选择预制件并在Inspector视图更改TestComponent的testValue属性。例如,您可以将其设置为5。 7. 打开脚本编辑器并创建一个新的C#脚本。将以下代码添加到脚本: ``` using UnityEngine; public class GetPrefabComponent : MonoBehaviour { public string prefabPath; void Start() { GameObject prefab = Resources.Load<GameObject>(prefabPath); if (prefab != null) { TestComponent testComponent = prefab.GetComponent<TestComponent>(); if (testComponent != null) { Debug.Log("TestComponent testValue: " + testComponent.testValue); } else { Debug.Log("TestComponent not found on prefab"); } } else { Debug.Log("Prefab not found at path: " + prefabPath); } } } ``` 8. 在场景创建一个新的空对象,并将GetPrefabComponent脚本添加到该对象上。 9. 在GetPrefabComponent脚本组件,将prefabPath属性设置为您创建的预制件的路径。例如,如果您的预制件位于“Assets/Resources/Prefabs/TestPrefab.prefab”,则将prefabPath设置为“Prefabs/TestPrefab”。 10. 您现在可以运行场景,并查看控制台的输出。如果一切正常,您应该会看到以下消息: ``` TestComponent testValue: 5 ``` 这表明您成功获取了未实例化的GameObject预制体上的TestComponent组件,并检索了其testValue属性。 需要注意的是,Resources.Load方法在加载资源时会产生一些性能开销,并且在Unity 2019.3版本及更高版本已被标记为过时。因此,建议在可能的情况下,尽量避免使用Resources.Load方法来加载资源。如果需要在非编辑器模式下获取预制体上的组件,建议使用AssetBundle或Addressable Asset System等更高效的资源加载方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值