play audio via FMOD using key from dialogue database
This commit is contained in:
parent
d0cfd38119
commit
60634152d3
|
@ -13,3 +13,4 @@ MonoBehaviour:
|
||||||
m_Name: Dialogue Settings
|
m_Name: Dialogue Settings
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
_hideAfter: 5
|
_hideAfter: 5
|
||||||
|
_fmodKeyPrefix: event:/Character/
|
||||||
|
|
|
@ -323,9 +323,9 @@ GameObject:
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 13726837293638830}
|
- component: {fileID: 13726837293638830}
|
||||||
- component: {fileID: 13726837293638818}
|
- component: {fileID: 13726837293638818}
|
||||||
- component: {fileID: 13726837293638819}
|
|
||||||
- component: {fileID: 13726837293638816}
|
- component: {fileID: 13726837293638816}
|
||||||
- component: {fileID: 13726837293638817}
|
- component: {fileID: 13726837293638817}
|
||||||
|
- component: {fileID: 9057303937983535475}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Camera
|
m_Name: Camera
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
|
@ -390,14 +390,6 @@ Camera:
|
||||||
m_OcclusionCulling: 1
|
m_OcclusionCulling: 1
|
||||||
m_StereoConvergence: 10
|
m_StereoConvergence: 10
|
||||||
m_StereoSeparation: 0.022
|
m_StereoSeparation: 0.022
|
||||||
--- !u!81 &13726837293638819
|
|
||||||
AudioListener:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 13726837293638831}
|
|
||||||
m_Enabled: 1
|
|
||||||
--- !u!114 &13726837293638816
|
--- !u!114 &13726837293638816
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -444,6 +436,20 @@ MonoBehaviour:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
_settings: {fileID: 11400000, guid: 995f378ab762cd344b7a6d108f049191, type: 2}
|
_settings: {fileID: 11400000, guid: 995f378ab762cd344b7a6d108f049191, type: 2}
|
||||||
_inputHandler: {fileID: 13726836969441782}
|
_inputHandler: {fileID: 13726836969441782}
|
||||||
|
--- !u!114 &9057303937983535475
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 13726837293638831}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 86c6556701af9e04380698b89f691b6e, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
attenuationObject: {fileID: 0}
|
||||||
|
ListenerNumber: -1
|
||||||
--- !u!1 &13726837642651461
|
--- !u!1 &13726837642651461
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
@ -139,6 +140,8 @@ public static partial class DialogueDatabase
|
||||||
|
|
||||||
private static readonly Dictionary<string, string> _dict = new Dictionary<string, string>();
|
private static readonly Dictionary<string, string> _dict = new Dictionary<string, string>();
|
||||||
|
|
||||||
|
public static string[] Keys => _dict.Keys.ToArray();
|
||||||
|
|
||||||
public static string ReadDialogue(string key)
|
public static string ReadDialogue(string key)
|
||||||
{
|
{
|
||||||
return _dict.ContainsKey(key)
|
return _dict.ContainsKey(key)
|
||||||
|
|
|
@ -6,7 +6,8 @@ using UnityEngine;
|
||||||
public class DialogueSettings : ScriptableObject
|
public class DialogueSettings : ScriptableObject
|
||||||
{
|
{
|
||||||
public float HideAfter => _hideAfter;
|
public float HideAfter => _hideAfter;
|
||||||
|
[SerializeField] private float _hideAfter;
|
||||||
[SerializeField]
|
|
||||||
private float _hideAfter;
|
public string FMODPrefix => _fmodKeyPrefix;
|
||||||
}
|
[SerializeField] private string _fmodKeyPrefix;
|
||||||
|
}
|
|
@ -1,28 +1,63 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
[CreateAssetMenu(menuName = "KernelPanic/Dialogue/Dialogue System")]
|
[CreateAssetMenu(menuName = "KernelPanic/Dialogue/Dialogue System")]
|
||||||
public partial class DialogueSystem : ScriptableObject
|
public partial class DialogueSystem : ScriptableObject
|
||||||
{
|
{
|
||||||
[SerializeField] private DialogueSettings _settings;
|
[SerializeField] private DialogueSettings _settings;
|
||||||
|
|
||||||
// https://stackoverflow.com/questions/2282476/actiont-vs-delegate-event
|
// https://stackoverflow.com/questions/2282476/actiont-vs-delegate-event
|
||||||
public event EventHandler<DialogueLine> onDialogueLine;
|
public event EventHandler<DialogueLine> onDialogueLine;
|
||||||
|
|
||||||
|
private readonly Dictionary<string, string> _fmodKeyCache = new Dictionary<string, string>();
|
||||||
|
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
// cache all dialogue keys for FMOD at start to avoid allocations later
|
||||||
|
foreach (var key in DialogueDatabase.Keys)
|
||||||
|
{
|
||||||
|
_fmodKeyCache[key] = $"{_settings.FMODPrefix}{key}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void PlayLine(string key)
|
public void PlayLine(string key)
|
||||||
{
|
{
|
||||||
|
// retrieve cached key
|
||||||
|
var fmodKey = _fmodKeyCache[key];
|
||||||
|
var eventDescription = FMODUnity.RuntimeManager.GetEventDescription(fmodKey);
|
||||||
|
|
||||||
DialogueLine dl;
|
DialogueLine dl;
|
||||||
dl.text = DialogueDatabase.ReadDialogue(key);
|
dl.text = DialogueDatabase.ReadDialogue(key);
|
||||||
// TODO: get dialogue line duration from FMOD
|
// default duration to show ui elements for
|
||||||
dl.duration = _settings.HideAfter;
|
dl.duration = _settings.HideAfter;
|
||||||
|
|
||||||
|
// read audio data out of FMOD, check if event exists
|
||||||
|
if (eventDescription.isValid())
|
||||||
|
{
|
||||||
|
// assign values and play audio
|
||||||
|
|
||||||
|
// get dialogue line duration from FMOD
|
||||||
|
eventDescription.getLength(out int ms);
|
||||||
|
|
||||||
|
// get length gives us a value in milliseconds so it needs to be converted to seconds
|
||||||
|
// before assignment
|
||||||
|
dl.duration = ms / 1000f;
|
||||||
|
|
||||||
|
// event is valid
|
||||||
|
FMODUnity.RuntimeManager.PlayOneShot(fmodKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// no event available boooooooo
|
||||||
|
Debug.LogError($"FMOD event desc for key {fmodKey} is not valid", this);
|
||||||
|
}
|
||||||
|
|
||||||
onDialogueLine?.Invoke(this, dl);
|
onDialogueLine?.Invoke(this, dl);
|
||||||
|
|
||||||
// TODO: tell FMOD to play the key
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +68,7 @@ public struct DialogueLine
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Editor
|
#region Editor
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
|
|
||||||
[CustomEditor(typeof(DialogueSystem))]
|
[CustomEditor(typeof(DialogueSystem))]
|
||||||
|
@ -60,5 +96,5 @@ public class DialogueSystemEditor : Editor
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
#endregion
|
Loading…
Reference in New Issue