// ReSharper disable once CheckNamespace using UnityEngine; /// /// Простая утилита: связывает `EnemyData` и `SoundProfile`. /// - копирует массивы победы/поражения из SoundProfile в EnemyData /// - заполняет поле `voiceClip` у элементов DialogueLine в соответствующих массивах EnemyData /// Используй ContextMenu "Fill From SoundProfile" или включи Fill On Start. /// public class EnemyDataSoundFiller : MonoBehaviour { [Tooltip("Ассет EnemyData для заполнения")] public EnemyData enemyData; [Tooltip("SoundProfile из которого берутся клипы")] public SoundProfile soundProfile; [Header("Behavior")] [Tooltip("Если значение равно true, то программа filler запустится автоматически в Start()")] public bool fillOnStart = true; [Tooltip("Если true, существующие DialogueLine.voiceClip будут перезаписаны; иначе непустые клипы сохраняются")] public bool overwriteExistingVoiceClips = true; void Start() { if (fillOnStart) FillFromProfile(); } [ContextMenu("Fill From SoundProfile")] public void FillFromProfile() { if (enemyData == null) { Debug.LogWarning("EnemyDataSoundFiller: enemyData is null"); return; } if (soundProfile == null) { Debug.LogWarning("EnemyDataSoundFiller: soundProfile is null"); return; } // Copy victory/defeat arrays enemyData.playerVictory = CloneArray(soundProfile.playerVictory); enemyData.playerDefeat = CloneArray(soundProfile.botVictory); // Helper to copy clips into DialogueLine arrays void FillDialogueArray(ref DialogueLine[] lines, AudioClip[] clips) { if (clips == null || clips.Length == 0) return; // Если массив диалогов пуст или null, создаём новый размерностью как у клипов if (lines == null || lines.Length == 0) { lines = new DialogueLine[clips.Length]; } for (int i = 0; i < lines.Length; i++) { if (!overwriteExistingVoiceClips && lines[i].voiceClip != null) continue; DialogueLine tmp = lines[i]; AudioClip clip = clips[i % clips.Length]; tmp.voiceClip = clip; if (clip != null) { tmp.text = clip.name; } // Чередуем TalkBot1 и TalkBot2 tmp.animationName = (i % 2 == 0) ? AnimationName.TalkBot1 : AnimationName.TalkBot2; lines[i] = tmp; } } // Fill event arrays FillDialogueArray(ref enemyData.onPlayerHit, soundProfile.playerHit); FillDialogueArray(ref enemyData.onPlayerMiss, soundProfile.playerMiss); FillDialogueArray(ref enemyData.onBotHit, soundProfile.botHit); FillDialogueArray(ref enemyData.onBotMiss, soundProfile.botMiss); FillDialogueArray(ref enemyData.onPlayerShipDestroyed, soundProfile.playerShipDestroyed); FillDialogueArray(ref enemyData.onBotShipDestroyed, soundProfile.botShipDestroyed); // Optionally fill generic dialogues[] if you want (currently skipped) #if UNITY_EDITOR UnityEditor.EditorUtility.SetDirty(enemyData); #endif Debug.Log($"EnemyDataSoundFiller: filled '{enemyData.name}' from SoundProfile '{soundProfile.profileName}'"); } static AudioClip[] CloneArray(AudioClip[] arr) { if (arr == null) return null; var copy = new AudioClip[arr.Length]; System.Array.Copy(arr, copy, arr.Length); return copy; } }