Main/Assets/Launcher/ExternalLibs/SceneDataSplit/SceneAssetsDiscriptFile.cs
2025-01-25 04:38:09 +08:00

709 lines
25 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using UnityEngine;
namespace Thousandto.Launcher.ExternalLibs
{
/// <summary>
/// 场景地图区域数据
/// </summary>
public class SceneAssetsDiscriptFile : MonoBehaviour
{
#region//私有变量
private int _multiLevel = 0;
private List<string> _listMeshPath = new List<string>();
private List<string> _listCombinMeshPath = new List<string>();
//texture路径字典
private List<string> _listTexName = new List<string>();
private List<Transform> _transList = new List<Transform>();
//材质球属性字典
private Dictionary<string, MatAssetsProperty> _dicMatProperty = new Dictionary<string, MatAssetsProperty>();
//mesh合并数据
//private Dictionary<int, List<CombinData>> _dicCombinData = new Dictionary<int, List<CombinData>>();
private List<RefrenceSize> _refrenceList = new List<RefrenceSize>();
private List<Texture> _cacheSceneTexs = new List<Texture>();
private SceneMultiTexScript _multiTexScript = null;
//场景纹理multi等级数据块
float[] _multiLevels = null;
#endregion
#region//公共变量
//格子行列(这里默认行列相等)
//public int RowCol = 0;
public int[] RC = null;
//格子宽
public int[] CW = null;
//public int CelWidth = 30;
//地图最小坐标
public Vector2 Min = Vector2.zero;
//地图最大坐标
public Vector2 Max = Vector2.zero;
public RegionPart[] PBig = null;
public RegionPart[] PMidle = null;
public RegionPart[] PSmall = null;
//所有物件纹理的路径
public string[] TexNames = null;
//所有物件mesh的路径
//public string[] MeshPaths = null;
//合并后的mesh路径
//public string[] CombinMeshPath = null;
//所有物件mat属性
public MatAssetsProperty[] MatP_Dic = null;
public static bool IsShowLine = true; //是否显示划线
#endregion
#region// MonoBehaviour重载函数
private void Start()
{
//Core编译会报错先屏蔽掉 dinghuaqiang
//Code.Center.SceneRestoreProxy.SetSceneRestoreHandle();
RestoreMats();
}
private void OnDestroy()
{
//移除特效贴图
SceneRestoreRunTimeUtils.ReleaseTexture();
#if !UNITY_EDITOR
//移除场景贴图
for (int i = 0; i < _cacheSceneTexs.Count; i++)
{
Resources.UnloadAsset(_cacheSceneTexs[i]);
_cacheSceneTexs[i] = null;
}
_cacheSceneTexs.Clear();
#endif
//干掉材质球
var enumer = _dicSceneMat.GetEnumerator();
try
{
while (enumer.MoveNext())
{
var mat = enumer.Current.Value;
if (mat != null)
{
SceneRestoreRunTimeUtils.FreeMaterial(mat);
}
}
}
finally {
enumer.Dispose();
}
}
#endregion
#region//公共接口
private Dictionary<int, Material> _dicSceneMat = new Dictionary<int, Material>();
public void RestoreMats()
{
if (MatP_Dic != null && MatP_Dic.Length > 0)
{
SetParts(PBig);
SetParts(PMidle);
SetParts(PSmall);
}
}
private void SetParts(RegionPart[] parts)
{
for (int i = 0; i < parts.Length; i++)
{
SetPartRender(parts[i]);
}
}
private void SetPartRender(RegionPart part)
{
if (part == null)
return;
for (int i = 0; i < part.Descripts.Length; i++)
{
var descrip = part.Descripts[i];
if (descrip.Trans != null)
{
if (descrip.MatsData != null && descrip.MatsData.Length > 0)
{
SetMaterial(descrip.MatsData, descrip.Trans, descrip.RdType);
}
}
}
}
private void SetMaterial(MatrialAssetData[] dataArray, Transform trans, RendererType type)
{
var trailIndex = -1;
Material[] mats = new Material[dataArray.Length];
for (int i = 0; i < dataArray.Length; i++)
{
Material mat = null;
if (!_dicSceneMat.TryGetValue(dataArray[i].Index, out mat))
{
mat = RestoreMaterail(dataArray[i]);
_dicSceneMat.Add(dataArray[i].Index, mat);
}
if(dataArray[i].IsTrail)
{
trailIndex = i;
}
mats[i] = mat;
}
switch (type)
{
case RendererType.MeshRenderer:
{
MeshRenderer mRd = trans.GetComponent<MeshRenderer>();
mRd.sharedMaterials = mats;
}
break;
case RendererType.SkinMesh:
{
SkinnedMeshRenderer sRd = trans.GetComponent<SkinnedMeshRenderer>();
sRd.sharedMaterials = mats;
}
break;
case RendererType.ParticleSystemRenderer:
{
ParticleSystemRenderer pRd = trans.GetComponent<ParticleSystemRenderer>();
if(trailIndex >= 0)
{
pRd.sharedMaterials = mats;
Material mat = null;
if (_dicSceneMat.TryGetValue(dataArray[trailIndex].Index, out mat))
{
pRd.trailMaterial = mat;
}
}
pRd.sharedMaterials = mats;
}
break;
case RendererType.TrailRender:
{
TrailRenderer tRd = trans.GetComponent<TrailRenderer>();
tRd.sharedMaterials = mats;
}
break;
}
}
private Material RestoreMaterail(MatrialAssetData data)
{
if (data == null)
return null;
if (data.Index == -1)
return null;
MatAssetsProperty property = GetMatProperty(data.Index);
if (property == null)
return null;
Shader sh = ShaderFactory.Find(property.ShaderName);
if (sh == null)
{
Debug.LogError("RestoreMaterial:not find shader;;" + property.ShaderName);
return null;
}
Material mat = SceneRestoreRunTimeUtils.NewMaterial(sh);
//设置需要动态加载的纹理
if (property.TexIndexs != null)
{
//_isMatLoadFinished = false;
for (int i = 0; i < property.TexIndexs.Length; i++)
{
Texture tex = null;
//if (property.TexIndexs[i].MultiIndex != null && property.TexIndexs[i].MultiIndex.Length > 0)
//{
// var length = property.TexIndexs[i].MultiIndex.Length;
// for (int m = 0; m < length; m++)
// {
// var multiData = property.TexIndexs[i].MultiIndex[m];
// if (_multiLevels == null)
// {
// _multiLevels = GonbestGMemory.AllocFloatBlock("SceneMultiLevel", 1);
// }
// _multiLevel = (int)_multiLevels[0];
// //_multiLevel = 3;
// if (_multiLevel == multiData.MultiIndex)
// {
// if (_multiTexScript == null)
// {
// _multiTexScript = GetMultiTexScript();
// }
// if(multiData.Index< _multiTexScript.MultiTexs.Length)
// tex = _multiTexScript.MultiTexs[multiData.Index];
// }
// }
//}
//else
//{
// tex = property.TexIndexs[i].tex;
//}
tex = property.TexIndexs[i].tex;
if (property.TexIndexs[i].Index == -1)
{
mat.SetTexture(property.TexIndexs[i].Name, tex);
_cacheSceneTexs.Add(tex);
}
else
{
string texName = property.TexIndexs[i].Name;
string texPath = GetTexturePath(property.TexIndexs[i].Index);
#if FUNCELL_LAUNCHER
SceneRestoreRunTimeUtils.SetTexture(texPath, texName, (t)=> {
mat.SetTexture(texName, t);
});
#else
#if UNITY_EDITOR
texPath = ConstDefines.CN_RAW_VFX_TEXTURE_DIR + texPath;
tex = UnityEditor.AssetDatabase.LoadAssetAtPath(texPath, typeof(Texture)) as Texture;
mat.SetTexture(property.TexIndexs[i].Name, tex);
#endif
#endif
}
mat.SetTextureOffset(property.TexIndexs[i].Name, property.TexOffset[i]);
mat.SetTextureScale(property.TexIndexs[i].Name, property.TexScale[i]);
}
}
//设置四元值
if (property.Vec != null)
{
for (int i = 0; i < property.Vec.Length; i++)
{
mat.SetVector(property.Vec[i].Name, property.Vec[i].Value);
}
}
//设置颜色
if (property.Color != null)
{
for (int i = 0; i < property.Color.Length; i++)
{
mat.SetColor(property.Color[i].Name, property.Color[i].Value);
}
}
//设置float值
if (property.Float != null)
{
for (int i = 0; i < property.Float.Length; i++)
{
mat.SetFloat(property.Float[i].Name, property.Float[i].Value);
}
}
//设置renderQueen
if (property.Rdq == 0)
{
mat.renderQueue = sh.renderQueue;
}
else
{
mat.renderQueue = property.Rdq;
}
return mat;
}
public void Initialized()
{
RC = new int[(int)CellType.Count];
for (int i = 0; i < (int)CellType.Count; i++)
{
RC[i] = 1;
}
CW = new int[(int)CellType.Count];
CW[0] = (int)CellWideType.Wide_0;
CW[1] = (int)CellWideType.Wide_1;
CW[2] = (int)CellWideType.Wide_2;
RefrenceSize size1 = new RefrenceSize(CellType.Level_0, RefrenceSize.RootType.Big, 45, int.MaxValue);
RefrenceSize size2 = new RefrenceSize(CellType.Level_1, RefrenceSize.RootType.Mid, 3, 45);
RefrenceSize size3 = new RefrenceSize(CellType.Level_2, RefrenceSize.RootType.Small, 0, 3);
_refrenceList.Add(size1);
_refrenceList.Add(size2);
_refrenceList.Add(size3);
}
public void SetRegion(Vector2 min, Vector3 max, CellType type)
{
RC[(int)type] = 1;
Min = min;
Max = max;
float wide = max.x - min.x;
float high = max.y - min.y;
float celWide = wide / RC[(int)type];
SetPart(celWide, wide, type);
celWide = wide / RC[(int)type];
float celHigh = high / RC[(int)type];
int count = (int)Mathf.Pow(RC[(int)type], 2);
var parts = NewParts(type, count);
for (int i = 0; i < count; i++)
{
RegionPart part = new RegionPart(i, RC[(int)type], celWide, celHigh, Min);
parts[i] = part;
}
}
public int GetTexturePathIndex(string name, string path)
{
int index = 0;
if (path.Contains(ConstDefines.CN_RAW_VFX_TEXTURE_DIR))
{
path = path.Replace(ConstDefines.CN_RAW_VFX_TEXTURE_DIR, "");
}
if (_listTexName.Contains(path))
{
for (int i = 0; i < _listTexName.Count; i++)
{
if (string.Equals(_listTexName[i], path))
return i;
}
}
else
{
_listTexName.Add(path);
return _listTexName.Count - 1;
}
return index;
}
public void ConvertTexPath()
{
TexNames = _listTexName.ToArray();
_listTexName.Clear();
_listTexName = null;
}
public string GetTexturePath(int index)
{
if (index <= TexNames.Length - 1)
{
return TexNames[index];
}
return string.Empty;
}
public void ConvertMeshPath()
{
//MeshPaths = _listMeshPath.ToArray();
}
public void ConvertCombinMeshPath()
{
//CombinMeshPath = _listCombinMeshPath.ToArray();
}
public int GetMeshPathIndex(string path)
{
int index = _listMeshPath.IndexOf(path);
if(index < 0)
{
_listMeshPath.Add(path);
return _listMeshPath.Count - 1;
}
return index;
}
public string GetMeshPath(int index)
{
//if (MeshPaths !=null && index < MeshPaths.Length)
//{
// return MeshPaths[index];
//}
return string.Empty;
}
//获取合并后mesh 的路径索引
public int GetCombinMeshPathIndex(string path)
{
int index = _listCombinMeshPath.IndexOf(path);
if (index < 0)
{
_listCombinMeshPath.Add(path);
return _listCombinMeshPath.Count - 1;
}
return index;
}
//获取合并后的mesh路径
public string GetCombinMeshPath(int index)
{
//if (CombinMeshPath != null && index < CombinMeshPath.Length)
//{
// return CombinMeshPath[index];
//}
return string.Empty;
}
//获取物件的index
public int GetObjIndex(Transform trans)
{
int index = -1;
if (trans == null)
return index;
index = _transList.IndexOf(trans);
if (index < 0)
{
_transList.Add(trans);
return _transList.Count - 1;
}
return index;
}
public int GetMatPropertyIndex(MatAssetsProperty property)
{
var name = property.name;
int index = 0;
var enumer = _dicMatProperty.GetEnumerator();
try
{
//shander 参数是设置相等
bool isEqual = true;
//是否找到同名shander或者 ReName的同名shander
bool isFind = false;
while (enumer.MoveNext())
{
if (string.Equals(enumer.Current.Key, name) || enumer.Current.Key.Contains(string.Format("{0}_ReName", name)))//
{
isEqual = true;
isFind = true;
MatAssetsProperty mp = enumer.Current.Value;
for (int i = 0; i < mp.Vec.Length; i++)
{
if (mp.Vec.Length != property.Vec.Length)
isEqual = false;
else
{
if (!string.Equals(mp.Vec[i].Name, property.Vec[i].Name))
isEqual = false;
if (mp.Vec[i].Value != property.Vec[i].Value)
isEqual = false;
}
}
if (mp.TexIndexs.Length != property.TexIndexs.Length)
isEqual = false;
else
{
for (int i = 0; i < mp.TexIndexs.Length; i++)
{
if (mp.TexIndexs[i].tex != property.TexIndexs[i].tex)
isEqual = false;
else
{
if (mp.TexIndexs[i].tex == null)
{
if (mp.TexIndexs[i].Index != property.TexIndexs[i].Index)
isEqual = false;
}
}
}
}
for (int i = 0; i < mp.Color.Length; i++)
{
if (mp.Color.Length != property.Color.Length)
isEqual = false;
else
{
if (!string.Equals(mp.Color[i].Name, property.Color[i].Name))
isEqual = false;
if (mp.Color[i].Value != property.Color[i].Value)
isEqual = false;
}
}
for (int i = 0; i < mp.Float.Length; i++)
{
if (mp.Float.Length != property.Float.Length)
isEqual = false;
else
{
if (!string.Equals(mp.Float[i].Name, property.Float[i].Name))
isEqual = false;
if (mp.Float[i].Value != property.Float[i].Value)
isEqual = false;
}
}
for (int i = 0; i < mp.TexOffset.Length; i++)
{
if (mp.TexOffset.Length != property.TexOffset.Length)
isEqual = false;
else
{
if (mp.TexOffset[i] != property.TexOffset[i])
isEqual = false;
}
}
for (int i = 0; i < mp.TexScale.Length; i++)
{
if (mp.TexScale.Length != property.TexScale.Length)
isEqual = false;
else
{
if (mp.TexScale[i] != property.TexScale[i])
isEqual = false;
}
}
if (mp.Rdq != property.Rdq)
{
isEqual = false;
}
if (isEqual)
{
//如果找到想的设置参数的shader 直接返回索引
return index;
}
}
index += 1;
}
if (isFind)
{
if (!isEqual)
{
//如果shader设置不相等 添加进Dic 重置名字
string key = string.Format("{0}_ReName_{1}", name, _dicMatProperty.Count - 1);
_dicMatProperty[key] = property;
property.name = "";
return _dicMatProperty.Count - 1;
}
}
else
{
//如果没有找到 直接添加进dic
_dicMatProperty[name] = property;
property.name = "";
return _dicMatProperty.Count - 1;
}
}
finally
{
enumer.Dispose();
}
return -1;
}
public MatAssetsProperty GetMatProperty(int index)
{
if (MatP_Dic != null && index < MatP_Dic.Length)
{
return MatP_Dic[index];
}
return null;
}
public void ConvertMatProperty()
{
List<MatAssetsProperty> list = new List<MatAssetsProperty>();
var enumer = _dicMatProperty.GetEnumerator();
try
{
while (enumer.MoveNext())
{
list.Add(enumer.Current.Value);
}
}
finally
{
enumer.Dispose();
}
MatP_Dic = list.ToArray();
_dicMatProperty.Clear();
_dicMatProperty = null;
}
public RegionPart[] GetParts(CellType type)
{
RegionPart[] parts = null;
switch (type)
{
case CellType.Level_0:
parts = PBig;
break;
case CellType.Level_1:
parts = PMidle;
break;
case CellType.Level_2:
parts = PSmall;
break;
}
return parts;
}
public RefrenceSize GetRefSize(CellType type)
{
for (int i = 0; i < _refrenceList.Count; i++)
{
if (_refrenceList[i].Type == type)
return _refrenceList[i];
}
return null;
}
public SceneMultiTexScript GetMultiTexScript()
{
if (_multiTexScript == null)
{
_multiTexScript = transform.GetComponent<SceneMultiTexScript>();
}
return _multiTexScript;
}
#endregion
#region//私有函数
private void SetPart(float celWide, float wide, CellType type)
{
if (celWide > CW[(int)type])
{
RC[(int)type] += 1;
celWide = wide / RC[(int)type];
SetPart(celWide, wide, type);
}
}
private RegionPart[] NewParts(CellType type, int count)
{
switch (type)
{
case CellType.Level_0:
return PBig = new RegionPart[count];
case CellType.Level_1:
return PMidle = new RegionPart[count];
case CellType.Level_2:
return PSmall = new RegionPart[count];
}
return null;
}
private void OnDrawGizmos()
{
if (!IsShowLine)
return;
CellType type = CellType.Level_2;
Gizmos.color = Color.red;
var parts = GetParts(type);
if (parts == null || RC == null || RC.Length < 3)
return;
int tolCl = parts.Length / RC[2]; //总行数
int tolRl = RC[2]; //总列数
for (int i = 0; i < tolCl; i++)
{
Gizmos.DrawLine(parts[i * RC[2]].GetMin() + new Vector3(0f, 27, 0f), parts[i * RC[2] + (RC[2] - 1)].GetMin() +
new Vector3(parts[i * RC[2] + (RC[2] - 1)].GetBounds().size.x, 27f, 0f));
}
Gizmos.DrawLine(parts[(tolCl - 1) * RC[2]].GetMin() + new Vector3(0f, 27f, parts[(tolCl - 1) * RC[2]].GetBounds().size.z),
parts[(tolCl - 1) * RC[2] + (RC[2] - 1)].GetMax() + new Vector3(0f, 27, 0f));
Gizmos.color = Color.blue;
for (int i = 0; i < tolRl; i++)
{
Gizmos.DrawLine(parts[i].GetMin() + new Vector3(0f, 27, 0f), parts[RC[2] * (tolRl - 1) + i].GetMin() + new Vector3(0f, 27f, parts[RC[2] * (tolRl - 1) + i].GetBounds().size.z));
}
Gizmos.DrawLine(parts[tolRl - 1].GetMin() + new Vector3(parts[tolRl - 1].GetBounds().size.x, 27f, 0f)
, parts[RC[2] * (tolRl - 1) + (tolRl - 1)].GetMax() + new Vector3(0f, 27, 0f));
Gizmos.color = Color.blue;
//Gizmos.DrawCube(Parts[0].Center, new Vector3(Parts[0].Bounds.size.x, 0f, Parts[0].Bounds.size.z));
Gizmos.DrawCube(new Vector3(Min.x, 10, Min.y), new Vector3(10, 10, 10));
Gizmos.color = Color.green;
Gizmos.DrawCube(new Vector3(Max.x, 10, Max.y), new Vector3(10, 10, 10));
}
#endregion
}
}