前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础入门 36:代码控制预设

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

作者头像
韩东吉
发布2018-10-18 14:56:26
5970
发布2018-10-18 14:56:26
举报

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的属性,然后再次点击,更新预设

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 韩东吉的Unity杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档