Somewhat working indicators

This commit is contained in:
Michal Pikulski
2025-10-02 07:41:27 +02:00
parent dac119fd7b
commit 9c67f503d2
7 changed files with 172 additions and 80 deletions

View File

@@ -1,57 +0,0 @@
using UnityEngine;
using UnityEditor;
using AppleHills.Editor;
using AppleHills.Core.Settings;
namespace PuzzleS.Editor
{
[CustomEditor(typeof(ObjectiveStepBehaviour))]
public class ObjectiveStepBehaviourEditor : UnityEditor.Editor
{
private SerializedProperty stepDataProperty;
private SerializedProperty indicatorPrefabProperty;
private SerializedProperty drawPromptRangeGizmoProperty;
private void OnEnable()
{
stepDataProperty = serializedObject.FindProperty("stepData");
indicatorPrefabProperty = serializedObject.FindProperty("indicatorPrefab");
drawPromptRangeGizmoProperty = serializedObject.FindProperty("drawPromptRangeGizmo");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
// Draw default inspector properties
EditorGUILayout.PropertyField(stepDataProperty);
EditorGUILayout.Space();
EditorGUILayout.LabelField("Indicator Settings", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(indicatorPrefabProperty);
EditorGUILayout.PropertyField(drawPromptRangeGizmoProperty);
// Add button to create default indicator
EditorGUILayout.Space();
if (GUILayout.Button("Create Default Indicator"))
{
var interactionSettings = EditorSettingsProvider.GetSettings<InteractionSettings>();
if (interactionSettings != null && interactionSettings.DefaultPuzzleIndicatorPrefab != null)
{
indicatorPrefabProperty.objectReferenceValue = interactionSettings.DefaultPuzzleIndicatorPrefab;
serializedObject.ApplyModifiedProperties();
Debug.Log("Default puzzle indicator prefab assigned from settings");
}
else
{
Debug.LogWarning("Default puzzle indicator prefab not set in InteractionSettings!");
EditorUtility.DisplayDialog("No Default Indicator",
"The default puzzle indicator prefab is not set in the InteractionSettings asset.", "OK");
}
}
serializedObject.ApplyModifiedProperties();
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: ba55b805a871449e9429e1a210f22fed
timeCreated: 1759312523

View File

@@ -78,3 +78,5 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
stepData: {fileID: 0} stepData: {fileID: 0}
puzzleIndicator: {fileID: 0}
drawPromptRangeGizmo: 1

View File

@@ -303,6 +303,10 @@ PrefabInstance:
propertyPath: indicatorPrefab propertyPath: indicatorPrefab
value: value:
objectReference: {fileID: 517425340} objectReference: {fileID: 517425340}
- target: {fileID: 4778083634590203921, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: puzzleIndicator
value:
objectReference: {fileID: 517425340}
- target: {fileID: 6254953093500072797, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3} - target: {fileID: 6254953093500072797, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: characterToInteract propertyPath: characterToInteract
value: 1 value: 1
@@ -585,6 +589,14 @@ PrefabInstance:
propertyPath: m_Enabled propertyPath: m_Enabled
value: 1 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4778083634590203921, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: indicatorPrefab
value:
objectReference: {fileID: 1398956015}
- target: {fileID: 4778083634590203921, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: puzzleIndicator
value:
objectReference: {fileID: 1398956015}
- target: {fileID: 6254953093500072797, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3} - target: {fileID: 6254953093500072797, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: isOneTime propertyPath: isOneTime
value: 0 value: 0
@@ -599,7 +611,10 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: [] m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: 2844046668579196942, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
insertIndex: -1
addedObject: {fileID: 2027386480}
m_AddedComponents: [] m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3} m_SourcePrefab: {fileID: 100100000, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
--- !u!1 &384576743 --- !u!1 &384576743
@@ -1969,6 +1984,11 @@ PrefabInstance:
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 1631660124} addedObject: {fileID: 1631660124}
m_SourcePrefab: {fileID: 100100000, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3} m_SourcePrefab: {fileID: 100100000, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
--- !u!1 &1398956015 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 4963699568605073487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
m_PrefabInstance: {fileID: 2027386479}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1443361595 --- !u!1 &1443361595
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -2638,6 +2658,80 @@ Transform:
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &2027386479
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 754397347}
m_Modifications:
- target: {fileID: 4963699568605073487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_Name
value: TestIndicator
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalScale.x
value: -0.02
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalScale.y
value: 0.022568762
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalScale.z
value: 0.36117727
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalPosition.x
value: 0.62
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalPosition.y
value: 0.53
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalRotation.w
value: -0.020675343
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalRotation.z
value: 0.99978626
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 182.369
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
--- !u!4 &2027386480 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6675530734045362487, guid: cac39b7f8f414e7499e7b672d8710642, type: 3}
m_PrefabInstance: {fileID: 2027386479}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2102167558 stripped --- !u!4 &2102167558 stripped
Transform: Transform:
m_CorrespondingSourceObject: {fileID: 2844046668579196942, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3} m_CorrespondingSourceObject: {fileID: 2844046668579196942, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}

View File

@@ -8,6 +8,16 @@ namespace PuzzleS
/// </summary> /// </summary>
public interface IPuzzlePrompt public interface IPuzzlePrompt
{ {
/// <summary>
/// Called when the prompt should be initially shown (e.g., when step is unlocked)
/// </summary>
void OnShow();
/// <summary>
/// Called when the prompt should be hidden (e.g., when step is locked)
/// </summary>
void OnHide();
/// <summary> /// <summary>
/// Called when the player enters the outer range of the prompt. /// Called when the player enters the outer range of the prompt.
/// </summary> /// </summary>

View File

@@ -3,6 +3,7 @@ using Interactions;
using UnityEngine; using UnityEngine;
using System; using System;
using AppleHills.Core.Settings; using AppleHills.Core.Settings;
using UnityEngine.Serialization;
namespace PuzzleS namespace PuzzleS
{ {
@@ -18,12 +19,11 @@ namespace PuzzleS
public PuzzleStepSO stepData; public PuzzleStepSO stepData;
[Header("Indicator Settings")] [Header("Indicator Settings")]
[SerializeField] private GameObject indicatorPrefab; [SerializeField] private GameObject puzzleIndicator;
[SerializeField] private bool drawPromptRangeGizmo = true; [SerializeField] private bool drawPromptRangeGizmo = true;
private Interactable _interactable; private Interactable _interactable;
private bool _isUnlocked = false; private bool _isUnlocked = false;
private GameObject _spawnedIndicator;
private IPuzzlePrompt _indicator; private IPuzzlePrompt _indicator;
// Current proximity state tracked by PuzzleManager // Current proximity state tracked by PuzzleManager
@@ -62,14 +62,6 @@ namespace PuzzleS
_interactable.interactionComplete.RemoveListener(OnInteractionComplete); _interactable.interactionComplete.RemoveListener(OnInteractionComplete);
} }
PuzzleManager.Instance?.UnregisterStepBehaviour(this); PuzzleManager.Instance?.UnregisterStepBehaviour(this);
// Clean up indicator
if (_spawnedIndicator != null)
{
Destroy(_spawnedIndicator);
_spawnedIndicator = null;
_indicator = null;
}
} }
/// <summary> /// <summary>
@@ -97,11 +89,46 @@ namespace PuzzleS
// IPuzzlePrompt interface implementation - delegates to indicator if available // IPuzzlePrompt interface implementation - delegates to indicator if available
/// <summary>
/// Called when the prompt should be initially shown (e.g., when step is unlocked)
/// </summary>
public virtual void OnShow()
{
// Delegate to indicator if available
if (_indicator != null)
{
_indicator.OnShow();
return;
}
// Default fallback behavior
Debug.Log($"[Puzzles] Prompt shown for {stepData?.stepId} on {gameObject.name}");
}
/// <summary>
/// Called when the prompt should be hidden (e.g., when step is locked)
/// </summary>
public virtual void OnHide()
{
// Delegate to indicator if available
if (_indicator != null)
{
_indicator.OnHide();
return;
}
// Default fallback behavior
Debug.Log($"[Puzzles] Prompt hidden for {stepData?.stepId} on {gameObject.name}");
}
/// <summary> /// <summary>
/// Called when player enters the far range /// Called when player enters the far range
/// </summary> /// </summary>
public virtual void ShowFar() public virtual void ShowFar()
{ {
// Only show if step is unlocked
if (!_isUnlocked) return;
// Delegate to indicator if available // Delegate to indicator if available
if (_indicator != null) if (_indicator != null)
{ {
@@ -118,6 +145,9 @@ namespace PuzzleS
/// </summary> /// </summary>
public virtual void ShowClose() public virtual void ShowClose()
{ {
// Only show if step is unlocked
if (!_isUnlocked) return;
// Delegate to indicator if available // Delegate to indicator if available
if (_indicator != null) if (_indicator != null)
{ {
@@ -134,6 +164,9 @@ namespace PuzzleS
/// </summary> /// </summary>
public virtual void HideClose() public virtual void HideClose()
{ {
// Only respond if step is unlocked
if (!_isUnlocked) return;
// Delegate to indicator if available // Delegate to indicator if available
if (_indicator != null) if (_indicator != null)
{ {
@@ -150,6 +183,9 @@ namespace PuzzleS
/// </summary> /// </summary>
public virtual void HideFar() public virtual void HideFar()
{ {
// Only respond if step is unlocked
if (!_isUnlocked) return;
// Delegate to indicator if available // Delegate to indicator if available
if (_indicator != null) if (_indicator != null)
{ {
@@ -170,16 +206,15 @@ namespace PuzzleS
Debug.Log($"[Puzzles] Step unlocked: {stepData?.stepId} on {gameObject.name}"); Debug.Log($"[Puzzles] Step unlocked: {stepData?.stepId} on {gameObject.name}");
// Show indicator if enabled in settings // Show indicator if enabled in settings
if (stepData?.ShowIndicator == true && indicatorPrefab != null && _spawnedIndicator == null) if (puzzleIndicator != null)
{ {
_spawnedIndicator = Instantiate(indicatorPrefab, transform);
// Try to get the IPuzzlePrompt component from the spawned indicator // Try to get the IPuzzlePrompt component from the spawned indicator
_indicator = _spawnedIndicator.GetComponent<IPuzzlePrompt>(); _indicator = puzzleIndicator.GetComponent<IPuzzlePrompt>();
if (_indicator == null) if (_indicator == null)
{ {
// Try to find it in children if not on the root // Try to find it in children if not on the root
_indicator = _spawnedIndicator.GetComponentInChildren<IPuzzlePrompt>(); _indicator = puzzleIndicator.GetComponentInChildren<IPuzzlePrompt>();
} }
if (_indicator == null) if (_indicator == null)
@@ -188,7 +223,10 @@ namespace PuzzleS
} }
else else
{ {
// Immediately set the correct state based on current player distance // First show the indicator
_indicator.OnShow();
// Then set the correct state based on current player distance
Transform playerTransform = GameObject.FindGameObjectWithTag("Player")?.transform; Transform playerTransform = GameObject.FindGameObjectWithTag("Player")?.transform;
if (playerTransform != null) if (playerTransform != null)
{ {
@@ -227,11 +265,9 @@ namespace PuzzleS
Debug.Log($"[Puzzles] Step locked: {stepData?.stepId} on {gameObject.name}"); Debug.Log($"[Puzzles] Step locked: {stepData?.stepId} on {gameObject.name}");
// Hide indicator // Hide indicator
if (_spawnedIndicator != null) if (_indicator != null)
{ {
Destroy(_spawnedIndicator); _indicator.OnHide();
_spawnedIndicator = null;
_indicator = null;
} }
} }

View File

@@ -14,6 +14,16 @@ public class TestIndicator : MonoBehaviour, PuzzleS.IPuzzlePrompt
} }
public void OnShow()
{
gameObject.SetActive(true);
}
public void OnHide()
{
gameObject.SetActive(false);
}
public void ShowFar() public void ShowFar()
{ {
gameObject.SetActive(true); gameObject.SetActive(true);