using UnityEngine; using Shapes; using System.Collections.Generic; using UnityEngine.UI; using TMPro; [ExecuteAlways] public class LakeLineDrawer : ImmediateModeShapeDrawer { [Header("场设置")] public float fieldSize = 80f; public Vector2 fieldOffset = Vector2.zero; public int pointCount = 80; public float pointSize = 0.1f; public float lineWidth = 0.03f; [Header("颜色设置")] public Color lakeDarkColor = new Color(0f, 0.5f, 1f); // 湖面低处颜色 public Color lakeLightColor = new Color(0.5f, 1f, 1f); // 湖面高处颜色 public Color edgeDarkColor = new Color(0f, 0.5f, 1f); // 边缘低处颜色 public Color edgeLightColor = new Color(0.5f, 1f, 1f, 0.3f); // 边缘高处颜色 public float edgeLineLength = 1f; // 边缘线的长度 [Header("UI控制")] public Button upButton; public Button downButton; public Button leftButton; public Button rightButton; public float moveStep = 1f; // 每次移动的步长 public Transform targetButtonsParent; // 目标按钮的父物体(带有Layout组件的容器) public GameObject targetButtonPrefab; // 目标按钮预制体 public float buttonSpacing = 10f; // 按钮之间的间距 [Header("目标点设置")] public List targetPoints = new List(); public float targetSize = 0.5f; public float rotationSpeed = 30f; // 旋转速度(度/秒) public float floatAmplitude = 0.2f; // 起伏幅度 public float floatFrequency = 2f; // 起伏频率 public float targetLineWidth = 0.02f; // 目标点线框的宽度 public float targetHeightOffset = 0.5f; // 目标点距离湖面的高度偏移 public Color targetFillColor = Color.red; // 目标点实体颜色 public Color targetWireColor = Color.white; // 目标点线框颜色 public float wireScale = 1.05f; // 线框相对于实体的大小比例 public float targetColorInfluenceRange = 5f; // 目标点颜色影响范围 public float targetColorInfluenceStrength = 1f; // 目标点颜色影响强度 [Header("可视区域")] public float visibleAreaSize = 20f; // 波动参数,用于生成波动效果 public float noiseScale = 0.3f; public float waveHeight = 1.5f; public float waveSpeed = 1f; public float timeScale = 1f; [Header("涟漪参数")] public float rippleStrength = 4f; // 增加涟漪强度 public float rippleDuration = 0.8f; // 缩短持续时间使效果更活跃 public float rippleSpreadSpeed = 6f; // 增加传播速度 public float rippleSharpness = 3f; // 增加锐度 public float rippleMaxRadius = 4f; // 增加最大半径 public float rippleFadeStartTime = 0.3f; // 提前开始淡出的时间点 public float rippleFadeCurve = 2f; // 增加淡出曲线的指数,使消失更快 [Header("障碍物设置")] public List obstacles = new List(); public float obstacleHeight = 2f; // 障碍物高度 public float obstacleWidth = 0.5f; // 障碍物宽度 public Color obstacleColor = Color.white; // 障碍物颜色 public float collisionEffectDuration = 0.5f; // 碰撞效果持续时间 public float collisionEffectSize = 1f; // 碰撞效果大小 public Color collisionEffectColor = Color.white; // 碰撞效果颜色 public int collisionEffectRingCount = 3; // 涟漪环的数量 public int collisionEffectDashCount = 12; // 每个环的虚线数量 public int maxObstacleCount = 20; // 最大障碍物数量 public float minDistanceToTarget = 3f; // 障碍物到目标的最小距离 public float maxDistanceToTarget = 10f; // 障碍物到目标的最大距离 [Header("目标触发效果")] public float targetTriggerDuration = 1f; // 目标触发效果的持续时间 public float targetTriggerStrength = 3f; // 目标触发效果的强度 public float targetTriggerSpreadSpeed = 6f; // 目标触发效果的传播速度 public Color targetTriggerColor = Color.red; // 目标触发效果的颜色 public float targetFadeInSpeed = 2f; // 目标淡入速度 public float targetScaleSpeed = 2f; // 目标大小变化速度 public float targetMaxScale = 1.5f; // 目标最大大小 [Header("文字效果设置")] public GameObject textPrefab; // TMP文本预制体 public Canvas worldSpaceCanvas; // 世界空间Canvas public float textFloatSpeed = 2f; // 文字上浮速度 public float textFadeInDuration = 0.3f; // 文字淡入时间 public float textFadeOutDuration = 0.5f; // 文字淡出时间 public float textScaleDuration = 0.5f; // 文字缩放时间 public float textMaxScale = 1.5f; // 文字最大缩放 public float textLifeTime = 1.5f; // 文字总生命周期 private Vector3[] points; // 存储每个点是否在可视区域内的标记 private bool[] validPoints; private float time; private List ripples = new List(); private List targetTriggerRipples = new List(); // 存储目标触发的涟漪 private Dictionary targetButtons = new Dictionary(); private List floatingTexts = new List(); private class FloatingText { public TextMeshProUGUI textComponent; public float startTime; public Vector3 startPosition; public Color targetColor; public float currentScale = 1f; public float currentAlpha = 0f; } [System.Serializable] public class TargetPoint { public string name = "未命名目标"; // 目标的名字 public Vector2 gridPosition; // 网格位置(0到pointCount-1) public TargetType type; public Color color = Color.white; [HideInInspector] public float visibility = 0f; // 可见度 [HideInInspector] public float scale = 1f; // 当前大小 [HideInInspector] public float lastTriggerTime = -1f; // 最后一次被触发的时间 [HideInInspector] public bool isFound = false; // 是否已被找到 } public enum TargetType { Sphere, Cube, Torus } private struct Ripple { public Vector2 position; public float startTime; } private struct RippleResult { public float heightOffset; public float brightnessBoost; public Color targetColor; public float targetInfluence; public float shapeDistortion; } [System.Serializable] public class Obstacle { public Vector2 gridPosition; // 网格位置(0到pointCount-1) public string displayText = "障碍"; // 碰撞时显示的文字 [HideInInspector]public float visibility = 0f; // 可见度 [HideInInspector]public float lastRippleTime = -1f; // 最后一次被涟漪影响的时间 [HideInInspector]public float riseProgress = 0f; // 升起进度(0-1) [HideInInspector]public float colorFadeProgress = 0f; // 颜色淡入进度(0-1) [HideInInspector]public float lastTextTime = -1f; // 最后一次生成文字的时间 } private struct CollisionEffect { public Vector2 position; public float startTime; } private List collisionEffects = new List(); private void Start() { // 添加按钮点击事件监听 if (upButton != null) upButton.onClick.AddListener(MoveUp); if (downButton != null) downButton.onClick.AddListener(MoveDown); if (leftButton != null) leftButton.onClick.AddListener(MoveLeft); if (rightButton != null) rightButton.onClick.AddListener(MoveRight); // 生成随机障碍物 GenerateRandomObstacles(); // 初始化目标按钮 InitializeTargetButtons(); } private void InitializeTargetButtons() { if (targetButtonPrefab == null || targetButtonsParent == null) return; // 清除现有的按钮 foreach (var button in targetButtons.Values) { if (button != null) Destroy(button.gameObject); } targetButtons.Clear(); // 为每个目标创建按钮 for (int i = 0; i < targetPoints.Count; i++) { var target = targetPoints[i]; var buttonObj = Instantiate(targetButtonPrefab, targetButtonsParent); var button = buttonObj.GetComponent