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);