```
docs(clipboard): 添加剪贴板功能相关图片资源 添加了两个剪贴板功能的截图文件,用于文档说明和功能展示。 ```
This commit is contained in:
1 parent
bf5f1ba95b
commit
fb56cd7ede
122 files changed
+1496
-26
No files matched your search
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
[Serializable]
|
||||
public class LevelConfig
|
||||
{
|
||||
public string levelId;
|
||||
public string levelName;
|
||||
public int difficulty;
|
||||
public WaveConfig[] waves;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class WaveConfig
|
||||
{
|
||||
public int waveIndex;
|
||||
public float triggerZPosition;
|
||||
public EnemyConfig[] enemies;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class EnemyConfig
|
||||
{
|
||||
public string characterDataId;
|
||||
public int count;
|
||||
public int level;
|
||||
public Vector3[] spawnPositions;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: DCkbtyqsAS0XWDbnV6b28+qtK9fqumatNN8sVAc+ET/07NEWJo3Gdhc=
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,124 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class LevelWaveManager : MonoBehaviour
|
||||
{
|
||||
[Header("关卡配置")]
|
||||
public TextAsset levelConfigJson;
|
||||
|
||||
[Header("资源引用")]
|
||||
public Transform playerTransform;
|
||||
|
||||
private LevelConfig levelConfig;
|
||||
private List<GameObject> waveSpawners = new List<GameObject>();
|
||||
private Dictionary<string, CharacterData> characterDataCache = new Dictionary<string, CharacterData>();
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (playerTransform == null)
|
||||
{
|
||||
var mainChar = FindObjectOfType<MainCharacterCombat>();
|
||||
if (mainChar != null)
|
||||
{
|
||||
playerTransform = mainChar.transform;
|
||||
}
|
||||
}
|
||||
|
||||
if (levelConfigJson != null)
|
||||
{
|
||||
LoadLevelConfig();
|
||||
CreateWaveSpawners();
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("LevelWaveManager: 未配置关卡 JSON 文件!");
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadLevelConfig()
|
||||
{
|
||||
try
|
||||
{
|
||||
levelConfig = JsonUtility.FromJson<LevelConfig>(levelConfigJson.text);
|
||||
Debug.Log($"加载关卡配置:{levelConfig.levelName},共 {levelConfig.waves.Length} 波");
|
||||
}
|
||||
catch (System.Exception e)
|
||||
{
|
||||
Debug.LogError($"解析关卡配置失败:{e.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateWaveSpawners()
|
||||
{
|
||||
if (levelConfig == null || levelConfig.waves == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var waveConfig in levelConfig.waves)
|
||||
{
|
||||
GameObject spawnerObj = new GameObject($"WaveSpawner_Wave{waveConfig.waveIndex}");
|
||||
spawnerObj.transform.SetParent(transform);
|
||||
spawnerObj.transform.position = new Vector3(0, 0, waveConfig.triggerZPosition + 5f); // 生成点在触发点后方5米
|
||||
|
||||
WaveSpawner spawner = spawnerObj.AddComponent<WaveSpawner>();
|
||||
spawner.triggerZPosition = waveConfig.triggerZPosition;
|
||||
spawner.autoStart = false;
|
||||
|
||||
// 构建 WaveSpawner.Wave 数据
|
||||
WaveSpawner.Wave wave = new WaveSpawner.Wave();
|
||||
wave.waveName = $"第{waveConfig.waveIndex}波";
|
||||
|
||||
List<GameObject> enemyPrefabs = new List<GameObject>();
|
||||
List<Vector3> spawnPositions = new List<Vector3>();
|
||||
|
||||
foreach (var enemyConfig in waveConfig.enemies)
|
||||
{
|
||||
CharacterData characterData = LoadCharacterData(enemyConfig.characterDataId);
|
||||
if (characterData == null)
|
||||
{
|
||||
Debug.LogError($"找不到角色数据:{enemyConfig.characterDataId}");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 根据配置生成多个敌人
|
||||
for (int i = 0; i < enemyConfig.count; i++)
|
||||
{
|
||||
enemyPrefabs.Add(characterData.unitPrefab);
|
||||
|
||||
Vector3 spawnPos = (i < enemyConfig.spawnPositions.Length)
|
||||
? enemyConfig.spawnPositions[i]
|
||||
: new Vector3(i * 2f, 0, 0); // 默认横向排列
|
||||
|
||||
spawnPositions.Add(spawnPos);
|
||||
}
|
||||
}
|
||||
|
||||
wave.enemyPrefabs = enemyPrefabs.ToArray();
|
||||
wave.spawnPositions = spawnPositions.ToArray();
|
||||
wave.spawnDelay = 0.5f;
|
||||
|
||||
spawner.waves = new WaveSpawner.Wave[] { wave };
|
||||
|
||||
waveSpawners.Add(spawnerObj);
|
||||
|
||||
Debug.Log($"创建 WaveSpawner:波次{waveConfig.waveIndex},触发位置 Z={waveConfig.triggerZPosition},敌人数量={enemyPrefabs.Count}");
|
||||
}
|
||||
}
|
||||
|
||||
private CharacterData LoadCharacterData(string characterDataId)
|
||||
{
|
||||
if (characterDataCache.ContainsKey(characterDataId))
|
||||
{
|
||||
return characterDataCache[characterDataId];
|
||||
}
|
||||
|
||||
CharacterData data = Resources.Load<CharacterData>($"Data/{characterDataId}");
|
||||
if (data != null)
|
||||
{
|
||||
characterDataCache[characterDataId] = data;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: WX4dtiuuACkF8KQIrcpLS+QVWeg7vbjkYIAMFyJkofFDHGwm0GC1MPg=
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -75,11 +75,20 @@ public class WorldHealthBar : MonoBehaviour
|
||||
maxEnergy = Mathf.Max(1f, maxEnergy);
|
||||
currentEnergy = Mathf.Clamp(currentEnergy, 0f, maxEnergy);
|
||||
CalculateLayout();
|
||||
CreateBar();
|
||||
CreateBar(); // 创建血条 UI 结构,但颜色在 Start() 中设置
|
||||
UpdateFill();
|
||||
UpdateEnergyFill();
|
||||
}
|
||||
|
||||
// 在 Start() 中根据最终标签设置血条颜色,确保 Instantiate 后的标签修改生效。
|
||||
private void Start()
|
||||
{
|
||||
if (fillImage != null)
|
||||
{
|
||||
fillImage.color = GetHealthFillColor();
|
||||
}
|
||||
}
|
||||
|
||||
// 每帧让血条保持在单位头顶,并朝向主摄像机。
|
||||
private void LateUpdate()
|
||||
{
|
||||
@@ -339,7 +348,8 @@ public class WorldHealthBar : MonoBehaviour
|
||||
Image background = CreateImage("Border", healthRow, RoundedSprite(), borderColor);
|
||||
SetFullRect(background.rectTransform);
|
||||
|
||||
Image inner = CreateImage("Fill", healthRow, RoundedSprite(), GetHealthFillColor());
|
||||
// 创建填充 Image,颜色暂时使用默认绿色,在 Start() 中根据最终标签设置
|
||||
Image inner = CreateImage("Fill", healthRow, RoundedSprite(), Color.green);
|
||||
inner.rectTransform.anchorMin = Vector2.zero;
|
||||
inner.rectTransform.anchorMax = Vector2.one;
|
||||
inner.rectTransform.offsetMin = new Vector2(2f, 2f);
|
||||
|
||||
Reference in new issue
Block a user