diff --git a/Assets/Prefabs/UI/DialogueCanvas.prefab b/Assets/Prefabs/UI/DialogueCanvas.prefab index 7dcbcd58..7c599c83 100644 --- a/Assets/Prefabs/UI/DialogueCanvas.prefab +++ b/Assets/Prefabs/UI/DialogueCanvas.prefab @@ -114,13 +114,14 @@ MonoBehaviour: m_EditorClassIdentifier: AppleHillsScripts::Dialogue.SpeechBubble textDisplay: {fileID: 4573570654593171780} imageDisplay: {fileID: 4814676392695871198} + dialoguePromptImage: {fileID: 6481613319593204747} + dialogueBubble: {fileID: 1494212192306772670} displayMode: 1 typewriterSpeed: 0.05 typingSoundSource: {fileID: 0} typingSoundFrequency: 3 useRichText: 1 dialogueDisplayTime: 3 - dialoguePromptText: . . . --- !u!1 &3571537114331005905 GameObject: m_ObjectHideFlags: 0 @@ -353,6 +354,81 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &5966238993889414591 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2913690643654480743} + - component: {fileID: 5237027710007059819} + - component: {fileID: 6481613319593204747} + m_Layer: 5 + m_Name: Prompt + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &2913690643654480743 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5966238993889414591} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3484825090253933040} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 143, y: 74} + m_SizeDelta: {x: 245, y: 148} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5237027710007059819 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5966238993889414591} + m_CullTransparentMesh: 1 +--- !u!114 &6481613319593204747 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5966238993889414591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1369078500869033561, guid: d52355bd23697ac4eaad116fb0aec19d, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &6499933157207406972 GameObject: m_ObjectHideFlags: 0 @@ -385,6 +461,7 @@ RectTransform: m_ConstrainProportionsScale: 1 m_Children: - {fileID: 8307219291215824345} + - {fileID: 2913690643654480743} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} diff --git a/Assets/Scripts/Dialogue/SpeechBubble.cs b/Assets/Scripts/Dialogue/SpeechBubble.cs index 47cf5c3a..34804b9b 100644 --- a/Assets/Scripts/Dialogue/SpeechBubble.cs +++ b/Assets/Scripts/Dialogue/SpeechBubble.cs @@ -19,14 +19,15 @@ namespace Dialogue public class SpeechBubble : MonoBehaviour { [SerializeField] private TextMeshProUGUI textDisplay; - [SerializeField] private Image imageDisplay; // New field for displaying images + [SerializeField] private Image imageDisplay; // For displaying images in dialogue + [SerializeField] private Image dialoguePromptImage; // NEW: Reference to the dialogue prompt image + [SerializeField] private GameObject dialogueBubble; // NEW: Reference to the dialogue bubble container [SerializeField] private TextDisplayMode displayMode = TextDisplayMode.Typewriter; [SerializeField] private float typewriterSpeed = 0.05f; // Time between characters in seconds [SerializeField] private AudioSource typingSoundSource; [SerializeField] private float typingSoundFrequency = 3; // Play sound every X characters [SerializeField] private bool useRichText = true; // Whether to respect rich text tags [SerializeField] private float dialogueDisplayTime = 1.5f; // Time in seconds to display dialogue before showing prompt - [SerializeField] private string dialoguePromptText = ". . ."; // Text to show as a prompt for available dialogue private Coroutine typewriterCoroutine; private Coroutine promptUpdateCoroutine; @@ -34,15 +35,22 @@ namespace Dialogue private Sprite currentImage = null; private bool isVisible = false; private DialogueContentType currentContentType = DialogueContentType.Text; + private bool isPromptVisible = false; // Track if we're showing the prompt or dialogue private void Awake() { - // Ensure we have both components + // Ensure we have the required components if (textDisplay == null) Debug.LogError("SpeechBubble: TextMeshProUGUI component is not assigned!"); if (imageDisplay == null) - Debug.LogError("SpeechBubble: Image component is not assigned!"); + Debug.LogError("SpeechBubble: Image component for dialogue is not assigned!"); + + if (dialoguePromptImage == null) + Debug.LogError("SpeechBubble: Dialogue prompt image is not assigned!"); + + if (dialogueBubble == null) + Debug.LogError("SpeechBubble: Dialogue bubble container is not assigned!"); } /// @@ -50,16 +58,28 @@ namespace Dialogue /// public void Show() { - gameObject.SetActive(true); + // If we're showing the prompt, we only activate the prompt image + if (isPromptVisible) + { + dialogueBubble.SetActive(false); + dialoguePromptImage.gameObject.SetActive(true); + } + else // Otherwise, show the dialogue bubble + { + dialogueBubble.SetActive(true); + dialoguePromptImage.gameObject.SetActive(false); + } + isVisible = true; } /// - /// Hide the speech bubble + /// Hide the speech bubble and prompt /// public void Hide() { - gameObject.SetActive(false); + dialogueBubble.SetActive(false); + dialoguePromptImage.gameObject.SetActive(false); isVisible = false; // Stop any ongoing typewriter effect @@ -102,6 +122,7 @@ namespace Dialogue currentFullText = text; currentContentType = DialogueContentType.Text; + isPromptVisible = false; // We're showing dialogue, not a prompt // Stop any existing typewriter effect if (typewriterCoroutine != null) @@ -110,7 +131,7 @@ namespace Dialogue typewriterCoroutine = null; } - // Activate text display, deactivate image display + // Activate text display, deactivate image display within the dialogue bubble textDisplay.gameObject.SetActive(true); if (imageDisplay != null) { @@ -150,6 +171,7 @@ namespace Dialogue // Display the dialogue line if (!string.IsNullOrEmpty(line)) { + isPromptVisible = false; // We're showing dialogue content SetText(line); // After a delay, update the prompt visibility @@ -163,19 +185,24 @@ namespace Dialogue } /// - /// Update the speech bubble to either show a prompt or hide based on dialogue availability + /// Update to either show the dialogue prompt image or hide based on dialogue availability /// /// Whether dialogue is available public void UpdatePromptVisibility(bool hasDialogueAvailable) { if (hasDialogueAvailable) { - Show(); - SetText(dialoguePromptText); + isPromptVisible = true; // We're showing the prompt, not dialogue + + // Hide dialogue bubble, show prompt image + dialogueBubble.SetActive(false); + dialoguePromptImage.gameObject.SetActive(true); + + isVisible = true; } else { - Hide(); + Hide(); // Hide both bubble and prompt } } @@ -291,6 +318,7 @@ namespace Dialogue currentImage = sprite; currentContentType = DialogueContentType.Image; + isPromptVisible = false; // We're showing dialogue content, not a prompt // Activate image display, set the sprite imageDisplay.gameObject.SetActive(true); @@ -364,6 +392,7 @@ namespace Dialogue } // Display the content based on its type + isPromptVisible = false; // We're showing dialogue content currentContentType = content.ContentType; if (content.ContentType == DialogueContentType.Text) @@ -372,6 +401,10 @@ namespace Dialogue textDisplay.gameObject.SetActive(true); if (imageDisplay != null) imageDisplay.gameObject.SetActive(false); + // Show dialogue bubble, hide prompt + dialogueBubble.SetActive(true); + dialoguePromptImage.gameObject.SetActive(false); + // Display the text DisplayDialogueLine(content.Text, hasMoreDialogue); } @@ -381,6 +414,10 @@ namespace Dialogue textDisplay.gameObject.SetActive(false); if (imageDisplay != null) imageDisplay.gameObject.SetActive(true); + // Show dialogue bubble, hide prompt + dialogueBubble.SetActive(true); + dialoguePromptImage.gameObject.SetActive(false); + // Set the image SetImage(content.Image);