零基础入门 36:代码控制预设

Hi guys,这次更新还是蛮快的吧?

上一篇分享给大家带来了如何通过菜单栏呼出一个自定义的窗口,不知道大家消化的如何了呢?

之前一直有小伙伴问我一个问题,我们在Unity中,可以把一个GameObject从Hierarchy窗口拖动到Project窗口,这样就完成了对Prefab的创建或者更新,但是这一切的操作都依赖于手动拖动,那如果想要实现自动化的代码操控,应该如何做到呢?

今天也是给这些有疑问的小伙伴们答疑的一篇,来分享下如何通过代码控制预设。

这里的控制指的是将我们在Unity中选中的一个GameObject通过自定义菜单栏点击后,放到我们Project窗口中,从而形成一个Prefab,并且可以通过再次点击菜单栏实现更新操作,并且不改变原来选中的GameObject状态。

可能涉及到的逻辑有些多,怎么理解呢?

我们分步拆开来看

1、有一个菜单栏可以实现对选中的控制对象进行操作

2、选中的GameObject可以实例化成一个预设文件到指定路径下

3、如果当前选中的GameObject在指定路径下已经存在,那么更新预设

4、不改变选中对象的状态,即不会将选中的对象也变成Prefab

为了完成以上的需求,我们来帮助同学们一步一步来实现。

下面进入正题


我们在目录中创建一个Editor文件夹,并且创建一个脚本名为ControlPrefab

之后编辑脚本,先创建一个菜单栏出来

然后加入下面的逻辑

Selection.activeGameObject可以拿到当前在Unity编辑器下选中的目标对象,并且判断如果为空,代表当前没有选中对象,直接返回就好了

之后加入对路径的判断。

字符串保存当前要查找的路径文件,然后通过AssetDatabase.LoadAssetAtPath来对指定路径下的对象进行获取,如果可以获取到说明该路径下存在这个预设,获取不到,则不存在。

之后的我们加入新的逻辑,如果可以获取的到,那我们更新这个预设,如果获取不到,直接创建。

当没有该预设的时候,通过PrefabUtility的Create接口直接创建,并且将选择的对象实例化,通过实例化的进行创建,这样做可以不影响之前选择的对象状态。在创建成功后,删除这个实例化的对象即可。

如果存在则通过Replace接口进行替换,也是一样的道理。

下面把完整代码附上。

using UnityEngine;

using System.Collections;

using UnityEditor;

public class ControlPrefab : MonoBehaviour

{

#region Public Attributes

#endregion

#region Private Attributes

#endregion

#region Public Methods

[MenuItem("Jimin/Control Prefab")]

static void Control()

{

GameObject obj = Selection.activeGameObject;

if (obj == null)

return;

string prefabPath = "Assets/" + obj.name + ".prefab";

GameObject asset = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);

if (asset == null)

{

Debug.Log("无该数据");

GameObject go = GameObject.Instantiate(obj);

PrefabUtility.CreatePrefab(prefabPath, go, ReplacePrefabOptions.ConnectToPrefab);

GameObject.DestroyImmediate(go);

}

else

{

Debug.Log("有这个数据 ");

UnityEngine.Object newprefab = PrefabUtility.CreateEmptyPrefab(prefabPath);

GameObject go = GameObject.Instantiate(obj);

PrefabUtility.ReplacePrefab(go, newprefab, ReplacePrefabOptions.ConnectToPrefab);

GameObject.DestroyImmediate(go);

}

}

#endregion

#region Override Methods

#endregion

#region Private Methods

#endregion

#region Inner

#endregion

}

以上就满足了我们的最开始的需求,下面我们动图来看一下效果。

新场景,什么都没有,我们将MainCamera进行保存

通过上图可以看到,MainCamera的状态并没有变成预设状态。并且也实例化成了一个新的预设到我们的指定Assets路径下。

之后我们修改Hierarchy里MainCamera的属性,然后再次点击,更新预设

如果大家觉得每次点击菜单栏很麻烦,也可以直接把该菜单栏加入快捷键。这样就会方便大家创建预设以及更新预设文件。

好了,今天的分享就先结束啦。大家下期见

原文发布于微信公众号 - 韩东吉的Unity杂货铺(DeveloperJimin)

原文发表时间:2017-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码云1024

matplotlib简介

Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

44770
来自专栏CaiRui

详细grep、sed、awk

[root@VM_0_7_centos tmp]# cat 1.txt 1 2 3 4 5 6 [root@VM_0_7_centos tmp]# cat 2...

50070
来自专栏XAI

【定制化图像开放平台】入门实例之手写数字模型训练

本帖主要用手写数字为例进行一个简单入门实例总结(非官方) 平台网站:http://ai.baidu.com/customize/app/model/ 定制化图像...

431160
来自专栏前端杂货铺

[译] Cookbook of QUnit

本篇文章是QUnit的简介,可以作为很好的入门教程。文章原址 介绍 自动化测试时软件开发过程中必不可少的一部分,而单元测试则是自动化测试的最为基本的一块,软件的...

310110
来自专栏java初学

一致性哈希算法(consistent hashing)

550140
来自专栏ATYUN订阅号

最新!TensorFlow 1.9.0正式版发布

TensorFlow 1.9.0正式版发布了,下面是更新和改进的细节,更详细的信息请到网站查阅:github.com/tensorflow/tensorflow...

16320
来自专栏linux驱动个人学习

分支预测

分支预测( Branch predictor):当处理一个分支指令时,有可能会产生跳转,从而打断流水线指令的处理,因为处理器无法确定该指令的下一条指令,直到分支...

11410
来自专栏深度学习思考者

DL开源框架Caffe | 目标检测Faster-rcnn训练自己数据问题整理

数据集制作   Pascal_voc数据集可以做目标检测,目标分割,识别等任务,本文主要针对目标检测的任务,因此只需要其中几个文件夹,也就是我们制作自己的数据集...

29470
来自专栏NetCore

Visual C#.Net网络程序开发-Tcp篇(2) 祥细内容:

前面我们说,TcpClient类创建在Socket之上,在Tcp服务方面提供了更高层次的抽象,体现在网络数据的发送和接受方面,是TcpClient使用标准的St...

66450
来自专栏SAP最佳业务实践

想学FM系列(18)-SAP FM模块:派生规则推导策略(1)-派生规则推导步骤-初始化

4 派生规则推导策略 派生规则推导,是SAP提供由数据源推导到目标数据的一种工具,它提供了一系列面向用户开放使用的方法来使数据源经过逻辑推理后生成了有效目标数据...

57470

扫码关注云+社区

领取腾讯云代金券