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
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|