Unity3D 遍历预制体

2024-08-25 15:28
文章标签 遍历 unity3d 预制

本文主要是介绍Unity3D 遍历预制体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Unity3D 遍历预制体进行批量化处理。

遍历预制体

有时候,我们需要对一些预制体资源进行批量化处理,如果每一个预制体都手动处理,就会耗费很多时间精力,也容易出错。

我们可以写一个脚本遍历预制体,对预制体进行修改,然后保存。

遍历文件路径

Editor 文件夹下创建一个脚本 TraverseAssets.cs,包含一个方法 TraversePrefab,加上 MenuItem 创建一个菜单栏按钮。

使用 Directory.GetFiles 方法,传入根目录的路径 path 和通配符 *.prefab,表示从 Assets 文件夹下获取所有以 .prefab 结尾的文件路径。

using System.IO;
using UnityEngine;
using UnityEditor;public class TraverseAssets
{public static string path = "Assets/";[MenuItem("搜索工具/遍历预制体")]public static void TraversePrefab(){var allfiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (var file in allfiles){Debug.Log(file);}}
}

此时,菜单栏就有了搜索工具->遍历预制体按钮了。

菜单栏按钮

点击按钮,可以看到控制台打印了预制体的路径信息。

控制台打印信息

接下来,根据路径信息,加载预制体。

使用 AssetDatabase.LoadAssetAtPath 方法,把路径传入,就可以得到一个 GameObject

using System.IO;
using UnityEngine;
using UnityEditor;public class TraverseAssets
{public static string path = "Assets/";[MenuItem("搜索工具/遍历预制体")]public static void TraversePrefab(){var allfiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (var file in allfiles){GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(file);if (go){Debug.Log(go.name);}}}
}

再次点击菜单栏按钮,可以看到控制台打印的是已加载预制体的名称了。

控制台打印预制体名称

修改预制体并保存

假设现在有个需求,搜索带有 SpriteRenderer 组件的预制体,把组件上的 Order in Layer 统一改成 100。

目前工程中,有两个预制体带有该组件,并且目标参数此时的值为 0。另外两个预制体没有该组件。

预制体预览

修改一下脚本,从加载出来的 GameObject 上获取 SpriteRenderer 组件,如果存在,则对 sortingOrder 进行修改,然后使用 PrefabUtility.SavePrefabAsset 方法保存预制体。

在循环结束后,使用 AssetDatabase.Refresh 对资源进行刷新。

using System.IO;
using UnityEngine;
using UnityEditor;public class TraverseAssets
{public static string path = "Assets/";[MenuItem("搜索工具/遍历预制体")]public static void TraversePrefab(){var allfiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (var file in allfiles){GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(file);if (go){SpriteRenderer sr = go.GetComponent<SpriteRenderer>();if (sr){sr.sortingOrder = 100;}}PrefabUtility.SavePrefabAsset(go);}AssetDatabase.Refresh();}
}

点击菜单栏按钮,可以看到预制体已经被修改了,Order in Layer 都变成了 100。

预制体修改后

至此,我们已经能够遍历资源文件夹,找出预制体,对它们统一进行需求上的处理,并保存修改。

编辑窗口

结合上一篇文章《Unity3D 自定义窗口》,我们可以制作一个窗口,把脚本里的一些参数提取出来,方便编辑。

主要是使用 EditorGUILayout.TextField 把参数呈现到文本输入框,例如 path 和 sortingOrder,在用户修改了文本输入框的内容后,这两个变量参数也会随之修改,在具体逻辑处使用这两个变量参数即可。

注意:因为文本输入框的内容是 string 类型,这里的 sortingOrder 需要使用 int.Parse 进行类型转换。

using System.IO;
using UnityEngine;
using UnityEditor;public class TraverseAssets : EditorWindow
{public static string path = "Assets/";public static string sortingOrder = "100";[MenuItem("搜索工具/遍历预制体")]public static void OpenWindow(){// 创建窗口对象TraverseAssets window = GetWindow<TraverseAssets>();// 设置窗口标题window.titleContent = new GUIContent("搜索工具");// 显示窗口window.Show();}void OnGUI(){GUILayout.Label("自定义搜索工具,可以遍历资源并修改");GUILayout.Space(10);path = EditorGUILayout.TextField("根目录", path);sortingOrder = EditorGUILayout.TextField("层级排序", sortingOrder);GUILayout.Space(10);if (GUILayout.Button("确定", GUILayout.Height(50))){TraversePrefab();}}public static void TraversePrefab(){var allfiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (var file in allfiles){GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(file);if (go){SpriteRenderer sr = go.GetComponent<SpriteRenderer>();if (sr){sr.sortingOrder = int.Parse(sortingOrder);}}PrefabUtility.SavePrefabAsset(go);}AssetDatabase.Refresh();}
}

现在点击菜单栏按钮,就会打开一个编辑窗口,可以修改参数,点击确定按钮就会对预制体进行修改并保存。

我们可以修改根目录,指定某个文件夹路径,对部分预制体进行修改,也可以指定层级排序,不需要修改脚本。

编辑窗口

小结

使用的方法:

  • 遍历资源文件 Directory.GetFiles
  • 根据路径加载资源 AssetDatabase.LoadAssetAtPath
  • 保存预制体 PrefabUtility.SavePrefabAsset
  • 刷新资源 AssetDatabase.Refresh

可以制作一个编辑窗口,让参数的编辑更加方便。

除了修改层级排序,还可以替换图片、修改材质等,可以自行扩展功能。

这篇关于Unity3D 遍历预制体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105928

相关文章

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

hashmap的存值,各种遍历方法

package com.jefflee;import java.util.HashMap;import java.util.Iterator;import java.util.Map;public class HashmapTest {// 遍历Hashmap的四种方法public static void main(String[] args) {//hashmap可以存一个null,把

Knight Moves -uva 简单的BFS遍历

昨天刚学了BFS的遍历,在uva上找了个题敲了出来,感觉还不错,最近敲代码挺有手感的,希望这种状态保持下去 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 10 + 5#define LEN 100 + 10using namespace std;in

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam = Camera.main; // pre-defined...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray

二叉树的层次遍历(10道)

(写给未来遗忘的自己) 102.二叉数的层序遍历(从上到下) 题目: 代码: class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; queue<TreeNode*> node; if (root == nullptr) {