176 lines
5.2 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
} |