998 lines
47 KiB
C#
998 lines
47 KiB
C#
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
|
||
}
|
||
}
|
||
|
||
|