private IEnumerator SpawnerCollider()
    {
        EditorColliderArea[] arealist = m_ColliderData.areaList;
        if (arealist != null && arealist.Length > 0)
        {
            for (int iArea = 0; iArea < arealist.Length; iArea++)
            {
                EditorColliderArea editorArea = arealist[iArea];
                if (editorArea == null)
                {
                    continue;
                }
                GameObject areaObj = new GameObject(editorArea.areaId.ToString());
                areaObj.transform.SetParent(transform);
                areaObj.transform.localPosition = Vector3.zero;
                areaObj.transform.localRotation = Quaternion.identity;
                areaObj.transform.localScale    = Vector3.one;

                EditorDecorate[] decorate_list = editorArea.decorateList;
                if (decorate_list != null && decorate_list.Length > 0)
                {
                    for (int iDecorate = 0; iDecorate < decorate_list.Length; iDecorate++)
                    {
                        EditorDecorate decorate = decorate_list[iDecorate];
                        CreateColliderObj(decorate, areaObj.transform);
                        yield return(null);
                    }
                }
            }
            yield return(null);

            GameObject commonObj = new GameObject("DontExport");
            commonObj.transform.SetParent(transform);
            commonObj.transform.localPosition = Vector3.zero;
            commonObj.transform.localRotation = Quaternion.identity;
            commonObj.transform.localScale    = Vector3.one;

            EditorDecorate[] commonDecorate_list = m_ColliderData.commondecorateList;
            if (commonDecorate_list != null && commonDecorate_list.Length > 0)
            {
                for (int iDecorate = 0; iDecorate < commonDecorate_list.Length; iDecorate++)
                {
                    EditorDecorate decorate = commonDecorate_list[iDecorate];
                    CreateColliderObj(decorate, commonObj.transform);
                    yield return(null);
                }
            }
        }
        yield return(null);
    }
        private IEnumerator GenerateResidentDecorate(List <EditorDecorate> editorDecorateList)
        {
            DontDestroyAtExport residentRoot = UnityEngine.Object.FindObjectOfType <DontDestroyAtExport>();

            if (residentRoot != null)
            {
                List <Transform> colliderRoots = MapEditorUtility.FindChilds <Transform>(residentRoot.transform, "Collider");
                if (colliderRoots == null || colliderRoots.Count <= 0)
                {
                    yield break;
                }

                for (int iRoot = 0; iRoot < colliderRoots.Count; iRoot++)
                {
                    Transform colliderRoot = colliderRoots[iRoot];
                    if (colliderRoot != null)
                    {
                        Collider[] colliders = colliderRoot.GetComponentsInChildren <Collider>();
                        if (colliders != null && colliders.Length > 0)
                        {
                            for (int iCollider = 0; iCollider < colliders.Length; iCollider++)
                            {
                                EditorGamingMapData.CorrectCollider(colliders[iCollider]);
                                yield return(null);

                                yield return(null);

                                Quaternion rot = colliders[iCollider].transform.rotation;
                                colliders[iCollider].transform.rotation = Quaternion.identity;
                                yield return(null);

                                EditorDecorate decorate = EditorGamingMapData.SaveColliderData(colliders[iCollider], rot);
                                yield return(null);

                                colliders[iCollider].transform.rotation = rot;
                                if (decorate != null)
                                {
                                    decorate.id = m_AutoId++;
                                    editorDecorateList.Add(decorate);
                                }
                                CheckColliderLayer(colliders[iCollider]);
                            }
                        }
                    }
                }
            }
            yield return(null);
        }
        private IEnumerator ExportUpdate()
        {
            ConfigVO <ModelVO> .Instance.GetList();

            yield return(null);

            ConfigVO <ModShipDecorateVO> .Instance.GetList();

            ConfigVO <ModShipDecorateVO> .Instance.ResetData();

            yield return(null);

            List <ModelVO> shipModelList = new List <ModelVO>();
            List <ModelVO> modelList     = ConfigVO <ModelVO> .Instance.GetList();

            if (modelList != null && modelList.Count > 0)
            {
                for (int iModel = 0; iModel < modelList.Count; iModel++)
                {
                    ModelVO modelVo = modelList[iModel];
                    if (modelVo.type == (int)EditorGamingMapData.ModelType.WarShip)
                    {
                        shipModelList.Add(modelVo);
                    }
                }
            }
            yield return(null);

            if (shipModelList != null && shipModelList.Count > 0)
            {
                for (int iShip = 0; iShip < shipModelList.Count; iShip++)
                {
                    ModelVO modelVo   = shipModelList[iShip];
                    string  assetName = modelVo.assetName;
                    if (!string.IsNullOrEmpty(assetName))
                    {
                        string[] resAssets = AssetDatabase.FindAssets(string.Format("{0} t:Prefab", assetName));
                        if (resAssets != null && resAssets.Length > 0)
                        {
                            for (int iRes = 0; iRes < resAssets.Length; iRes++)
                            {
                                assetName = AssetDatabase.GUIDToAssetPath(resAssets[iRes]);
                                string[] assetSplit = assetName.Split('/');
                                if (assetSplit != null && assetSplit.Length > 0)
                                {
                                    if (assetSplit[assetSplit.Length - 1].Equals(string.Format("{0}.prefab", modelVo.assetName)))
                                    {
                                        break;
                                    }
                                }
                            }
                            GameObject assetObj = AssetDatabase.LoadAssetAtPath <GameObject>(assetName);
                            if (assetObj != null)
                            {
                                GameObject shipObj = GameObject.Instantiate(assetObj);
                                JudegeShipCollider(shipObj);
                                shipObj.transform.SetParent(transform);
                                shipObj.transform.localPosition = Vector3.zero;
                                CapsuleCollider shipCollider = EditorGamingMapData.CalculateCapsuleCollider(shipObj);
                                EditorGamingMapData.CorrectCollider(shipCollider);
                                yield return(null);

                                yield return(null);

                                Quaternion shipRot = shipCollider.transform.rotation;
                                shipCollider.transform.rotation = Quaternion.identity;
                                yield return(null);

                                EditorDecorate decorate = EditorGamingMapData.SaveColliderData(shipCollider, shipRot);
                                yield return(null);

                                shipCollider.transform.rotation = shipRot;
                                ModShipDecorateVO shipDecorateVo = ConfigVO <ModShipDecorateVO> .Instance.GetData(modelVo.ID);

                                if (shipDecorateVo != null)
                                {
                                    shipDecorateVo.colliderMax = decorate.dirMax;
                                    shipDecorateVo.colliderMin = decorate.dirMin;
                                    // shipDecorateVo.colliderMax = new float[3] { CalcuateRound(decorate.dirmax.x, 3), CalcuateRound(decorate.dirmax.y, 3), CalcuateRound(decorate.dirmax.z, 3) };
                                    // shipDecorateVo.colliderMin = new float[3] { CalcuateRound(decorate.dirmin.x, 3), CalcuateRound(decorate.dirmin.y, 3), CalcuateRound(decorate.dirmin.z, 3) };
                                }
                                else
                                {
                                    ModShipDecorateVO decorateVo = new ModShipDecorateVO();
                                    decorateVo.ID     = modelVo.ID;
                                    decorateVo.unitId = modelVo.ID;
                                    decorateVo.type   = (int)EditorGamingMapData.COLLIDER_TYPE.PX_CAPSULE;
                                    //decorateVo.colliderMax = new float[3] { CalcuateRound(decorate.dirmax.x, 3), CalcuateRound(decorate.dirmax.y, 3), CalcuateRound(decorate.dirmax.z, 3) };
                                    //decorateVo.colliderMin = new float[3] { CalcuateRound(decorate.dirmin.x, 3), CalcuateRound(decorate.dirmin.y, 3), CalcuateRound(decorate.dirmin.z, 3) };
                                    decorateVo.colliderMax = decorate.dirMax;
                                    decorateVo.colliderMin = decorate.dirMin;
                                    ConfigVO <ModShipDecorateVO> .Instance.AddData(decorateVo);
                                }
                                yield return(null);

                                if (shipObj != null)
                                {
                                    GameObject.DestroyImmediate(shipObj);
                                }
                                yield return(null);
                            }
                        }
                    }
                }
            }
            yield return(null);

            ConfigVO <ModShipDecorateVO> .Instance.SaveCSV();

            bool isConfirm = EditorUtility.DisplayDialog("提示", "战舰碰撞信息导出成功", "确定");

            if (isConfirm)
            {
                GameObject.DestroyImmediate(gameObject);
            }
        }
        public IEnumerator GenerateAreaDecorate(EditorCollider outData, List <EditorDecorate> editorDecorateList)
        {
            if (m_Map.m_AreaSpawnerCache != null && m_Map.m_AreaSpawnerCache.Count > 0)
            {
                EditorColliderArea[] areaList = new EditorColliderArea[m_Map.m_AreaSpawnerCache.Count];
                outData.areaList = areaList;
                List <GameObject> prefabList = new List <GameObject>();
                for (int iArea = 0; iArea < m_Map.m_AreaSpawnerCache.Count; iArea++)
                {
                    editorDecorateList.Clear();
                    EditorColliderArea editorArea = new EditorColliderArea();
                    areaList[iArea] = editorArea;
                    AreaSpawner areaSpawner = m_Map.m_AreaSpawnerCache[iArea];
                    Area        area        = areaSpawner.GetArea();

                    string areaName = areaSpawner.GetAreaScenePath();
                    while (!string.IsNullOrEmpty(areaName) && area == null)
                    {
                        area = areaSpawner.GetArea();
                        yield return(null);
                    }

                    editorArea.areaId = areaSpawner.GetAreaId();
                    if (area != null)
                    {
                        EditorGamingMapData.CorrectAreaColliderCenter(area);
                        yield return(null);

                        yield return(null);

                        prefabList.Clear();
                        MapEditorUtility.GetAllPrefab(area.transform, prefabList);
                        if (prefabList != null && prefabList.Count > 0)
                        {
                            for (int iUnit = 0; iUnit < prefabList.Count; iUnit++)
                            {
                                GameObject       unit          = prefabList[iUnit];
                                List <Transform> colliderRoots = MapEditorUtility.FindChilds <Transform>(unit.transform, "Collider");
                                if (colliderRoots == null || colliderRoots.Count <= 0)
                                {
                                    continue;
                                }
                                for (int iRoot = 0; iRoot < colliderRoots.Count; iRoot++)
                                {
                                    Transform colliderRoot = colliderRoots[iRoot];
                                    if (colliderRoot != null)
                                    {
                                        Collider[] colliders = colliderRoot.GetComponentsInChildren <Collider>();
                                        if (colliders != null && colliders.Length > 0)
                                        {
                                            for (int iCollider = 0; iCollider < colliders.Length; iCollider++)
                                            {
                                                EditorUtility.DisplayProgressBar("GenerateAreaDecorate", string.Format("{0} {1}", area.name, colliders[iCollider].gameObject.name), (iArea + 1) * 1.0f / m_Map.m_AreaSpawnerCache.Count);
                                                Quaternion rot = colliders[iCollider].transform.rotation;
                                                colliders[iCollider].transform.rotation = Quaternion.identity;
                                                yield return(null);

                                                EditorDecorate decorate = EditorGamingMapData.SaveColliderData(colliders[iCollider], rot, true);
                                                yield return(null);

                                                colliders[iCollider].transform.rotation = rot;
                                                if (decorate != null)
                                                {
                                                    decorate.id = m_AutoId++;
                                                    editorDecorateList.Add(decorate);
                                                }
                                                CheckColliderLayer(colliders[iCollider]);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        editorArea.decorateList = editorDecorateList.ToArray();
                    }
                    else
                    {
                        Debug.LogError(string.Format("Area {0} 未加载进来", areaSpawner.GetAreaId()));
                    }
                    yield return(null);

                    EditorUtility.ClearProgressBar();
                }
            }
        }
    private GameObject CreateColliderObj(EditorDecorate data, Transform parent)
    {
        if (data == null)
        {
            return(null);
        }

        GameObject obj      = null;
        Vector3    position = Vector3.zero;
        Quaternion rotation = new Quaternion(data.dir.x, data.dir.y, data.dir.z, data.dir.w);
        Vector3    scale    = Vector3.one;

        Vector3 size = Vector3.one;

        size.x = Mathf.Abs(data.dirMax.x - data.dirMin.x);
        size.y = Mathf.Abs(data.dirMax.y - data.dirMin.y);
        size.z = Mathf.Abs(data.dirMax.z - data.dirMin.z);

        scale = size;

        float raduis = 0;

        position = new Vector3(data.dirMin.x + size.x * 0.5f, data.dirMin.y + size.y * 0.5f, data.dirMin.z + size.z * 0.5f);

        switch ((COLLIDER_TYPE)data.type)
        {
        case COLLIDER_TYPE.PX_BOX:
            obj   = GameObject.CreatePrimitive(PrimitiveType.Cube);
            scale = new Vector3(size.x, size.y, size.z);
            break;

        case COLLIDER_TYPE.PX_CAPSULE:
            obj = GameObject.CreatePrimitive(PrimitiveType.Capsule);
            float height = Mathf.Max(size.x, size.y, size.z);
            if (height == size.x)
            {
                raduis = Mathf.Max(size.y, size.z);
                float scaleSize = height / 2;
                scale = new Vector3(scaleSize, raduis, raduis);
            }
            else if (height == size.y)
            {
                raduis = Mathf.Max(size.x, size.z);
                float scaleSize = height / 2;
                scale = new Vector3(raduis, scaleSize, raduis);
            }
            else if (height == size.z)
            {
                raduis = Mathf.Max(size.y, size.x);
                float scaleSize = height / 2;
                scale = new Vector3(raduis, raduis, scaleSize);
            }

            break;

        case COLLIDER_TYPE.PX_SPHERE:
            obj    = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            raduis = Mathf.Max(size.x, size.y, size.z);
            scale  = new Vector3(raduis, raduis, raduis);
            break;
        }
        obj.name = data.scenePath;
        obj.transform.SetParent(parent);
        obj.transform.position   = position;
        obj.transform.rotation   = rotation;
        obj.transform.localScale = scale;

        CapsuleCollider capCollider = obj.GetComponent <CapsuleCollider>();

        if (capCollider != null)
        {
            Vector3 originScale = capCollider.transform.localScale;
            capCollider.transform.localScale = new Vector3(originScale.y, originScale.x, originScale.z);
            capCollider.transform.Rotate(Vector3.forward, -90);
            //capCollider.direction = 2;
        }
        return(obj);
    }