106 lines
2.8 KiB
C#
106 lines
2.8 KiB
C#
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Example script showing how to interact with the Quest system
|
||
|
|
/// Attach to objects that trigger quest progression (enemies, items, zones, etc.)
|
||
|
|
/// </summary>
|
||
|
|
public class QuestTrigger : MonoBehaviour
|
||
|
|
{
|
||
|
|
[Header("Quest Trigger Settings")]
|
||
|
|
[Tooltip("The quest ID this trigger affects")]
|
||
|
|
public string questId;
|
||
|
|
|
||
|
|
[Tooltip("How much progress to add when triggered")]
|
||
|
|
public int progressAmount = 1;
|
||
|
|
|
||
|
|
[Tooltip("Trigger type")]
|
||
|
|
public TriggerType triggerType = TriggerType.OnTriggerEnter;
|
||
|
|
|
||
|
|
[Tooltip("Tag required to trigger (e.g., 'Player')")]
|
||
|
|
public string requiredTag = "Player";
|
||
|
|
|
||
|
|
[Tooltip("Destroy this GameObject after triggering")]
|
||
|
|
public bool destroyAfterTrigger = false;
|
||
|
|
|
||
|
|
[Tooltip("Only trigger once")]
|
||
|
|
public bool triggerOnce = true;
|
||
|
|
|
||
|
|
private bool hasTriggered = false;
|
||
|
|
|
||
|
|
public enum TriggerType
|
||
|
|
{
|
||
|
|
OnTriggerEnter,
|
||
|
|
OnCollisionEnter,
|
||
|
|
Manual
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnTriggerEnter(Collider other)
|
||
|
|
{
|
||
|
|
if (triggerType == TriggerType.OnTriggerEnter)
|
||
|
|
{
|
||
|
|
TryTrigger(other.gameObject);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void OnCollisionEnter(Collision collision)
|
||
|
|
{
|
||
|
|
if (triggerType == TriggerType.OnCollisionEnter)
|
||
|
|
{
|
||
|
|
TryTrigger(collision.gameObject);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Manually trigger quest progress (call from other scripts)
|
||
|
|
/// </summary>
|
||
|
|
public void ManualTrigger(GameObject triggerer = null)
|
||
|
|
{
|
||
|
|
if (triggerType == TriggerType.Manual || triggerType == TriggerType.OnTriggerEnter)
|
||
|
|
{
|
||
|
|
TryTrigger(triggerer);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void TryTrigger(GameObject triggerer)
|
||
|
|
{
|
||
|
|
// Check if already triggered
|
||
|
|
if (hasTriggered && triggerOnce)
|
||
|
|
return;
|
||
|
|
|
||
|
|
// Check tag requirement
|
||
|
|
if (triggerer != null && !string.IsNullOrEmpty(requiredTag))
|
||
|
|
{
|
||
|
|
if (!triggerer.CompareTag(requiredTag))
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check if QuestManager exists
|
||
|
|
if (QuestManager.Instance == null)
|
||
|
|
{
|
||
|
|
Debug.LogWarning("QuestManager not found in scene.", gameObject);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check if quest is active
|
||
|
|
if (!QuestManager.Instance.IsQuestActive(questId))
|
||
|
|
{
|
||
|
|
Debug.Log($"Quest '{questId}' is not active. Cannot progress.", gameObject);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Progress the quest
|
||
|
|
bool progressed = QuestManager.Instance.ProgressQuest(questId, progressAmount);
|
||
|
|
if (progressed)
|
||
|
|
{
|
||
|
|
hasTriggered = true;
|
||
|
|
Debug.Log($"Quest '{questId}' progressed by {progressAmount}", gameObject);
|
||
|
|
|
||
|
|
// Destroy if configured
|
||
|
|
if (destroyAfterTrigger)
|
||
|
|
{
|
||
|
|
Destroy(gameObject);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|