revival/game/Assets/Scripts/Dialogue/ScriptedDialogueTrigger.cs

112 lines
2.6 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
public class ScriptedDialogueTrigger : MonoBehaviour
{
[Serializable]
private enum Speaker
{
Radio,
Baz
}
[SerializeField] private DialogueSystem _dialogue;
[SerializeField] private Speaker _speaker = Speaker.Radio;
[SerializeField] private Transform _speakerTransform;
[Obsolete]
[SerializeField] private string _key;
[SerializeField] private string[] _keys;
private float[] _durations;
[SerializeField]
private UnityEvent _onDialogueFinish;
[SerializeField] private bool _log;
private void Awake()
{
if (_keys.Length == 0) return;
_durations = new float[_keys.Length];
for (int i = 0; i < _keys.Length; i++)
{
_durations[i] = _dialogue.GetLineDuration(_keys[i]);
if (_speaker == Speaker.Radio)
{
// fudge because radio has a bit of a delay before starting the clip
_durations[i] += 0.3f;
}
}
}
private void OnTriggerEnter(Collider other)
{
if ( !other.CompareTag( "Player" ) )
return;
if (_log)
{
Debug.Log($"{other} triggered dialogue {_key}");
}
if (_keys.Length == 0)
{
PlayLine(_key, _speakerTransform);
}
else
{
StartCoroutine(PlayKeys());
}
}
private IEnumerator PlayKeys()
{
var idx = 0;
var elapsed = 0f;
// play first line
PlayLine(_keys[0], _speakerTransform);
while (idx < _keys.Length)
{
elapsed += Time.deltaTime;
if (elapsed > _durations[idx])
{
elapsed = 0;
idx++;
if (idx >= _keys.Length) break;
PlayLine(_keys[idx], _speakerTransform);
}
yield return null;
}
_onDialogueFinish.Invoke();
}
private void PlayLine(string key, Transform speakerObject)
{
switch (_speaker)
{
case Speaker.Radio:
_dialogue.PlayLineRadio(key);
break;
case Speaker.Baz:
_dialogue.PlayLineBaz(key, speakerObject);
break;
}
}
}