2025-01-25 04:38:09 +08:00

998 lines
47 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;
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
}
}