sea-battle/Assets/Scripts/Tools/EnemyDataSoundFiller.cs

100 lines
3.6 KiB
C#

// ReSharper disable once CheckNamespace
using UnityEngine;
/// <summary>
/// Ïðîñòàÿ óòèëèòà: ñâÿçûâàåò `EnemyData` è `SoundProfile`.
/// - êîïèðóåò ìàññèâû ïîáåäû/ïîðàæåíèÿ èç SoundProfile â EnemyData
/// - çàïîëíÿåò ïîëå `voiceClip` ó ýëåìåíòîâ DialogueLine â ñîîòâåòñòâóþùèõ ìàññèâàõ EnemyData
/// Èñïîëüçóé ContextMenu "Fill From SoundProfile" èëè âêëþ÷è Fill On Start.
/// </summary>
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;
}
}