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_EditorClassIdentifier: 
 | 
			
		||||
  _hideAfter: 5
 | 
			
		||||
  _fmodKeyPrefix: event:/Character/
 | 
			
		||||
 | 
			
		||||
@ -323,9 +323,9 @@ GameObject:
 | 
			
		||||
  m_Component:
 | 
			
		||||
  - component: {fileID: 13726837293638830}
 | 
			
		||||
  - component: {fileID: 13726837293638818}
 | 
			
		||||
  - component: {fileID: 13726837293638819}
 | 
			
		||||
  - component: {fileID: 13726837293638816}
 | 
			
		||||
  - component: {fileID: 13726837293638817}
 | 
			
		||||
  - component: {fileID: 9057303937983535475}
 | 
			
		||||
  m_Layer: 0
 | 
			
		||||
  m_Name: Camera
 | 
			
		||||
  m_TagString: Untagged
 | 
			
		||||
@ -390,14 +390,6 @@ Camera:
 | 
			
		||||
  m_OcclusionCulling: 1
 | 
			
		||||
  m_StereoConvergence: 10
 | 
			
		||||
  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
 | 
			
		||||
MonoBehaviour:
 | 
			
		||||
  m_ObjectHideFlags: 0
 | 
			
		||||
@ -444,6 +436,20 @@ MonoBehaviour:
 | 
			
		||||
  m_EditorClassIdentifier: 
 | 
			
		||||
  _settings: {fileID: 11400000, guid: 995f378ab762cd344b7a6d108f049191, type: 2}
 | 
			
		||||
  _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
 | 
			
		||||
GameObject:
 | 
			
		||||
  m_ObjectHideFlags: 0
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Security.Cryptography.X509Certificates;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
@ -139,6 +140,8 @@ public static partial class DialogueDatabase
 | 
			
		||||
 | 
			
		||||
    private static readonly Dictionary<string, string> _dict = new Dictionary<string, string>();
 | 
			
		||||
 | 
			
		||||
    public static string[] Keys => _dict.Keys.ToArray();
 | 
			
		||||
 | 
			
		||||
    public static string ReadDialogue(string key)
 | 
			
		||||
    {
 | 
			
		||||
        return _dict.ContainsKey(key)
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,8 @@ using UnityEngine;
 | 
			
		||||
public class DialogueSettings : ScriptableObject
 | 
			
		||||
{
 | 
			
		||||
    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.Collections.Generic;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
 | 
			
		||||
#if UNITY_EDITOR
 | 
			
		||||
using UnityEditor;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
[CreateAssetMenu(menuName = "KernelPanic/Dialogue/Dialogue System")]
 | 
			
		||||
public partial class DialogueSystem : ScriptableObject
 | 
			
		||||
{
 | 
			
		||||
    [SerializeField] private DialogueSettings _settings;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // https://stackoverflow.com/questions/2282476/actiont-vs-delegate-event 
 | 
			
		||||
    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)
 | 
			
		||||
    {
 | 
			
		||||
        // retrieve cached key
 | 
			
		||||
        var fmodKey = _fmodKeyCache[key];
 | 
			
		||||
        var eventDescription = FMODUnity.RuntimeManager.GetEventDescription(fmodKey);
 | 
			
		||||
 | 
			
		||||
        DialogueLine dl;
 | 
			
		||||
        dl.text = DialogueDatabase.ReadDialogue(key);
 | 
			
		||||
        // TODO: get dialogue line duration from FMOD
 | 
			
		||||
        // default duration to show ui elements for
 | 
			
		||||
        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);
 | 
			
		||||
        
 | 
			
		||||
        // TODO: tell FMOD to play the key
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -33,6 +68,7 @@ public struct DialogueLine
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#region Editor
 | 
			
		||||
 | 
			
		||||
#if UNITY_EDITOR
 | 
			
		||||
 | 
			
		||||
[CustomEditor(typeof(DialogueSystem))]
 | 
			
		||||
@ -60,5 +96,5 @@ public class DialogueSystemEditor : Editor
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
#endregion
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user