Files
beyond/Assets/Scripts/Utils/BarkManager.cs
2024-11-20 15:21:28 +01:00

176 lines
5.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using HutongGames.PlayMaker.Actions;
using PixelCrushers;
using PixelCrushers.DialogueSystem;
using Sirenix.OdinInspector;
using UnityEngine;
using Random = UnityEngine.Random;
namespace Beyond
{
public class BarkManager : Saver
{
[Serializable]
public class Bark
{
public string barkText;
public AudioClip clip;
}
[Serializable]
public class BarkEntry
{
public bool playOnce = true;
public float delayToStart = 0f;
public Bark[] barks;
}
[ListDrawerSettings(DraggableItems = true, Expanded = false, ShowIndexLabels = true, ShowPaging = false, ShowItemCount = true, HideRemoveButton = true)]
public BarkEntry[] m_barks;
[Serializable]
public class SaveData
{
public bool[] wasPlayed;
}
public SaveData m_saveData = new SaveData();
public Queue<int> m_barkQueue = new Queue<int>();
public AudioSource m_audioSource;
public void PlayBark(int num)
{
m_barkQueue.Enqueue(num);
/*
if (num >= 0 && num < m_barks.Length)
{
if (Player.Instance == null)
return;
var bark = m_barks[num];
if (bark.playOnce && m_saveData.wasPlayed[num])
{
return;
}
if (bark.barks != null && m_barks.Length > 0)
{
var b = bark.barks[Random.Range(0, bark.barks.Length)];
if (b.clip != null)
{
Player.Instance.AudioSource.clip = b.clip;
Player.Instance.AudioSource.Play();
}
if (!string.IsNullOrEmpty(b.barkText))
{
DialogueManager.BarkString(b.barkText, Player.Instance.transform);
}
}
m_saveData.wasPlayed[num] = true;
}
*/
}
//private AudioSource audioSourceLast;
//private GameObject audioSource => Player.Instance.audioSource;
private void PlayInternal(int num)
{
if (num >= 0 && num < m_barks.Length)
{
if (Player.Instance == null)
return;
var bark = m_barks[num];
if (bark.playOnce && m_saveData.wasPlayed[num])
{
return;
}
if (bark.barks != null && m_barks.Length > 0)
{
if (bark.delayToStart > 0)
{
StartCoroutine(PlayBarkWithDelayCoroutine(bark));
}
else
{
PlayBarkImmediately(bark);
}
}
m_saveData.wasPlayed[num] = true;
}
}
private IEnumerator PlayBarkWithDelayCoroutine(BarkEntry bark)
{
yield return new WaitForSecondsRealtime(bark.delayToStart);
PlayBarkImmediately(bark);
}
private void PlayBarkImmediately(BarkEntry bark)
{
var b = bark.barks[Random.Range(0, bark.barks.Length)];
if (b.clip != null)
{
//GameObject audioObject = Instantiate(audioSource, Player.Instance.transform.position, transform.rotation) as GameObject;
//audioSourceLast = audioObject.GetComponent<AudioSource>();
m_audioSource.PlayOneShot(b.clip);
}
if (!string.IsNullOrEmpty(b.barkText))
{
DialogueManager.BarkString(b.barkText, Player.Instance.transform);
}
}
public bool CanBarkBeStillPlayed(int barkNum)
{
return !(m_saveData.wasPlayed[barkNum] && m_barks[barkNum].playOnce);
}
// Start is called before the first frame update
private void Start()
{
if (m_audioSource == null)
{
m_audioSource = GetComponent<AudioSource>();
}
if (m_audioSource == null)
{
m_audioSource = gameObject.AddComponent<AudioSource>();
}
m_saveData.wasPlayed = new bool[m_barks.Length];
for (int i = 0; i < m_saveData.wasPlayed.Length; i++)
m_saveData.wasPlayed[i] = false;
}
public override string RecordData()
{
return SaveSystem.Serialize(m_saveData);
}
public override void ApplyData(string s)
{
var sd = SaveSystem.Deserialize<SaveData>(s);
if (sd != null)
{
m_saveData = sd;
}
}
private void Update()
{
if (m_audioSource && m_audioSource.isPlaying)
return;
if (m_barkQueue.Count > 0)
{
int barkId = m_barkQueue.Dequeue();
PlayInternal(barkId);
}
}
}
}