You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
8.1 KiB
C#
206 lines
8.1 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
using UnityEditor.Animations;
|
|
using System.IO;
|
|
using Game;
|
|
using Articy.Touhou;
|
|
|
|
public class LevelGenerate : MonoBehaviour
|
|
{
|
|
static string LevelVoxPath = "/Resources/SceneAsset/Model_vox/";
|
|
static string LevelGroundPrefabPath = "/Resources/Prefab/LevelAssets/levelground/";
|
|
static string LevelPrefabPath = "/Resources/Prefab/Level/";
|
|
static string VoxTemplateName = "levelground0000.vox";
|
|
static string LevelGroundPrefabTemplateName = "levelground0000.prefab";
|
|
static string LevelPrefabTemplateName = "level0000.prefab";
|
|
|
|
[MenuItem("Tools/关卡资源/生成文件")]
|
|
static void LevelGenerateAll()
|
|
{
|
|
var levelInfos = Util.GetLevelConfigDataAll();
|
|
foreach (var levelInfo in levelInfos)
|
|
{
|
|
Generate(levelInfo);
|
|
}
|
|
|
|
AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport);
|
|
AssetDatabase.SaveAssets();
|
|
Resources.UnloadUnusedAssets();
|
|
foreach (var levelInfo in levelInfos)
|
|
{
|
|
Adjust(levelInfo);
|
|
}
|
|
|
|
AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport);
|
|
AssetDatabase.SaveAssets();
|
|
Resources.UnloadUnusedAssets();
|
|
Debug.Log("LevelGenerateAll Done");
|
|
}
|
|
|
|
static void Generate(Level level)
|
|
{
|
|
var levelInfo = level.GetFeatureLevel();
|
|
var levelAssetsName = levelInfo.Prefab;
|
|
if (!levelAssetsName.StartsWith("level"))
|
|
{
|
|
Debug.LogError("关卡资源名字不正确:" + levelAssetsName);
|
|
return;
|
|
}
|
|
|
|
var levelNumberStr = levelAssetsName.Substring(5);
|
|
var levelVoxName = "levelground" + levelNumberStr + ".vox";
|
|
var levelGroundPrefabName = "levelground" + levelNumberStr + ".prefab";
|
|
var levelPrefabName = "level" + levelNumberStr + ".prefab";
|
|
//生成vox文件
|
|
var voxPath = Application.dataPath + LevelVoxPath + levelVoxName;
|
|
if (!File.Exists(voxPath))
|
|
{
|
|
var templateVoxPath = Application.dataPath + LevelVoxPath + VoxTemplateName;
|
|
File.Copy(templateVoxPath, voxPath);
|
|
Debug.Log("生成vox文件:" + voxPath);
|
|
}
|
|
|
|
//生成levelground文件
|
|
var levelGroundPrefabPath = Application.dataPath + LevelGroundPrefabPath + levelGroundPrefabName;
|
|
if (!File.Exists(levelGroundPrefabPath))
|
|
{
|
|
var templateLevelGroundPrefabPath =
|
|
Application.dataPath + LevelGroundPrefabPath + LevelGroundPrefabTemplateName;
|
|
File.Copy(templateLevelGroundPrefabPath, levelGroundPrefabPath);
|
|
Debug.Log("生成levelground文件:" + levelGroundPrefabPath);
|
|
}
|
|
|
|
//生成level文件
|
|
var levelPrefabPath = Application.dataPath + LevelPrefabPath + levelPrefabName;
|
|
if (!File.Exists(levelPrefabPath))
|
|
{
|
|
var templateLevelPrefabPath = Application.dataPath + LevelPrefabPath + LevelPrefabTemplateName;
|
|
File.Copy(templateLevelPrefabPath, levelPrefabPath);
|
|
Debug.Log("生成level文件:" + levelPrefabPath);
|
|
}
|
|
}
|
|
|
|
static void Adjust(Level level)
|
|
{
|
|
var levelInfo = level.GetFeatureLevel();
|
|
var levelAssetsName = levelInfo.Prefab;
|
|
if (!levelAssetsName.StartsWith("level"))
|
|
{
|
|
Debug.LogError("关卡资源名字不正确:" + levelAssetsName);
|
|
return;
|
|
}
|
|
|
|
var levelNumberStr = levelAssetsName.Substring(5);
|
|
var levelVoxName = "levelground" + levelNumberStr + ".vox";
|
|
var levelGroundPrefabName = "levelground" + levelNumberStr + ".prefab";
|
|
var levelPrefabName = "level" + levelNumberStr + ".prefab";
|
|
//检查vox文件
|
|
var voxPath = Application.dataPath + LevelVoxPath + levelVoxName;
|
|
if (!File.Exists(voxPath))
|
|
{
|
|
Debug.LogError("vox文件不存在:" + voxPath);
|
|
return;
|
|
}
|
|
|
|
//检查levelground文件
|
|
var levelGroundPrefabPath = Application.dataPath + LevelGroundPrefabPath + levelGroundPrefabName;
|
|
if (!File.Exists(levelGroundPrefabPath))
|
|
{
|
|
Debug.LogError("levelground文件不存在:" + levelGroundPrefabPath);
|
|
return;
|
|
}
|
|
|
|
//检查level文件
|
|
var levelPrefabPath = Application.dataPath + LevelPrefabPath + levelPrefabName;
|
|
if (!File.Exists(levelPrefabPath))
|
|
{
|
|
Debug.LogError("level文件不存在:" + levelPrefabPath);
|
|
return;
|
|
}
|
|
|
|
// 调整
|
|
var levelP = AssetDatabase.LoadAssetAtPath<GameObject>("Assets" + LevelPrefabPath + levelPrefabName);
|
|
if (levelP == null)
|
|
{
|
|
Debug.LogError("level文件不存在:" + levelPrefabPath);
|
|
return;
|
|
}
|
|
|
|
var levelPrefab = GameObject.Instantiate(levelP);
|
|
|
|
// 调整关卡大小
|
|
var groundBlock = levelPrefab.transform.Find("Obj/_GroundBlock");
|
|
groundBlock.localScale = new Vector3(levelInfo.LevelSizeX, 1, levelInfo.LevelSizeY);
|
|
|
|
// 调整空气墙大小
|
|
var airWallView = levelPrefab.transform.Find("Obj/_AirWallView");
|
|
airWallView.localScale = new Vector3(levelInfo.LevelSizeX + 0.05f, 1, levelInfo.LevelSizeY + 0.05f);
|
|
|
|
|
|
// 调整关卡地面引用
|
|
var groundView = levelPrefab.transform.Find("Obj/_GroundView");
|
|
foreach (Transform child in groundView)
|
|
{
|
|
GameObject.DestroyImmediate(child.gameObject);
|
|
}
|
|
|
|
var levelGroundPrefab =
|
|
AssetDatabase.LoadAssetAtPath<GameObject>("Assets" + LevelGroundPrefabPath + levelGroundPrefabName);
|
|
var levelGround = PrefabUtility.InstantiatePrefab(levelGroundPrefab, groundView);
|
|
|
|
// 调整关卡连接
|
|
var levelConnect = levelPrefab.transform.Find("Entity/_DefaultDoor");
|
|
levelConnect.localScale = new Vector3(levelInfo.LevelSizeX, 1, levelInfo.LevelSizeY);
|
|
var levelConnectRoot = levelPrefab.transform.Find("Entity/_DefaultDoor/Root");
|
|
foreach (Transform child in levelConnectRoot)
|
|
{
|
|
switch (child.name)
|
|
{
|
|
case "LT":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_LT != null);
|
|
break;
|
|
case "LM":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_LM != null);
|
|
break;
|
|
case "LD":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_LD != null);
|
|
break;
|
|
case "RT":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_RT != null);
|
|
break;
|
|
case "RM":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_RM != null);
|
|
break;
|
|
case "RD":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_RD != null);
|
|
break;
|
|
case "TL":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_TL != null);
|
|
break;
|
|
case "TM":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_TM != null);
|
|
break;
|
|
case "TR":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_TR != null);
|
|
break;
|
|
case "DL":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_DL != null);
|
|
break;
|
|
case "DM":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_DM != null);
|
|
break;
|
|
case "DR":
|
|
child.gameObject.SetActive(levelInfo.LevelLink_DR != null);
|
|
break;
|
|
default:
|
|
Debug.LogError("门类型错误:" + child.name);
|
|
break;
|
|
}
|
|
}
|
|
|
|
PrefabUtility.SaveAsPrefabAsset(levelPrefab, levelPrefabPath);
|
|
GameObject.DestroyImmediate(levelPrefab);
|
|
}
|
|
} |