196 lines
5.9 KiB
C#
Raw Normal View History

2025-06-25 23:14:09 +05:00
using UnityEngine;
using TMPro;
using DG.Tweening;
using System.Collections.Generic;
using System.Collections;
public enum NarrationID
{
Intro,
NewEmail,
ScanEmail,
CorrectReportChoice,
CorrectIgnoreChoice,
WrongIgnoreChoice,
Feedback,
GameEnd
}
public class NarrationPlayer : MonoBehaviour
{
public static NarrationPlayer Instance { get; private set; }
[Header("Narration Assets")]
public List<NarrationData> narrationDatabase;
[Header("Subtitle Settings")]
public TextMeshProUGUI subtitleText;
public float charDelay = 0.03f;
2025-07-24 14:26:09 +05:00
public float lineGroupDelay = 2.5f; // Fallback if no custom delay provided
2025-06-25 23:14:09 +05:00
2025-07-24 19:22:55 +05:00
public AudioSource audioSource;
2025-06-25 23:14:09 +05:00
private Tween typewriterTween;
private Dictionary<NarrationID, NarrationData> narrationMap;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
audioSource = gameObject.AddComponent<AudioSource>();
audioSource.playOnAwake = false;
narrationMap = new Dictionary<NarrationID, NarrationData>();
foreach (var data in narrationDatabase)
{
if (data != null && !narrationMap.ContainsKey(data.narrationID))
narrationMap[data.narrationID] = data;
}
}
public void PlayNarration(NarrationID id, System.Action onComplete = null)
{
2025-07-24 14:26:09 +05:00
InstructionManager.Instance.instructionBG.SetActive(true);
SceneOutcomeManager.Instance.progressbarCanvasGroup.alpha = 0;
2025-06-25 23:14:09 +05:00
if (!narrationMap.TryGetValue(id, out var narrationData))
{
Debug.LogWarning($"Narration not found for: {id}");
return;
}
bool isArabic = LanguageManager.Instance.IsArabic;
AudioClip clip = isArabic ? narrationData.arabicClip : narrationData.englishClip;
if (clip == null)
{
Debug.LogWarning($"Missing audio clip for {id} in language: {(isArabic ? "Arabic" : "English")}");
return;
}
if (audioSource.isPlaying)
audioSource.Stop();
audioSource.clip = clip;
audioSource.Play();
if (!string.IsNullOrEmpty(narrationData.localizationKey))
{
string rawSubtitle = LanguageManager.Instance.GetLocalizedText(narrationData.localizationKey);
string subtitle = isArabic
? ArabicFixerHelper.FixPreservingTags(rawSubtitle)
: rawSubtitle;
subtitleText.font = LanguageManager.Instance.GetCurrentFont();
2025-07-24 14:26:09 +05:00
subtitleText.fontSize = isArabic ? 38 : 50;
2025-06-25 23:14:09 +05:00
2025-07-24 14:26:09 +05:00
subtitleText.overflowMode = isArabic ? TextOverflowModes.Page : TextOverflowModes.Overflow;
subtitleText.isRightToLeftText = false;
2025-06-25 23:14:09 +05:00
2025-07-24 14:26:09 +05:00
AppendSubtitle(subtitle, isArabic, narrationData);
}
Invoke(nameof(scoreBarActivator), clip.length);
2025-06-25 23:14:09 +05:00
if (onComplete != null)
StartCoroutine(InvokeAfterNarration(clip.length, onComplete));
}
2025-07-24 14:26:09 +05:00
void scoreBarActivator()
{
2025-07-24 19:22:55 +05:00
Debug.Log("ScoreBarActivator");
2025-07-24 14:26:09 +05:00
CancelInvoke(nameof(scoreBarActivator));
2025-07-24 19:22:55 +05:00
if (SceneOutcomeManager.Instance.phishingEmailClicked == false)
{
Debug.Log("phishingEmailClicked == false");
SceneOutcomeManager.Instance.progressbarCanvasGroup.alpha = 1;
InstructionManager.Instance.instructionBG.SetActive(false);
}
else
{
Debug.Log("phishingEmailClicked == true");
InstructionManager.Instance.instructionBG.SetActive(false);
}
2025-07-24 14:26:09 +05:00
}
private void AppendSubtitle(string fullText, bool isArabic, NarrationData narrationData)
2025-06-25 23:14:09 +05:00
{
typewriterTween?.Kill();
subtitleText.text = "";
if (isArabic)
{
2025-07-24 14:26:09 +05:00
StartCoroutine(ShowArabicByPages(fullText, narrationData));
2025-06-25 23:14:09 +05:00
}
2025-07-24 14:26:09 +05:00
else
{
StartCoroutine(ShowLinesWithCustomDelay(fullText, narrationData));
}
}
2025-06-25 23:14:09 +05:00
2025-07-24 14:26:09 +05:00
private IEnumerator ShowLinesWithCustomDelay(string fullText, NarrationData narrationData)
{
subtitleText.text = "";
string[] lines = fullText.Split(new[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
int length = lines.Length;
for (int i = 0; i < length; i++)
2025-06-25 23:14:09 +05:00
{
2025-07-24 14:26:09 +05:00
subtitleText.text = lines[i];
2025-06-25 23:14:09 +05:00
subtitleText.ForceMeshUpdate();
2025-07-24 14:26:09 +05:00
float delay = (narrationData != null && i < narrationData.lineDelays.Count) ? narrationData.lineDelays[i] : lineGroupDelay;
yield return new WaitForSeconds(delay);
}
//if (length > 1)
// SceneOutcomeManager.Instance.progressbarCanvasGroup.alpha = 1;
2025-06-25 23:14:09 +05:00
}
2025-07-24 14:26:09 +05:00
private IEnumerator ShowArabicByPages(string fullText, NarrationData narrationData)
2025-06-25 23:14:09 +05:00
{
subtitleText.text = fullText;
subtitleText.ForceMeshUpdate();
int totalPages = subtitleText.textInfo.pageCount;
for (int i = 1; i <= totalPages; i++)
{
subtitleText.pageToDisplay = i;
2025-07-24 14:26:09 +05:00
float delay = (narrationData != null && (i - 1) < narrationData.arabicLineDelays.Count) ? narrationData.arabicLineDelays[(i - 1)] : lineGroupDelay;
Debug.Log("arabic delay is: " + delay);
yield return new WaitForSeconds(delay);
2025-06-25 23:14:09 +05:00
}
2025-07-24 14:26:09 +05:00
//SceneOutcomeManager.Instance.progressbarCanvasGroup.alpha = 1;
2025-06-25 23:14:09 +05:00
}
private IEnumerator InvokeAfterNarration(float delay, System.Action callback)
{
yield return new WaitForSeconds(delay);
callback?.Invoke();
}
public void StopNarration()
{
if (audioSource.isPlaying)
audioSource.Stop();
2025-07-24 19:22:55 +05:00
2025-06-25 23:14:09 +05:00
typewriterTween?.Kill();
2025-07-24 14:26:09 +05:00
StopAllCoroutines();
2025-06-25 23:14:09 +05:00
}
public void ClearSubtitles()
{
typewriterTween?.Kill();
subtitleText.text = "";
2025-07-24 14:26:09 +05:00
StopAllCoroutines();
2025-06-25 23:14:09 +05:00
}
public bool IsPlaying => audioSource.isPlaying;
2025-07-24 19:22:55 +05:00
}