using UnityEngine; using System; [CreateAssetMenu(fileName = "NewEnemyData", menuName = "Enemies/EnemyData")] public class EnemyData : ScriptableObject { public string nickname; [Header("Анимации персонажа")] public AnimatorOverrideController animatorOverride; // для покадровой анимации public Sprite characterSprite; // текущий/нейтральный спрайт (fallback) [Header("Озвучка победы игрока")] public AudioClip[] playerVictory; [Header("Озвучка победы бота")] public AudioClip[] playerDefeat; [Header("Фразы для диалога")] public DialogueLine[] dialogues; [Header("Событийные диалоги")] public DialogueLine[] onPlayerHit; // Игрок попал public DialogueLine[] onPlayerMiss; // Игрок промазал public DialogueLine[] onBotHit; // Бот попал public DialogueLine[] onBotMiss; // Бот промазал public DialogueLine[] onPlayerShipDestroyed; // Корабль игрока уничтожен public DialogueLine[] onBotShipDestroyed; // Корабль бота уничтожен // Вспомогательный метод для получения случайной фразы из категории public DialogueLine? GetRandomDialogue(DialogueEventType eventType) { DialogueLine[] sourceArray = null; switch (eventType) { case DialogueEventType.PlayerHit: sourceArray = onPlayerHit; break; case DialogueEventType.PlayerMiss: sourceArray = onPlayerMiss; break; case DialogueEventType.BotHit: sourceArray = onBotHit; break; case DialogueEventType.BotMiss: sourceArray = onBotMiss; break; case DialogueEventType.PlayerShipDestroyed: sourceArray = onPlayerShipDestroyed; break; case DialogueEventType.BotShipDestroyed: sourceArray = onBotShipDestroyed; break; } if (sourceArray != null && sourceArray.Length > 0) { return sourceArray[UnityEngine.Random.Range(0, sourceArray.Length)]; } return null; } } public enum DialogueEventType { PlayerHit, PlayerMiss, BotHit, BotMiss, PlayerShipDestroyed, BotShipDestroyed } // Enum для имён состояний аниматора public enum AnimationName { None, TalkBot1, TalkBot2, TalkBot3, TalkBot4, AngerBot1, AngerBot2, LaughterBot1, BackBot, ForwardBot } [System.Serializable] public struct DialogueLine { [TextArea(2, 5)] public string text; // Теперь используем enum вместо строки — в инспекторе будет выпадающий список public AnimationName animationName; // например AnimationName.TalkBot1 public AudioClip voiceClip; } // Вспомогательный класс, который даёт строковое имя состояния аниматора для каждого enum-члена public static class AnimationNameExtensions { public static string ToStateName(this AnimationName name) { switch (name) { case AnimationName.TalkBot1: return "talk_bot_1"; case AnimationName.TalkBot2: return "talk_bot_2"; case AnimationName.TalkBot3: return "talk_bot_3"; case AnimationName.TalkBot4: return "talk_bot_4"; case AnimationName.AngerBot1: return "anger_bot_1"; case AnimationName.AngerBot2: return "anger_bot_2"; case AnimationName.LaughterBot1: return "laughter_bot_1"; case AnimationName.BackBot: return "back_bot"; case AnimationName.ForwardBot: return "forward_bot"; default: return string.Empty; } } }