using UnityEngine;
using System.Collections.Generic;
using System.Linq;
using DG.Tweening;
using Shapes;
using TMPro;
namespace AibisDream.MiniGame.Language
{
///
/// 游戏完成阶段
///
public enum CompletionPhase
{
None, // 未完成
Arranging, // 排列中
Revealing, // 揭示中
Completed // 已完成
}
///
/// 语言粒子系统主管理器
///
public class LanguageParticleManager : MonoBehaviour
{
[Header("Canvas设置")]
[SerializeField] private Canvas worldCanvas;
[SerializeField] private float canvasSize = 10f;
[Header("字体设置")]
[SerializeField] private TMP_FontAsset chineseFontAsset;
[Header("粒子预制体")]
[SerializeField] private GameObject floatingParticlePrefab;
[SerializeField] private GameObject candidateParticlePrefab;
[Header("粒子数量")]
[SerializeField] private int floatingCount = 100;
[SerializeField] private int candidateCount = 50;
[SerializeField] private int redParticleCount = 8;
[Header("游戏参数")]
[SerializeField] private float connectionDistance = 2f; // Unity单位
[SerializeField] private float textMargin = 1f;
[Header("目标句子")]
[SerializeField] private string targetSentence = "别过来我感觉害怕";
[Header("波形参数")]
[SerializeField] private float waveformAmplitude = 0.3f;
[SerializeField] private float interactionRadius = 0.5f;
[Header("鼠标交互参数")]
[SerializeField] private float mouseInteractionRadius = 1.5f;
[SerializeField] private float repulsionForce = 2f;
[SerializeField] private float attractionForce = 1.5f;
// 粒子列表
private List floatingParticles = new List();
private List candidateParticles = new List();
private List redParticles = new List();
// 效果系统
private List effectPropagations = new List();
private Dictionary previousConnections = new Dictionary();
private bool initializationComplete = false;
private int initializationFrames = 0;
// 游戏状态
private bool isCompleted = false;
private CompletionPhase completionPhase = CompletionPhase.None;
private float completionTimer = 0f;
private float fadeOutAlpha = 1f;
private List orderedRedParticles = new List();
private List targetPositions = new List();
// 波形系统
private List waveformPoints = new List();
private float calmProgress = 0f;
private Vector2 lastMousePos;
private float mouseDragSpeed;
// 边界
private Bounds movementBounds;
// 连接渲染(使用Shapes)
private ConnectionRenderer connectionRenderer;
private WaveformRenderer waveformRenderer;
private void Start()
{
InitializeCanvas();
InitializeParticles();
InitializeRenderers();
}
private void InitializeCanvas()
{
// 如果没有指定canvas,创建一个
if (worldCanvas == null)
{
GameObject canvasObj = new GameObject("Language Canvas");
canvasObj.transform.SetParent(transform);
canvasObj.transform.localPosition = Vector3.zero;
worldCanvas = canvasObj.AddComponent