using UnityEngine; using Shapes; using System.Collections.Generic; using UnityEngine.UI; using TMPro; using Yarn.Unity; using AibisDream; using AibisDream.Framework; [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 string completionDialogueNode = "EmoComplete"; // 游戏完成时的对话节点 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 targetInfluenceRange = 5f; // 目标点颜色影响范围 [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 maxObstacleCount = 20; // 最大障碍物数量 public float minDistanceToTarget = 3f; // 障碍物到目标的最小距离 public float maxDistanceToTarget = 10f; // 障碍物到目标的最大距离 public float collisionEffectLineWidth = 0.02f; // 碰撞效果圆环的线宽 public float targetInfluenceRadius = 5f; // 目标点影响半径 public float maxTargetInfluence = 1.5f; // 目标点最大影响系数(影响碰撞效果大小) public float minCollisionEffectRadius = 0.5f; // 碰撞效果最小半径 public float maxCollisionEffectRadius = 2f; // 碰撞效果最大半径 [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 textMinScale = 0.8f; // 文字最小缩放 public float textMaxScale = 1.5f; // 文字最大缩放 public float textLifeTime = 1.5f; // 文字总生命周期 public float textShakeIntensity = 0.1f; // 文字震动强度 public float textShakeFrequency = 10f; // 文字震动频率 public float textShakeDuration = 0.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; public bool shouldShake = false; public float shakeStartTime = 0f; public Vector3 originalPosition; } [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; // 是否已被找到 // Yarn 对话节点 public string foundDialogueNode; // 找到目标时触发的对话节点 // 影响文本配置 public List veryCloseTexts = new List(); // 非常近的文本 public List closeTexts = new List(); // 近的文本 public List mediumTexts = new List(); // 中等距离的文本 public List farTexts = new List(); // 远的文本 public List veryFarTexts = new List(); // 非常远的文本 public List extremelyFarTexts = new List(); // 极远的文本 } 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; public float targetInfluence; public Color targetColor; } private List collisionEffects = new List(); // 涟漪效果相关常量 private const float RIPPLE_SPREAD_FACTOR = 0.3f; private const float RIPPLE_DISTANCE_FACTOR = 2f; private const float RIPPLE_BRIGHTNESS_MULTIPLIER = 1.5f; private const float RIPPLE_TIME_FACTOR = 0.5f; private const float RIPPLE_EASE_FACTOR = 0.5f; // 影响距离阈值 private const float VERY_CLOSE_DISTANCE = 2f; private const float CLOSE_DISTANCE = 4f; private const float MEDIUM_DISTANCE = 6f; private const float FAR_DISTANCE = 8f; private const float VERY_FAR_DISTANCE = 10f; 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; // 清除现有的按钮 ClearTargetButtons(); } private void CreateTargetButton(TargetPoint target) { if (targetButtonPrefab == null || targetButtonsParent == null) return; // 如果按钮已经存在,直接显示 if (targetButtons.ContainsKey(target)) { targetButtons[target].gameObject.SetActive(true); return; } // 创建新按钮 var buttonObj = Instantiate(targetButtonPrefab, targetButtonsParent); var button = buttonObj.GetComponent