using UnityEngine; namespace Unheimlich.Features.Dialogue.Data { [CreateAssetMenu(fileName = "NewObjectDescriptionSettings", menuName = "Unheimlich/Animation/Object Description Settings")] public class ObjectDescriptionSettings : ScriptableObject { [Header("Spawn Settings")] [Tooltip("Spawn mode for floating words")] public ChoiceSpawnMode SpawnMode = ChoiceSpawnMode.AroundAnchor; [Tooltip("Number of floating words to spawn around the object")] [Range(1, 10)] public int WordCount = 3; [Tooltip("Radius around anchor where words spawn")] public float SpawnRadius = 1.5f; [Tooltip("Height offset from anchor")] public float SpawnHeightOffset = 0f; [Tooltip("Forward offset from anchor (to avoid clipping with object)")] public float ForwardOffset = 0.5f; [Tooltip("Tilt angle in degrees (rotation around Right axis for height adjustment)")] [Range(-90f, 90f)] public float TiltAngle = 0f; [Tooltip("Should words face the player?")] public bool FacePlayer = true; [Tooltip("Duration of spawn animation")] public float SpawnAnimationDuration = 1f; [Tooltip("Spawn animation curve")] public AnimationCurve SpawnCurve = AnimationCurve.EaseInOut(0, 0, 1, 1); [Header("Idle Behavior")] [Tooltip("Should words float vertically?")] public bool EnableFloating = true; [Tooltip("Floating amplitude")] public float FloatingAmplitude = 0.2f; [Tooltip("Floating duration (full cycle)")] public float FloatingDuration = 3f; [Tooltip("Enable organic shake/drift movement around center point")] public bool EnableOrganicShake = true; [Tooltip("Radius around center point where words can drift")] public float ShakeRadius = 0.15f; [Tooltip("Speed of the shake movement")] public float ShakeSpeed = 1.5f; [Tooltip("Smoothness of shake transitions (higher = smoother)")] public float ShakeSmoothness = 2f; [Header("Ghost Trail Effect")] [Tooltip("Enable ghost/shadow trail effect behind text")] public bool EnableGhostTrail = false; [Tooltip("Time delay for ghost trail in seconds")] public float GhostTrailDelay = 0.4f; [Tooltip("Transparency of the ghost trail (0 = invisible, 1 = opaque)")] [Range(0f, 1f)] public float GhostTrailAlpha = 0.5f; [Header("Rotation")] [Tooltip("Should container rotate continuously?")] public bool EnableRotation = true; [Tooltip("Axis of rotation")] public RotationAxis RotationAxis = RotationAxis.Up; [Tooltip("Rotation speed (in seconds for a full rotation)")] public float RotationSpeed = 10f; [Header("Convergence Behavior")] [Tooltip("Minimum radius when cursor is on object (words converge here)")] public float MinConvergenceRadius = 0.1f; [Tooltip("Speed at which words converge to center")] public float ConvergenceSpeed = 5f; [Tooltip("Duration of the merge animation when words fuse together")] public float MergeDuration = 0.3f; [Tooltip("Scale multiplier during merge animation")] public float MergeScalePulse = 1.2f; [Tooltip("If true, merge only happens once and words stay merged. If false, words can merge/unmerge repeatedly.")] public bool MergeOnce = false; [Tooltip("Duration in seconds the merged word stays visible before disappearing (only used if mergeOnce is true)")] public float MergeOnceDisplayDuration = 3f; [Header("Player Distance")] [Tooltip("Distance from object at which words appear")] public float ActivationDistance = 5f; [Tooltip("Distance beyond which words disappear")] public float DeactivationDistance = 7f; [Header("Visual Settings")] [Tooltip("Enable distance-based scaling")] public bool EnableDistanceScaling = true; [Tooltip("Minimum distance for scaling calculation")] public float MinDistance = 2f; [Tooltip("Maximum distance for scaling calculation")] public float MaxDistance = 10f; [Tooltip("Scale multiplier at minimum distance")] public float MinScaleMultiplier = 1f; [Tooltip("Scale multiplier at maximum distance")] public float MaxScaleMultiplier = 2.5f; } }