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]
 | 
					    public string FMODPrefix => _fmodKeyPrefix;
 | 
				
			||||||
    private float _hideAfter;
 | 
					    [SerializeField] private string _fmodKeyPrefix;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
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")]
 | 
				
			||||||
@ -13,16 +14,50 @@ public partial class DialogueSystem : ScriptableObject
 | 
				
			|||||||
    // 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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        onDialogueLine?.Invoke(this, dl);
 | 
					        // read audio data out of FMOD, check if event exists
 | 
				
			||||||
 | 
					        if (eventDescription.isValid())
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // assign values and play audio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // TODO: tell FMOD to play the key
 | 
					            // 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);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user