做3D方面的同学们不知道是否会频繁碰见这样的问题:
1.美术给的模型或者动画的材质因为第三方渲染器的原因导入unity后就只剩下无贴图的原始材质球,只好苦逼的一个个上贴图材质,上了一个也就罢了,后面的一个个都要上。
2.为了整理工程资源一不下心把材质球和模型关联全搞无了,大量重复的去一个个拖材质球。
3.存在多维材质的模型无法用传统的右键复制材质球属性然后粘贴过去。
我就碰到了。。。。。。美术那边给的人物动画是多维材质,一个物体上20多个材质球,因为动画好几个,所以有多个存在多维材质的FBX。我们知道FBX导入unity后你要修改导入材质的Location,要不然材质没法修改属性,但是这样的话就会生成一套材质球,如果这些FBX所用材质球完全不一样那倒没什么,但是如果他们用的材质大部分都是一样的,那生成的多套材质球就造成了空间和性能上的浪费。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehavIoUr {
public Material mat;
void Start() {
GetComponent<Renderer>().material.copyPropertiesFromMaterial(mat);
}
}
但是这个复制只能在运行的时候搞,那我总不能运行的时候花费一段时间和性能去干这个事情啊,于是又想到了编辑器扩展。于是,靠百度大法写了一个复制材质、多维材质的编辑器脚本,也分享给有需要的小伙伴们。
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class copyMaterials : EditorWindow
{
public GameObject mOrigin;
public GameObject mTarget;
protected GUIStyle mFirstTitleLabelStyle = new GUIStyle();
protected GUIStyle mSecondTitleLabelStyle = new GUIStyle();
[MenuItem("Window/copyMaterials")]
protected static void OnMenuClick()
{
OpenWindow();
}
protected static void OpenWindow()
{
EditorWindow window = EditorWindow.Getwindow<copyMaterials>();
window.autoRepaintOnSceneChange = true;
window.titleContent = new GUIContent("copyWindow");
int screenWidthInt = 1920;
int screenHeightInt = 1080;
int windowWidthInt = 480;
int windowHeightInt = 400;
window.position = new Rect(screenWidthInt / 2 - windowWidthInt / 2,
screenHeightInt / 2 - windowHeightInt / 2,
windowWidthInt,
windowHeightInt);
}
private void OnGUI()
{
mOrigin = Selection.activeGameObject;
mFirstTitleLabelStyle.fontSize = 14;
mFirstTitleLabelStyle.normal.textColor = Color.white;
mSecondTitleLabelStyle.fontSize = 12;
mSecondTitleLabelStyle.fontStyle = FontStyle.Bold;
mSecondTitleLabelStyle.normal.textColor = Color.white;
EditorGUILayout.BeginVertical();
EditorGUILayout.Space();
EditorGUILayout.LabelField("[ 目标物体 ]", mSecondTitleLabelStyle);
EditorGUILayout.Space();
EditorGUILayout.LabelField("当前选中物体");
mOrigin = (GameObject)EditorGUILayout.ObjectField(mOrigin, typeof(GameObject), true, GUILayout.MaxWidth(200));
EditorGUILayout.Space();
EditorGUILayout.LabelField("[ 复制物体 ]", mSecondTitleLabelStyle);
mTarget = (GameObject)EditorGUILayout.ObjectField(mTarget, typeof(GameObject), true, GUILayout.MaxWidth(200));
EditorGUILayout.Space();
EditorGUILayout.Space();
if (GUILayout.Button("复制")) copyButtonClick();
EditorGUILayout.EndVertical();
}
void copyButtonClick()
{
if (mOrigin.transform.childCount == 0)
{
List<Material> materials = new List<Material>();
mOrigin.GetComponent<Renderer>().GetSharedMaterials(materials);
mTarget.GetComponent<Renderer>().materials = materials.ToArray();
}
else
{
foreach (Transform item in mOrigin.transform)
{
if (item.GetComponent<Renderer>() == null) continue;
if (mTarget.transform.Find(item.name))
{
List<Material> materials = new List<Material>();
item.GetComponent<Renderer>().GetSharedMaterials(materials);
mTarget.transform.Find(item.name).GetComponent<Renderer>().materials = materials.ToArray();
}
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。