Files
Main/Assets/Launcher/ExternalLibs/SceneDataSplit/SceneSplit.cs

998 lines
47 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Gonbest.MagicCube;
using UnityEngine.SceneManagement;
namespace Thousandto.Launcher.ExternalLibs
{
public class SceneSplit
{
private const string _rootName = "SceneRoot";
private const string _vfxName = "[vfx]";
private const string _farName = "[far]";
private const string _nearName = "[near]";
private const string _midle = "[midle]";
private const string _timeLine = "[timeline]";
private GameObject _sceneRoot = null;
private GameObject _effectRoot = null;
private SceneAssetsDiscriptFile _sceneScript = null;
private List<SceneNodeCommpent> _childs = new List<SceneNodeCommpent>();
private Dictionary<int, Mesh> _dicCombinMesh = new Dictionary<int, Mesh>();
private List<SceneNodeCommpent> _tempNodeList = new List<SceneNodeCommpent>(500);
//替换shader
private Shader _replaceShader = null;
private Material _replaceMat = null;
//默认场景shader
private Shader _defaultShader = null;
private Material _defaultMat = null;
private bool _isHideObj = false;
#region//私有函数
//初始化Root
private void InitRoot()
{
if (_sceneRoot == null)
_sceneRoot = GameObject.Find(_rootName);
//if (_effectRoot == null)
// _effectRoot = _sceneRoot.transform.Find(_vfxName).gameObject;
_childs.Clear();
Renderer[] f_rdList = null;
Renderer[] n_rdList = null;
Renderer[] m_rdList = null;
Renderer[] pf_rdList = null;
Renderer[] pm_rdList = null;
Renderer[] pn_rdList = null;
Renderer[] pn_rdList_hide = null;
Renderer[] ot_rdList = null;
for (int i = 0; i < _sceneRoot.transform.childCount; i++)
{
var child = _sceneRoot.transform.GetChild(i);
if (child.name == _farName)
{
f_rdList = child.GetComponentsInChildren<Renderer>(true);
for (int j = 0; j < f_rdList.Length; j++)
{
if (f_rdList[j].transform)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = f_rdList[j].transform;
node.RootType = NodeRootType.FarRoot;
if (f_rdList[j] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (f_rdList[j] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (f_rdList[j] is ParticleSystemRenderer)
{
node.RenderType = RendererType.ParticleSystemRenderer;
node.RootType = NodeRootType.ParticFar;
}
AddNode(node);
}
}
}
else if (child.name == _nearName)
{
//添加Near节点
n_rdList = child.GetComponentsInChildren<Renderer>(true);
for (int j = 0; j < n_rdList.Length; j++)
{
if (n_rdList[j].transform)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = n_rdList[j].transform;
node.RootType = NodeRootType.NearRoot;
if (n_rdList[j] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (n_rdList[j] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (n_rdList[j] is ParticleSystemRenderer)
{
node.RenderType = RendererType.ParticleSystemRenderer;
node.RootType = NodeRootType.ParticNear;
}
AddNode(node);
}
}
}
else if (child.name == _midle)
{
//添加Midle节点
m_rdList = child.GetComponentsInChildren<Renderer>(true);
for (int j = 0; j < m_rdList.Length; j++)
{
if (m_rdList[j].transform)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = m_rdList[j].transform;
node.RootType = NodeRootType.MidleRoot;
if (m_rdList[j] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (m_rdList[j] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (m_rdList[j] is ParticleSystemRenderer)
{
node.RenderType = RendererType.ParticleSystemRenderer;
node.RootType = NodeRootType.ParticMidle;
}
AddNode(node);
}
}
}
else if (child.name == _vfxName)
{
for (int m = 0; m < child.childCount; m++)
{
var pChild = child.GetChild(m);
if (pChild.name == "[1]" || pChild.name == "[2]" || pChild.name == "[3]")
{
for (int k = 0; k < pChild.childCount; k++)
{
var ppChild = pChild.GetChild(k);
if (ppChild.name == "[far]")
{
pf_rdList = ppChild.GetComponentsInChildren<Renderer>(true);
//添加粒子Far节点
for (int n = 0; n < pf_rdList.Length; n++)
{
ParticleSystemRenderer prd = pf_rdList[n].GetComponent<ParticleSystemRenderer>();
if (prd != null)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = pf_rdList[n].transform;
node.RenderType = RendererType.ParticleSystemRenderer;
node.RootType = NodeRootType.ParticFar;
AddNode(node);
}
else
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = pf_rdList[n].transform;
node.RootType = NodeRootType.NearRoot;
if (pf_rdList[n] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (pf_rdList[n] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (pf_rdList[n] is TrailRenderer)
node.RenderType = RendererType.TrailRender;
AddNode(node);
}
}
}
else if (ppChild.name == "[midle]")
{
pm_rdList = ppChild.GetComponentsInChildren<Renderer>(true);
//添加粒子Near节点
for (int n = 0; n < pm_rdList.Length; n++)
{
ParticleSystemRenderer prd = pm_rdList[n].GetComponent<ParticleSystemRenderer>();
if (prd != null)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = pm_rdList[n].transform;
node.RenderType = RendererType.ParticleSystemRenderer;
node.RootType = NodeRootType.ParticMidle;
AddNode(node);
}
else
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = pm_rdList[n].transform;
node.RootType = NodeRootType.MidleRoot;
if (pm_rdList[n] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (pm_rdList[n] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (pm_rdList[n] is TrailRenderer)
node.RenderType = RendererType.TrailRender;
AddNode(node);
}
}
}
else if (ppChild.name == "[near]")
{
pn_rdList = ppChild.GetComponentsInChildren<Renderer>(true);
//添加粒子Near节点
for (int n = 0; n < pn_rdList.Length; n++)
{
ParticleSystemRenderer prd = pn_rdList[n].GetComponent<ParticleSystemRenderer>();
if (prd != null)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = pn_rdList[n].transform;
node.RenderType = RendererType.ParticleSystemRenderer;
node.RootType = NodeRootType.ParticNear;
AddNode(node);
}
else
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = pn_rdList[n].transform;
node.RootType = NodeRootType.NearRoot;
if (pn_rdList[n] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (pn_rdList[n] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (pn_rdList[n] is TrailRenderer)
node.RenderType = RendererType.TrailRender;
AddNode(node);
}
}
}
else if (ppChild.name == "[nearHide]")
{
pn_rdList_hide = ppChild.GetComponentsInChildren<Renderer>(true);
//添加粒子Near节点
for (int n = 0; n < pn_rdList_hide.Length; n++)
{
ParticleSystemRenderer prd = pn_rdList[n].GetComponent<ParticleSystemRenderer>();
if (prd != null)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = pn_rdList_hide[n].transform;
node.RenderType = RendererType.ParticleSystemRenderer;
node.RootType = NodeRootType.ParticNearHide;
AddNode(node);
}
else
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = pn_rdList_hide[n].transform;
node.RootType = NodeRootType.NearRoot;
if (pn_rdList_hide[n] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (pn_rdList_hide[n] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (pn_rdList_hide[n] is TrailRenderer)
node.RenderType = RendererType.TrailRender;
AddNode(node);
}
}
}
}
}
else
{
ot_rdList = pChild.GetComponentsInChildren<Renderer>(true);
//添加粒子Near节点
for (int n = 0; n < ot_rdList.Length; n++)
{
ParticleSystemRenderer prd = ot_rdList[n].GetComponent<ParticleSystemRenderer>();
if (prd != null)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = ot_rdList[n].transform;
node.RenderType = RendererType.ParticleSystemRenderer;
node.RootType = NodeRootType.Other;
AddNode(node);
}
else
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = ot_rdList[n].transform;
node.RootType = NodeRootType.Other;
if (ot_rdList[n] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (ot_rdList[n] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (ot_rdList[n] is TrailRenderer)
node.RenderType = RendererType.TrailRender;
AddNode(node);
}
}
}
}
}
else if (child.name == _timeLine)
{
ot_rdList = child.GetComponentsInChildren<Renderer>(true);
for (int j = 0; j < ot_rdList.Length; j++)
{
if (ot_rdList[j].transform)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = ot_rdList[j].transform;
node.RootType = NodeRootType.FarRoot;
if (ot_rdList[j] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (ot_rdList[j] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (ot_rdList[j] is ParticleSystemRenderer)
node.RenderType = RendererType.ParticleSystemRenderer;
else if (ot_rdList[j] is TrailRenderer)
node.RenderType = RendererType.TrailRender;
AddNode(node);
}
}
}
else
{
ot_rdList = child.GetComponentsInChildren<Renderer>(true);
for (int j = 0; j < ot_rdList.Length; j++)
{
if (ot_rdList[j].transform)
{
SceneNodeCommpent node = new SceneNodeCommpent();
node.Trans = ot_rdList[j].transform;
node.RootType = NodeRootType.Other;
if (ot_rdList[j] is MeshRenderer)
node.RenderType = RendererType.MeshRenderer;
else if (ot_rdList[j] is SkinnedMeshRenderer)
node.RenderType = RendererType.SkinMesh;
else if (ot_rdList[j] is ParticleSystemRenderer)
node.RenderType = RendererType.ParticleSystemRenderer;
else if (ot_rdList[j] is TrailRenderer)
node.RenderType = RendererType.TrailRender;
AddNode(node);
}
}
}
}
}
private void AddNode(SceneNodeCommpent node)
{
if (node != null)
{
node.IsActive = node.Trans.gameObject.activeSelf;
_childs.Add(node);
}
}
//开始lodmesh
private void SplitScene()
{
_isHideObj = !string.Equals(SceneManager.GetActiveScene().name, "map039");
InitRoot();
//_sceneScript = ScriptableObject.CreateInstance<SceneAssetsDiscriptFile>();
_sceneScript = RequireComponent<SceneAssetsDiscriptFile>(_sceneRoot);
_sceneScript.Initialized();
CalScene();
//#if UNITY_EDITOR
// EditorCoroutineRunner.StartEditorCoroutine();
//#endif
}
private void CalScene()
{
Vector2 min = Vector2.zero;
Vector2 max = Vector2.zero;
bool isInitMinMax = false;
for (int i = 0; i < _childs.Count; i++)
{
if (!_childs[i].Trans.gameObject.activeSelf)
continue;
Vector3 childMin = Vector3.zero;
Vector3 childMax = Vector3.zero;
var rd = _childs[i].Trans.GetComponent<Renderer>();
Mesh ms = null;
if (_childs[i].RenderType == RendererType.MeshRenderer)
{
MeshFilter mf = _childs[i].Trans.GetComponent<MeshFilter>();
ms = mf.sharedMesh;
}
else if (_childs[i].RenderType == RendererType.SkinMesh)
{
SkinnedMeshRenderer skinRender = _childs[i].Trans.GetComponent<SkinnedMeshRenderer>();
ms = skinRender.sharedMesh;
}
else if (_childs[i].RenderType == RendererType.ParticleSystemRenderer)
{
ParticleSystemRenderer prd = _childs[i].Trans.GetComponent<ParticleSystemRenderer>();
if (prd.meshCount != 0)
{
Mesh[] msArray = new Mesh[prd.meshCount];
prd.GetMeshes(msArray);
for (int j = 0; j < msArray.Length; j++)
{
if (_childs[i] == null || msArray[j] == null)
break;
ms = msArray[j];
break;
}
}
}
if (ms == null)
continue;
Vector3[] tempVec = ms.vertices;
for (int j = 0; j < tempVec.Length; j++)
{
//var time = Time.realtimeSinceStartup;
Vector3 worldVec = _childs[i].Trans.TransformPoint(tempVec[j]);
//获取最小坐标和最大坐标
if (!isInitMinMax)
{
min.x = worldVec.x;
min.y = worldVec.z;
max.x = worldVec.x;
max.y = worldVec.z;
isInitMinMax = true;
}
else
{
min.x = worldVec.x < min.x ? worldVec.x : min.x;
min.y = worldVec.z < min.y ? worldVec.z : min.y;
max.x = worldVec.x > max.x ? worldVec.x : max.x;
max.y = worldVec.z > max.y ? worldVec.z : max.y;
}
if (j == 0)
{
childMin.x = worldVec.x;
childMin.y = worldVec.z;
childMax.x = worldVec.x;
childMax.y = worldVec.z;
}
else
{
childMin.x = worldVec.x < childMin.x ? worldVec.x : childMin.x;
childMin.y = worldVec.z < childMin.y ? worldVec.z : childMin.y;
childMax.x = worldVec.x > childMax.x ? worldVec.x : childMax.x;
childMax.y = worldVec.z > childMax.y ? worldVec.z : childMax.y;
}
//time = Time.realtimeSinceStartup - time;
//UnityEngine.Debug.LogError("11111111111111111111---------:" + time);
}
_childs[i].Min = childMin;
_childs[i].Max = childMax;
}
if (Math.Abs(max.x - min.x) > 2048 || Math.Abs(max.y - min.y) > 2048)
{
#if UNITY_EDITOR
UnityEditor.SceneManagement.EditorSceneManager.CloseScene(SceneManager.GetActiveScene(), true);
Debug.LogError(string.Format("场景有一个非鸡儿远的节点!!!!!!!!!快点检查,内存着不住了了!!!!!场景名字是:{0}", SceneManager.GetActiveScene().name));
return;
#endif
}
for (int i = 0; i < (int)CellType.Count; i++)
{
_sceneScript.SetRegion(min, max, (CellType)i);
var parts = _sceneScript.GetParts((CellType)i);
CheckChild(parts, (CellType)i);
}
for (int i = 0; i < (int)CellType.Count; i++)
{
var parts = _sceneScript.GetParts((CellType)i);
for (int m = 0; m < _childs.Count; m++)
{
DifferentNode(parts, _childs[m], (CellType)i);
if (_isHideObj)
{
_childs[m].Trans.gameObject.SetActive(false);
}
}
}
for (int i = 0; i < (int)CellType.Count; i++)
{
var parts = _sceneScript.GetParts((CellType)i);
CheckPart(parts, (CellType)i);
}
//_sceneScript.ConvertMeshPath();
_sceneScript.ConvertTexPath();
_sceneScript.ConvertMatProperty();
_sceneScript.ConvertCombinMeshPath();
//合并场景网格
//CombinMesh();
//AssetDatabase.CreateAsset(_sceneScript, "Assets/TestScript/SceneAssetsDiscriptFile.asset");
#if UNITY_EDITOR
//测试写材质球名字
//SaveCSV();
UnityEditor.SceneManagement.EditorSceneManager.SaveScene(SceneManager.GetActiveScene());
UnityEditor.SceneManagement.EditorSceneManager.CloseScene(SceneManager.GetActiveScene(), true);
#endif
_childs.Clear();
//Resources.UnloadAsset()
GC.Collect();
GC.WaitForPendingFinalizers();
}
public void SaveCSV()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
//写出列名称
for (int i = 0; i < _sceneScript.MatP_Dic.Length; i++)
{
var matInfo = _sceneScript.MatP_Dic[i];
sb.Append(string.Format("材质球名字: {0} ", matInfo.matName));
sb.Append("\n");
}
System.IO.File.WriteAllText("EditorOut/" + "场景导出mat名字.csv", sb.ToString(), System.Text.Encoding.UTF8);
Debug.LogFormat("结果文件被存储到:{0}", "EditorOut/" + "场景导出mat名字.csv");
}
private Material GetReplaceMat()
{
if (_replaceMat == null)
{
Shader sh = Shader.Find("Gonbest/FallBack/FBWithLightmap");
Material mat = new Material(sh);
_replaceShader = sh;
_replaceMat = mat;
}
return _replaceMat;
}
private Material GetDefaultMat()
{
if (_defaultMat == null)
{
Shader sh = Shader.Find("Ares/Scene/NoDiffuse");
Material mat = new Material(sh);
_defaultShader = sh;
_defaultMat = mat;
}
return _defaultMat;
}
private void CheckChild(RegionPart[] parts, CellType type)
{
for (int i = 0; i < _childs.Count; i++)
{
Bounds bounds;
switch (_childs[i].RenderType)
{
case RendererType.MeshRenderer:
{
Mesh ms = _childs[i].Trans.GetComponent<MeshFilter>().sharedMesh;
Transform trans = _childs[i].Trans;
if (trans == null || ms == null)
break;
bounds = GetBounds(_childs[i], ms);
_childs[i].SetBounds(bounds);
SetCommpentPart(parts,type, _childs[i], bounds);
}
break;
case RendererType.SkinMesh:
{
SkinnedMeshRenderer skinnedRender = _childs[i].Trans.GetComponent<SkinnedMeshRenderer>();
if (_childs[i].Trans == null || skinnedRender.sharedMesh == null)
break;
bounds = GetBounds(_childs[i], skinnedRender.sharedMesh);
_childs[i].SetBounds(bounds);
SetCommpentPart(parts, type, _childs[i], bounds);
}
break;
case RendererType.ParticleSystemRenderer:
{
ParticleSystemRenderer prd = _childs[i].Trans.GetComponent<ParticleSystemRenderer>();
if (prd.meshCount == 0)
{
SetCommpentPart(parts, type, _childs[i]);
}
else
{
Mesh[] msArray = new Mesh[prd.meshCount];
prd.GetMeshes(msArray);
for (int j = 0; j < msArray.Length; j++)
{
if (_childs[i] == null || msArray[j] == null)
break;
//bounds = GetBounds(_childs[i], msArray[j]);
bounds = GetParticleBounds(_childs[i], msArray[j]);
SetCommpentPart(parts, type, _childs[i], bounds, j != 0 ? true : false);
}
}
}
break;
case RendererType.TrailRender:
{
TrailRenderer trd = _childs[i].Trans.GetComponent<TrailRenderer>();
var center = _childs[i].Trans.localToWorldMatrix.MultiplyPoint3x4(trd.bounds.center);
var extents = trd.bounds.extents;
var childMin = center - extents;
var childMax = center + extents;
var tr_Bounds = new Bounds(center, extents * 2);
tr_Bounds.min = childMin;
tr_Bounds.max = childMax;
SetCommpentPart(parts, type, _childs[i], tr_Bounds);
_childs[i].SetBounds(tr_Bounds);
}
break;
}
}
//for (int i = 0; i < parts.Length; i++)
//{
// var part = parts[i];
// if (part.Descripts == null || (part.Descripts != null && part.Descripts.Length == 0))
// {
// part.IsAvailable = false;
// }
//}
}
private void CheckPart(RegionPart[] parts, CellType type)
{
for (int i = 0; i < parts.Length; i++)
{
var part = parts[i];
var nodeList = part.GetNodes();
List<SceneAssetDescript> dataList = new List<SceneAssetDescript>();
for (int m = 0; m < nodeList.Count; m++)
{
var node = nodeList[m];
Bounds bounds = new Bounds();
switch (node.RenderType)
{
case RendererType.MeshRenderer:
{
Mesh ms = node.Trans.GetComponent<MeshFilter>().sharedMesh;
Transform trans = node.Trans;
if (trans == null || ms == null)
break;
var data = GetDataFile(node);
dataList.Add(data);
MeshFilter mf = node.Trans.GetComponent<MeshFilter>();
MeshRenderer mRd = node.Trans.GetComponent<MeshRenderer>();
if (node.IsUseDefaultShader)
{
Material mat = GetDefaultMat();
mRd.sharedMaterials = new Material[] { mat };
}
else
{
Material mat = GetReplaceMat();
mRd.sharedMaterials = new Material[] { mat };
}
}
break;
case RendererType.SkinMesh:
{
SkinnedMeshRenderer skinnedRender = node.Trans.GetComponent<SkinnedMeshRenderer>();
if (node.Trans == null || skinnedRender.sharedMesh == null)
break;
var data = GetDataFile(node);
dataList.Add(data);
if (node.IsUseDefaultShader)
{
Material mat = GetDefaultMat();
skinnedRender.sharedMaterials = new Material[] { mat };
}
else
{
Material mat = GetReplaceMat();
skinnedRender.sharedMaterials = new Material[] { mat };
}
//skinnedRender.sharedMaterials = new Material[0];
//skinnedRender.sharedMesh = null;
}
break;
case RendererType.ParticleSystemRenderer:
{
ParticleSystemRenderer prd = node.Trans.GetComponent<ParticleSystemRenderer>();
if (prd.meshCount == 0)
{
var data = GetDataFile(node);
dataList.Add(data);
}
else
{
Mesh[] msArray = new Mesh[prd.meshCount];
prd.GetMeshes(msArray);
for (int j = 0; j < msArray.Length; j++)
{
if (node == null || msArray[j] == null)
break;
bounds = GetBounds(node, msArray[j]);
var data = GetDataFile(node, bounds);
dataList.Add(data);
}
}
if (node.IsUseDefaultShader)
{
Material mat = GetDefaultMat();
int lenght = prd.sharedMaterials.Length;
prd.sharedMaterials = new Material[lenght];
for (int k = 0; k < lenght; k++)
{
prd.sharedMaterials[k] = mat;
}
}
else
{
Material mat = GetReplaceMat();
int lenght = prd.sharedMaterials.Length;
prd.sharedMaterials = new Material[lenght];
for (int k = 0; k < lenght; k++)
{
prd.sharedMaterials[k] = mat;
}
}
//prd.SetMeshes(new Mesh[0]);
//prd.sharedMaterials = new Material[0];
}
break;
case RendererType.TrailRender:
{
TrailRenderer trd = node.Trans.GetComponent<TrailRenderer>();
var center = node.Trans.localToWorldMatrix.MultiplyPoint3x4(trd.bounds.center);
var extents = trd.bounds.extents;
var childMin = center - extents;
var childMax = center + extents;
var tr_Bounds = new Bounds(center, extents * 2);
tr_Bounds.min = childMin;
tr_Bounds.max = childMax;
var data = GetDataFile(node, bounds);
dataList.Add(data);
if (node.IsUseDefaultShader)
{
Material mat = GetDefaultMat();
trd.sharedMaterials = new Material[] { mat };
}
else
{
Material mat = GetReplaceMat();
trd.sharedMaterials = new Material[] { mat };
}
}
break;
}
}
SortChilds(ref dataList);
part.Descripts = dataList.ToArray();
}
}
private SceneAssetDescript GetDataFile(SceneNodeCommpent node)
{
SceneAssetDescript discript = new SceneAssetDescript();
discript.NType = node.RootType;
Bounds bounds = node.GetBounds();
discript.SetBound(bounds);
discript.SetData(node, node.RenderType, _sceneScript);
return discript;
}
private SceneAssetDescript GetDataFile(SceneNodeCommpent node, Bounds bounds)
{
SceneAssetDescript discript = new SceneAssetDescript();
discript.NType = node.RootType;
discript.SetBound(bounds);
discript.SetData(node, node.RenderType, _sceneScript);
return discript;
}
private void SetCommpentPart(RegionPart[] parts,CellType type, SceneNodeCommpent node, Bounds bounds, bool isCheckName = false)
{
for (int j = 0; j < parts.Length; j++)
{
//if (j > 0)
// break;
bool isLast = j == parts.Length - 1 ? true : false;
//判断是否相交
bool isIntersects = parts[j].Intersects(bounds);
if (isIntersects)
{
parts[j].AddNode(node);
List<int> refrenceList = null;
if (node.RefrenceDic.ContainsKey((int)type))
{
refrenceList = node.RefrenceDic[(int)type];
refrenceList.Add(j);
}
else
{
refrenceList = new List<int>();
refrenceList.Add(j);
node.RefrenceDic.Add((int)type, refrenceList);
}
}
}
}
private void SetCommpentPart(RegionPart[] parts, CellType type, SceneNodeCommpent node, bool isCheckName = false)
{
for (int j = 0; j < parts.Length; j++)
{
//if (j > 0)
// break;
bool isLast = j == parts.Length - 1 ? true : false;
//判断是否相交
Bounds bounds = GetParticleBounds(node, null);
node.SetBounds(bounds);
bool isIntersects = parts[j].Intersects(bounds);
if (isIntersects)
{
parts[j].AddNode(node);
List<int> refrenceList = null;
if (node.RefrenceDic.ContainsKey((int)type))
{
refrenceList = node.RefrenceDic[(int)type];
refrenceList.Add(j);
}
else
{
refrenceList = new List<int>();
refrenceList.Add(j);
node.RefrenceDic.Add((int)type, refrenceList);
}
}
}
}
private void DifferentNode(RegionPart[] parts,SceneNodeCommpent node, CellType type)
{
List<int> list = node.GetRefrenceIds(CellType.Level_2);
RefrenceSize size = _sceneScript.GetRefSize(type);
if (list != null)
{
if (list.Count < size.Min || list.Count >= size.Max)
{
list = node.GetRefrenceIds(type);
for (int i = 0; list != null && i < list.Count; i++)
{
_tempNodeList.Clear();
//List<SceneAssetDescript> desList = new List<SceneAssetDescript>();
//for (int m = 0; m < parts[list[i]].Descripts.Length; m++)
//{
// if (parts[list[i]].Descripts[m].Trans != node.Trans)
// {
// desList.Add(parts[list[i]].Descripts[m]);
// }
//}
var nodeList = parts[list[i]].GetNodes();
for (int m = 0; m < nodeList.Count; m++)
{
if (nodeList[m].Trans != node.Trans)
{
_tempNodeList.Add(nodeList[m]);
}
}
//parts[list[i]].Descripts = desList.ToArray();
parts[list[i]].SetNodes(_tempNodeList);
}
}
}
}
private Bounds GetBounds(SceneNodeCommpent node, Mesh ms)
{
var center = node.Trans.localToWorldMatrix.MultiplyPoint3x4(ms.bounds.center);
var extents = new Vector3(Mathf.Abs(center.x - node.Min.x), 10, Mathf.Abs(center.z - node.Min.y));
var childMin = center - extents;
var childMax = center + extents;
var bounds = new Bounds(center, extents * 2);
bounds.min = childMin;
bounds.max = childMax;
return bounds;
}
private Bounds GetParticleBounds(SceneNodeCommpent node, Mesh ms)
{
Vector3 center = Vector3.zero;
Vector3 extents = Vector3.zero;
Bounds bounds;
ParticleSystem ps = node.Trans.GetComponent<ParticleSystem>();
if (ps.shape.enabled)
{
center = node.Trans.position;
extents = new Vector3(ps.shape.radius / 2, 10, ps.shape.radius / 2);
}
else
{
if (ms == null)
{
center = node.Trans.position;
extents = new Vector3(0.5f, 10, 0.5f);
}
else
{
//使用mesh来求
center = node.Trans.localToWorldMatrix.MultiplyPoint3x4(ms.bounds.center);
extents = new Vector3(Mathf.Abs(center.x - node.Min.x), 10, Mathf.Abs(center.z - node.Min.y));
}
}
var childMin = center - extents;
var childMax = center + extents;
bounds = new Bounds(center, extents * 2);
bounds.min = childMin;
bounds.max = childMax;
return bounds;
}
private void SortChilds(ref List<SceneAssetDescript> list)
{
if (list == null)
return;
list.Sort((x, y) =>
{
if (x.Sort > y.Sort)
{
return -1;
}
else if (x.Sort == y.Sort)
{
return 0;
}
else
{
return 1;
}
});
}
private void SetScale(Transform trans, ref float scale)
{
Transform parent = trans.parent;
if (parent)
{
scale *= parent.localScale.x;
SetScale(parent, ref scale);
}
}
//合并场景相同材质球的网格
//private void CombinMesh()
//{
// _dicCombinMesh.Clear();
// string combinPath = "GameAssets/Resources/Scene/CombinMesh";
// string floderPath = Application.dataPath + "/" + combinPath;
// if (!Directory.Exists(floderPath))
// Directory.CreateDirectory(floderPath);
// //开始合并mesh
// var enumer = _sceneScript.DicCombinData.GetEnumerator();
// try
// {
// while (enumer.MoveNext())
// {
// //新建一个合并组,长度与 meshfilters一致
// CombineInstance[] combineInstances = new CombineInstance[enumer.Current.Value.Count];
// for (int i = 0; i < enumer.Current.Value.Count; i++)
// {
// //将共享mesh赋值
// combineInstances[i].mesh = enumer.Current.Value[i].mesh;
// //本地坐标转矩阵,赋值
// combineInstances[i].transform = enumer.Current.Value[i].trans.localToWorldMatrix;
// }
// //声明一个新网格对象
// Mesh newMesh = new Mesh();
// //MatAssetsProperty matProperty = _sceneScript.GetMatProperty(enumer.Current.Key);
// newMesh.name = string.Format("Comb_MatProperty_{0}_Mesh",enumer.Current.Key );
// //将combineInstances数组传入函数
// newMesh.CombineMeshes(combineInstances,false);
// //保存合并的网格
// string assetPath = "Assets/GameAssets/Resources/";
// string path = string.Format("Scene/CombinMesh/{0}", newMesh.name);
// assetPath = assetPath + path + ".asset";
// UnityEditor.AssetDatabase.CreateAsset(newMesh, assetPath);
// if (!_dicCombinMesh.ContainsKey(enumer.Current.Key))
// {
// _dicCombinMesh[enumer.Current.Key] = newMesh;
// }
// }
// }
// finally
// {
// enumer.Dispose();
// }
//}
//获取或者添加脚本
private T RequireComponent<T>(GameObject go) where T : Component
{
T ret = go.GetComponent<T>();
if (ret == null)
{
ret = go.AddComponent<T>();
}
return ret;
}
#endregion
#region//公共函数
public static void SplitSceneData()
{
SceneSplit split = new SceneSplit();
split.SplitScene();
}
#endregion
}
}