193 lines
6.1 KiB
C#
193 lines
6.1 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using HutongGames.PlayMaker.Actions;
|
|
using OccaSoftware.Altos;
|
|
using PixelCrushers;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using UnityEngine.Video;
|
|
|
|
namespace Beyond
|
|
{
|
|
[RequireComponent(typeof(BoxCollider))]
|
|
public class VideoCutsceneTrigger : Saver
|
|
{
|
|
[SerializeField] private VideoCutsceneController m_videoCutsceneController;
|
|
[SerializeField] private VideoClip m_cutsceneVideoClip;
|
|
[SerializeField] private bool m_DisableTriggerOnFinish;
|
|
[SerializeField] private UnityEvent m_onCutSceneEnd;
|
|
|
|
[SerializeField] private CutsceneLevelLoader m_cutsceneLevelLoader = new CutsceneLevelLoader();
|
|
[SerializeField] private bool m_playOnStart = false;
|
|
|
|
public TeleportObject m_teleportAfterCutScene;
|
|
public bool m_skipFadeIn;
|
|
public bool m_skipFadeOut = false;
|
|
private bool m_wasPlayed;
|
|
|
|
public bool m_dontEnableUI = false;
|
|
private bool m_appliedData = false;
|
|
|
|
public bool WasPlayed
|
|
{
|
|
set => m_wasPlayed = value;
|
|
get => m_wasPlayed;
|
|
}
|
|
|
|
private Collider m_collider;
|
|
|
|
public override void OnEnable()
|
|
{
|
|
base.OnEnable();
|
|
m_collider = GetComponent<Collider>();
|
|
if (m_videoCutsceneController == null)
|
|
m_videoCutsceneController = VideoCutsceneController.Instance;
|
|
m_videoCutsceneController.OnVideoEnd.AddListener(Teleport);
|
|
m_videoCutsceneController.OnVideoEnd.AddListener(OnCutSceneEnd);
|
|
m_videoCutsceneController.OnVideoEnd.AddListener(DisableTrigger);
|
|
if (m_cutsceneLevelLoader.Enabled)
|
|
{
|
|
m_videoCutsceneController.OnVideoEnd.AddListener(m_cutsceneLevelLoader.LoadLevel);
|
|
}
|
|
}
|
|
|
|
public override void Start()
|
|
{
|
|
base.Start();
|
|
//if (m_playOnStart && !m_wasPlayed)
|
|
//{
|
|
// Debug.LogError("s playing " + m_wasPlayed);
|
|
|
|
// if (MusicManager.instance)
|
|
// {
|
|
// MusicManager.instance.MuteMusic();
|
|
// }
|
|
|
|
// m_collider.enabled = false;
|
|
// m_videoCutsceneController.m_dontEnableUI = m_dontEnableUI;
|
|
// m_videoCutsceneController.PlayVideo(m_cutsceneVideoClip);
|
|
// m_wasPlayed = true;
|
|
//}
|
|
StartCoroutine(TryToStartVideoCoroutine());
|
|
}
|
|
|
|
private IEnumerator TryToStartVideoCoroutine()
|
|
{
|
|
yield return new WaitUntil(() => m_appliedData || Time.timeSinceLevelLoad > 1f);
|
|
//yield return new WaitForSecondsRealtime(1f);
|
|
// yield return new WaitForEndOfFrame();
|
|
// yield return new WaitForEndOfFrame();
|
|
if (m_playOnStart && !m_wasPlayed)
|
|
{
|
|
if (MusicManager.instance)
|
|
{
|
|
MusicManager.instance.MuteMusic();
|
|
}
|
|
|
|
m_collider.enabled = false;
|
|
m_videoCutsceneController.m_dontEnableUI = m_dontEnableUI;
|
|
m_videoCutsceneController.PlayVideo(m_cutsceneVideoClip);
|
|
m_wasPlayed = true;
|
|
}
|
|
else if (m_wasPlayed)
|
|
{
|
|
m_collider.enabled = false;
|
|
}
|
|
}
|
|
|
|
public override void OnDisable()
|
|
{
|
|
base.OnDisable();
|
|
m_videoCutsceneController.OnVideoEnd.RemoveListener(Teleport);
|
|
m_videoCutsceneController.OnVideoEnd.RemoveListener(DisableTrigger);
|
|
if (m_cutsceneLevelLoader.Enabled)
|
|
{
|
|
m_videoCutsceneController.OnVideoEnd.RemoveListener(m_cutsceneLevelLoader.LoadLevel);
|
|
}
|
|
}
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
{
|
|
m_videoCutsceneController.m_skipFadeIn = m_skipFadeIn;
|
|
m_videoCutsceneController.m_skipFadeOut = m_skipFadeOut;
|
|
if (other.tag == "Player" && !m_wasPlayed)
|
|
{
|
|
if (MusicManager.instance)
|
|
{
|
|
MusicManager.instance.MuteMusic();
|
|
}
|
|
|
|
m_collider.enabled = false;
|
|
m_videoCutsceneController.PlayVideo(m_cutsceneVideoClip);
|
|
m_wasPlayed = true;
|
|
}
|
|
}
|
|
|
|
private void DisableTrigger()
|
|
{
|
|
if (m_DisableTriggerOnFinish)
|
|
{
|
|
gameObject.SetActive((false));
|
|
}
|
|
}
|
|
|
|
private void Teleport()
|
|
{
|
|
m_teleportAfterCutScene.Teleport();
|
|
}
|
|
|
|
private void OnCutSceneEnd()
|
|
{
|
|
if (MusicManager.instance != null)
|
|
MusicManager.instance.UnmuteMusic();
|
|
m_videoCutsceneController.OnVideoEnd.RemoveListener(OnCutSceneEnd);
|
|
m_onCutSceneEnd?.Invoke();
|
|
}
|
|
|
|
public override string RecordData()
|
|
{
|
|
CutsceneSaveData data = new();
|
|
data.wasPlayed = WasPlayed;
|
|
return SaveSystem.Serialize(data);
|
|
}
|
|
|
|
public override void ApplyData(string s)
|
|
{
|
|
m_appliedData = true;
|
|
var sd = SaveSystem.Deserialize<CutsceneSaveData>(s);
|
|
if (sd != null)
|
|
{
|
|
WasPlayed = sd.wasPlayed;
|
|
}
|
|
}
|
|
}
|
|
|
|
[Serializable, Toggle("Enabled")]
|
|
public class CutsceneLevelLoader
|
|
{
|
|
public bool Enabled;
|
|
public string LevelName;
|
|
public string SpawnPointName;
|
|
|
|
public void LoadLevel()
|
|
{
|
|
if (String.IsNullOrEmpty(LevelName))
|
|
{
|
|
Debug.LogError("There is no scene name to load");
|
|
return;
|
|
}
|
|
|
|
if (String.IsNullOrEmpty(SpawnPointName))
|
|
{
|
|
//SaveSystem.LoadScene(LevelName);
|
|
ProxySceneLoader.LoadScene(LevelName);
|
|
return;
|
|
}
|
|
|
|
//SaveSystem.LoadScene($"{LevelName}@{SpawnPointName}");
|
|
ProxySceneLoader.LoadScene($"{LevelName}@{SpawnPointName}");
|
|
}
|
|
}
|
|
} |