using UnityEngine; using Yarn.Unity; namespace Ichni.Story.YarnFunctions { /// /// 立绘动画控制相关的 Yarn 自定义命令静态注册器。 /// 包含平移、跳跃、震动等 DOTween 动画表现。 /// public static class PortraitAnimationCommands { // ── Yarn Commands ──────────────────────────────────────────────────────── /// /// 平滑移动角色立绘到目标位置。 /// 格式: <<move_portrait characterId x y duration>> /// /// 角色标识 ID /// 目标 X 坐标 [-100, 100] /// 目标 Y 坐标 [-100, 100] /// 动画持续时间(秒) [YarnCommand("move_portrait")] public static void MovePortrait(string characterId, float x, float y, float duration) { if (!EnsureStage()) return; Dialogue.VNPortraitStage.Instance.MovePortrait(characterId, new Vector2(x, y), duration); } /// /// 让角色立绘原地跳跃。 /// 格式: <<jump_portrait characterId power numJumps duration>> /// /// 角色标识 ID /// 跳跃高度(使用与坐标域相同的归一化尺度,如 10 表示 10% 高度) /// 跳跃次数 /// 动画总持续时间(秒) [YarnCommand("jump_portrait")] public static void JumpPortrait(string characterId, float power, int numJumps, float duration) { if (!EnsureStage()) return; Dialogue.VNPortraitStage.Instance.JumpPortrait(characterId, power, numJumps, duration); } /// /// 让角色立绘产生左右震动效果。 /// 格式: <<shake_portrait characterId duration strength vibrato>> /// /// 角色标识 ID /// 震动持续时间(秒) /// 震动幅度(使用与坐标域相同的归一化尺度) /// 震动频率 [YarnCommand("shake_portrait")] public static void ShakePortrait(string characterId, float duration, float strength, int vibrato) { if (!EnsureStage()) return; Dialogue.VNPortraitStage.Instance.ShakePortrait(characterId, duration, strength, vibrato); } // ── 内部辅助 ───────────────────────────────────────────────────────────── private static bool EnsureStage() { if (Dialogue.VNPortraitStage.Instance != null) return true; Debug.LogError("[PortraitAnimationCommands] 未找到 VNPortraitStage 实例!请确保在当前场景中存在挂载了 VNPortraitStage 的游戏物体。"); return false; } } }