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

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}");
}
}
}