专栏首页韩东吉的Unity杂货铺零基础入门 36:代码控制预设

零基础入门 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),作者:Jimin

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从象棋到太极,领悟学习之道(三)

    前俩节讲述了学习要“树正观”,“划小圈”。那最后的一小节,就来讲述下学习之道的第三点,也是最后一点,建组块。

    韩东吉
  • 零基础入门 9: Unity脚本的生命周期

    因为接下来的几篇分享,可能会开始编写脚本,所以索性用这篇来介绍下Unity脚本的常用生命周期函数。

    韩东吉
  • 零基础入门 42:更新Unity2017快捷键清除日志

    Hello,之前在零基础入门系列里,有发过关于快捷键清除日志的文章,但是当时的Unity版本是Unity5.5,很多人和我说用起来都还蛮方便,但是随着2017的...

    韩东吉
  • http server测试

    在对http服务测试时,我们可以通过两种方式来完成,一种基于http服务,一种基于自带的测试包来完成。

    暮雨
  • Golang json save 保存

    go-simplejson和beego中的config,json都没有保存json内容 以go-simplejson为列,在文件中增加如下就行: func S...

    李海彬
  • Python 内置类型 dict, li

    近段时间发现一个 Python 连接数据库的连接是线程不安全的,结果惹得我哪哪儿都怀疑变量的多线程是否安全的问题,今天终于找到了正确答案,那就是 Python ...

    py3study
  • 开源ETL工具之Kettle介绍

    Kettle是一个Java编写的ETL工具,主作者是Matt Casters,2003年就开始了这个项目,最新稳定版为7.1。 2005年12月,Kettle...

    2Simple
  • .NET 3.5-4.0 并行计算的支持

    在以往的计算机发展历史中,硬件技术的发展,特别是CPU频率的不断提高,总是给软件带来更强的性能提升。从386到586,从赛扬到奔腾,每次CPU频率的提升,都带来...

    张善友
  • valueOf与toString

    valueOf和toString是Object.prototype上的方法,在Js几乎所有的对象都会继承自Object,同样由于包装对象的原因,几乎所有的数据类...

    WindrunnerMax
  • SaaS 企业收入评判标准将于 2017 年发生重大改变

    T客汇官网:tikehui.com 译文 | 张苏月 ? 原先一直推行的 SaaS 公司收入认证标准在 2017 年将要发生重大改变,其中对创业公司的影响颇为明...

    人称T客

扫码关注云+社区

领取腾讯云代金券