100 lines
3.6 KiB
C#
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;
|
|
}
|
|
}
|