docs(clipboard): 添加剪贴板功能相关图片资源

添加了两个剪贴板功能的截图文件,用于文档说明和功能展示。
```
This commit is contained in:
huadexuan committed 2026-09-11 18:07:21 +08:00
1 parent bf5f1ba95b
commit fb56cd7ede
122 files changed
+1496 -26

No files matched your search

+28
View File
@@ -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;
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: DCkbtyqsAS0XWDbnV6b28+qtK9fqumatNN8sVAc+ET/07NEWJo3Gdhc=
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+124
View File
@@ -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;
}
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: WX4dtiuuACkF8KQIrcpLS+QVWeg7vbjkYIAMFyJkofFDHGwm0GC1MPg=
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+12 -2
View File
@@ -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);