查看: 1264|回复: 0
打印 上一主题 下一主题

[其他] Unity3D 一键更换场景物体(转载)

[复制链接]
may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52352
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2016-3-25 00:09:17 |只看该作者 |倒序浏览

作为一名高贵的程序猿,通过代码让电脑代替自己的工作是我们存在的意义。既然我们能一键更换UI字体,那我们肯定也需要一键更换场景内其它物体。
不管要更换的是什么东西,我们都可以用一个prefab把它们替换掉。
都在代码里,先走一个~
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. using System.Collections.Generic;
  5. /// <summary>
  6. /// 改变Prefab
  7. /// 注:通过名字匹配搜索被替换目标
  8. /// (被选中物体的所有子物体.name包含newPrefab.name则替换)
  9. /// </summary>
  10. public class ChangePrefab : EditorWindow
  11. {

  12.     [MenuItem("DuanTools/换Prefab")]
  13.     public static void Open()
  14.     {
  15.         EditorWindow.GetWindow(typeof(ChangePrefab));
  16.     }

  17.     public GameObject newPrefab;
  18.     static GameObject tonewPrefab;

  19.     void OnGUI()
  20.     {

  21.         newPrefab = (GameObject)EditorGUILayout.ObjectField(newPrefab, typeof(GameObject),true, GUILayout.MinWidth(100f));
  22.         tonewPrefab = newPrefab;
  23.         if (isChange)
  24.         {
  25.             GUILayout.Button("正在变...");
  26.         }
  27.         else
  28.         {
  29.             if (GUILayout.Button("变变变!"))
  30.                 Change();
  31.         }
  32.     }

  33.     static bool isChange = false;

  34.     public static void Change()
  35.     {
  36.         if (tonewPrefab == null)
  37.             return;

  38.         isChange = true;
  39.         List<GameObject> destroy = new List<GameObject>();
  40.         Object[] labels = Selection.GetFiltered(typeof(GameObject), SelectionMode.Deep);
  41.         foreach (Object item in labels)
  42.         {
  43.             GameObject tempGO = (GameObject)item; // (GameObject)item;
  44.             //只要搜到的物体包含新Prefab的名字,就会被替换
  45.             if (tempGO.name.Contains(tonewPrefab.name))
  46.             {
  47.                 GameObject newGO = (GameObject)Instantiate(tonewPrefab);
  48.                 newGO.transform.SetParent(tempGO.transform.parent);
  49.                 newGO.name = tempGO.name;
  50.                 newGO.transform.localPosition = tempGO.transform.localPosition;
  51.                 newGO.transform.localRotation = tempGO.transform.localRotation;
  52.                 newGO.transform.localScale = tempGO.transform.localScale;

  53.                 destroy.Add(tempGO);
  54.             }
  55.         }
  56.         foreach (GameObject item in destroy)
  57.         {
  58.             DestroyImmediate(item.gameObject);
  59.         }
  60.         isChange = false;
  61.     }
  62. }
复制代码
下面是使用方法:
首先打开刚才制作的编辑器窗口,选择一个要替换成的Prefab。
然后在游戏场景内寻则要被替换物体的最父级。
点击“变变变”,所有包含新prefab名字的场景内物体都会被替换掉了。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-7-31 05:55 , Processed in 0.094240 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部