using System; using System.Collections.Generic; using System.IO; using UnityEngine; namespace Thousandto.Launcher.ExternalLibs { /// /// 材质球资源数据 /// [Serializable] public class MatrialAssetData { //材质属性索引 public int Index = -1; //是否是拖尾材质球 public bool IsTrail = false; private SceneAssetsDiscriptFile _script = null; #region//公共函数 /// /// /// /// /// /// /// 是否是子材质球 public void SetMatrialAssetData(SceneNodeCommpent node, Material mat, Material defaultMat, SceneAssetsDiscriptFile script, bool isSubMat = false, int index= 0) { #if UNITY_EDITOR if (!isSubMat) { //if (!node.IsSaveTexture) //{ // SetMatSaveData(node, mat, defaultMat, script); //} //else //{ // Index = node.MatProList[index]; //} SetMatSaveData(node, mat, defaultMat, script); } else { if (!node.IsSaveSuMatTex(index)) { SetMatSaveData(node, mat, defaultMat, script, true); } else { Index = node.MatProList[index]; } } #endif } #endregion #region//私有函数 //设置材质球数据 private void SetMatSaveData(SceneNodeCommpent node, Material mat, Material defaultMat, SceneAssetsDiscriptFile script, bool isSubMat = false) { if (mat == null) return; var shader = mat.shader; Shader defaultShader = null; if (defaultMat != null) { defaultShader = defaultMat.shader; } _script = script; //获取shader属性个数 List texPrIndex = new List(); List vectorList = new List(); List colorList = new List(); List floatList = new List(); List texOffsetList = new List(); List texScaleList = new List(); MatAssetsProperty property = new MatAssetsProperty(); property.name = shader.name;//mat.name; property.matName = mat.name; #if UNITY_EDITOR int shaderPropertyCount = UnityEditor.ShaderUtil.GetPropertyCount(shader); for (int i = 0; i < shaderPropertyCount; i++) { var type = UnityEditor.ShaderUtil.GetPropertyType(shader, i); var name = UnityEditor.ShaderUtil.GetPropertyName(shader, i); if (node.IsUseDefaultShader) { if (type != UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv) continue; } switch (type) { case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv: Texture tex = null; Vector2 offset = Vector2.zero; Vector2 scale = Vector2.one; if (node.IsUseDefaultShader) { tex = mat.mainTexture; } else { tex = mat.GetTexture(name); offset = mat.GetTextureOffset(name); scale = mat.GetTextureScale(name); } if (tex != null) { string folderPath = string.Empty; bool isVfxTex = false; string path = UnityEditor.AssetDatabase.GetAssetPath(tex); if (path.Contains("vfx/fxresources/texture")) { isVfxTex = true; } //string path = GetTexturePath(tex, ref folderPath, ref isVfxTex); MatTexPropertyIndex texData = new MatTexPropertyIndex(); if (isVfxTex) { //string fullPath = GetFullTexPath(tex); int index = script.GetTexturePathIndex(name, path); texData.Index = index; texData.tex = null; } else { texData.Index = -1; texData.tex = tex; } texData.Name = name; var multiScript = _script.GetMultiTexScript(); List tempList = new List(); if (multiScript != null) { int length = multiScript.MultiTexs.Length; for (int k = 0; k < length; k++) { var multiTex = multiScript.MultiTexs[k]; string[] strs = tex.name.Split('_'); if (strs.Length > 1) { if (multiTex.name.Contains(strs[0])) { strs = multiTex.name.Split('_'); if (strs.Length > 1) { int multiIndex = int.TryParse(strs[1], out multiIndex) ? multiIndex : 0; MultiTexIndex data = new MultiTexIndex(); data.Index = k; data.MultiIndex = multiIndex; tempList.Add(data); } } } } } texData.MultiIndex = tempList.ToArray(); texPrIndex.Add(texData); //保存texture资源 // folderPath = GetFolderPath(folderPath); // if (!Directory.Exists(folderPath)) // Directory.CreateDirectory(folderPath); // var savePath = GetSaveTexPath(tex); //#if UNITY_EDITOR // if (node != null && !node.IsSaveTexture) // { // if (!File.Exists(savePath) && File.Exists(fullPath)) // { // UnityEditor.AssetDatabase.CopyAsset(UnityEditor.AssetDatabase.GetAssetPath(tex), savePath); // } // } //#endif } texOffsetList.Add(offset); texScaleList.Add(scale); break; case UnityEditor.ShaderUtil.ShaderPropertyType.Vector: var vect = mat.GetVector(name); vectorList.Add(new MatPropertyVector() { Name = name, Value = vect }); break; case UnityEditor.ShaderUtil.ShaderPropertyType.Color: var color = mat.GetColor(name); colorList.Add(new MatPropertyColor() { Name = name, Value = color }); break; default: var f = mat.GetFloat(name); floatList.Add(new MatPropertyFloat() { Name = name, Value = f }); break; } } #endif //设置序列化的值 if (node.IsUseDefaultShader) { if(defaultShader!= null) property.ShaderName = defaultShader.name; } else { property.ShaderName = shader.name; } property.TexIndexs = texPrIndex.ToArray(); property.TexOffset = texOffsetList.ToArray(); property.TexScale = texScaleList.ToArray(); property.Vec = vectorList.ToArray(); property.Color = colorList.ToArray(); property.Float = floatList.ToArray(); if (mat.renderQueue <= 0) { property.Rdq = shader.renderQueue; } else { property.Rdq = mat.renderQueue; } Index = _script.GetMatPropertyIndex(property); //if (!isSubMat) //{ // if (node.MatProList.Count == 0) // { // node.MatProList.Add(MatPrIndex); // } //} //else //{ // node.MatProList.Add(MatPrIndex); //} node.MatProList.Add(Index); } private string GetTexturePath(Texture tex, ref string folderPath, ref bool isVfxTex) { isVfxTex = false; string path = string.Empty; if (tex == null) return path; #if UNITY_EDITOR path = UnityEditor.AssetDatabase.GetAssetPath(tex); if (path.Contains("vfx/fxresources/texture")) { isVfxTex = true; } #endif string[] strs = path.Split('.'); if (strs != null && strs.Length != 0) { path = strs[0]; } path = path.Replace("Assets/GameAssets/RawResources/scene/",""); string newName = tex.name; if (string.Equals(UnityEngine.SceneManagement.SceneManager.GetActiveScene().name, newName)) { newName = string.Format("{0}_tex", newName); path = path.Replace(string.Format("/{0}", tex.name),""); path = path + "/"+newName; } path = string.Format("Texture/scene/{0}", path); folderPath = path.Replace(string.Format("/{0}", tex.name), ""); return path; } //获取纹理完整路径 private string GetFullTexPath(Texture tex) { string fullPath = string.Empty; if (tex != null) { string assetPath = string.Empty; #if UNITY_EDITOR assetPath = UnityEditor.AssetDatabase.GetAssetPath(tex); #endif int index = assetPath.LastIndexOf("GameAssets"); if (index >= 0) { assetPath = assetPath.Substring(index); } fullPath = Application.dataPath + "/" + assetPath; } //string[] strs = fullPath.Split('.'); //if (strs != null && strs.Length != 0) //{ // fullPath = strs[0]; //} return fullPath; } //获取纹理文件夹的路径 private string GetFolderPath(string path) { var folderPath = string.Format("GameAssets/Resources/{0}", path); folderPath = Application.dataPath + "/" + folderPath; return folderPath; } //获取纹理资源路劲 public string GetSaveTexPath( Texture tex ) { string path = string.Empty; if (tex == null) return path; #if UNITY_EDITOR path = UnityEditor.AssetDatabase.GetAssetPath(tex); #endif path = path.Replace("Assets/GameAssets/RawResources/scene/", ""); string newName = tex.name; if (string.Equals(UnityEngine.SceneManagement.SceneManager.GetActiveScene().name, newName)) { newName = string.Format("{0}_tex", newName); path = path.Replace(string.Format("/{0}", tex.name), "/"); path = path.Replace(".", string.Format("{0}.",newName));//path + "/"+newName; } path = string.Format("Texture/scene/{0}", path); string savePath = Application.dataPath + string.Format("/GameAssets/Resources/{0}", path); return savePath; } #endregion } /// /// 材质球资源属性 /// [Serializable] public class MatAssetsProperty { public string matName = string.Empty; public string name = string.Empty; //shader名字 public string ShaderName = string.Empty; //纹理列表 public MatTexPropertyIndex[] TexIndexs; //四元值列表 public MatPropertyVector[] Vec; //颜色列表 public MatPropertyColor[] Color; //浮点值列表 public MatPropertyFloat[] Float; //纹理的偏移 public Vector2[] TexOffset; //纹理的缩放信息--tile public Vector2[] TexScale; //记录RenderQueen public int Rdq = 0; } }