Files
ichni_Official/Assets/Scripts/NewStorySystem/YarnFunctions/PortraitAnimationCommands.cs
SoulliesOfficial 7b7d069b84 StorySystem
2026-07-07 01:28:27 -04:00

70 lines
3.3 KiB
C#

using UnityEngine;
using Yarn.Unity;
namespace Ichni.Story.YarnFunctions
{
/// <summary>
/// 立绘动画控制相关的 Yarn 自定义命令静态注册器。
/// 包含平移、跳跃、震动等 DOTween 动画表现。
/// </summary>
public static class PortraitAnimationCommands
{
// ── Yarn Commands ────────────────────────────────────────────────────────
/// <summary>
/// 平滑移动角色立绘到目标位置。
/// 格式: &lt;&lt;move_portrait characterId x y duration&gt;&gt;
/// </summary>
/// <param name="characterId">角色标识 ID</param>
/// <param name="x">目标 X 坐标 [-100, 100]</param>
/// <param name="y">目标 Y 坐标 [-100, 100]</param>
/// <param name="duration">动画持续时间(秒)</param>
[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);
}
/// <summary>
/// 让角色立绘原地跳跃。
/// 格式: &lt;&lt;jump_portrait characterId power numJumps duration&gt;&gt;
/// </summary>
/// <param name="characterId">角色标识 ID</param>
/// <param name="power">跳跃高度(使用与坐标域相同的归一化尺度,如 10 表示 10% 高度)</param>
/// <param name="numJumps">跳跃次数</param>
/// <param name="duration">动画总持续时间(秒)</param>
[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);
}
/// <summary>
/// 让角色立绘产生左右震动效果。
/// 格式: &lt;&lt;shake_portrait characterId duration strength vibrato&gt;&gt;
/// </summary>
/// <param name="characterId">角色标识 ID</param>
/// <param name="duration">震动持续时间(秒)</param>
/// <param name="strength">震动幅度(使用与坐标域相同的归一化尺度)</param>
/// <param name="vibrato">震动频率</param>
[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;
}
}
}