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;
}
}
}