Files
HauntedBloodlines/Assets/Scripts/Managers/CutscenesManager.cs
2025-05-29 22:31:40 +03:00

196 lines
7.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
using Cinemachine;
public class CutscenesManager : MonoBehaviour
{
[Header("Player")]
[HideInInspector] public Transform _playerTeleportPosition;
[HideInInspector] public Transform _playerParent;
[Header("Cutscenes")]
public PlayableDirector MedeaKillingBabyCutscene;
[HideInInspector] public PlayableDirector gameLoadedFadeOutPlayableDirector;
public string gameLoadedFadeOutPlayableDirectorName = "GameLoadedFadeOutPlayableDirector";
[SerializeField] PlayableDirector[] playableDirectorsOfScene;
private HashSet<PlayableDirector> uniqueDirectors = new HashSet<PlayableDirector>();
private static CutscenesManager _instance;
public static CutscenesManager GetInstance() { return _instance; }
private void Awake()
{
if (!_instance)
{
_instance = this;
}
}
public void AssignPlayerToPlayableDirectorsOfSceneAfterSeconds()
{
StartCoroutine(AssignToPlayableDirectorsOfSceneAfterSeconds());
}
IEnumerator AssignToPlayableDirectorsOfSceneAfterSeconds()
{
yield return new WaitForSeconds(0.5f);
GetAllPlayableDirectorsOfScene();
AssignPlayerToTimelines();
}
public void FindGameLoadedFadeOutPlayableDirector()
{
// Find the PlayableDirectors in the scene
PlayableDirector[] directors = FindObjectsOfType<PlayableDirector>();
// Iterate through each director
foreach (PlayableDirector director in directors)
{
// Check if the current director has the desired name
if (director.name == gameLoadedFadeOutPlayableDirectorName)
{
// Found the PlayableDirector, you can do something with it
Debug.Log("Found PlayableDirector: " + gameLoadedFadeOutPlayableDirectorName);
gameLoadedFadeOutPlayableDirector = director;
// Do something with the director if needed
// director.Play(); // for example
return; // Exit the loop since you found the director
}
}
// If the loop completes and the director is not found
Debug.LogWarning("PlayableDirector not found: " + gameLoadedFadeOutPlayableDirectorName);
}
private void Start()
{
//GetAllPlayableDirectorsOfScene();
//AssignPlayerToTimelines();
//AssignMedeaToTimelines();
StartCoroutine(AssignToPlayableDirectorsOfSceneAfterSeconds());
}
public void GetAllPlayableDirectorsOfScene()
{
//playableDirectorsOfScene = FindObjectsOfType<PlayableDirector>();
// Find all PlayableDirectors in the scene
PlayableDirector[] directorsInScene = FindObjectsOfType<PlayableDirector>();
// Iterate through each director and add to the HashSet if not already present
foreach (PlayableDirector director in directorsInScene)
{
if (!uniqueDirectors.Contains(director))
{
uniqueDirectors.Add(director);
}
}
// Convert the HashSet to an array
playableDirectorsOfScene = new PlayableDirector[uniqueDirectors.Count];
uniqueDirectors.CopyTo(playableDirectorsOfScene);
}
public void AssignPlayerToTimelines()
{
// Remove null references from the array
playableDirectorsOfScene = System.Array.FindAll(playableDirectorsOfScene, director => director != null);
//GameObject cameraProp = PlayersManager.GetInstance().MaxReplaceCharacterModel.characterSpawnPoint.GetComponentInChildren<CameraProp>(true).gameObject;
//GameObject polaroidProp = PlayersManager.GetInstance().MaxReplaceCharacterModel.characterSpawnPoint.GetComponentInChildren<PolaroidProp>(true).gameObject;
//GameObject cameraFlash = cameraProp.transform.Find("CameraFlash").gameObject;
//AudioSource cameraAudioSource = PlayersManager.GetInstance().MaxReplaceCharacterModel.characterSpawnPoint.GetComponentInChildren<CameraProp>(true).gameObject.GetComponent<AudioSource>();
Animator playerAnimator = PlayerManager.GetInstance().FPSControllerAnimator;
CinemachineBrain mainCameraCinemachineBrain = PlayerManager.GetInstance().PlayerMainCamera.GetComponent<CinemachineBrain>();
for (int i = 0; i < playableDirectorsOfScene.Length; i++)
{
var timelineAsset = playableDirectorsOfScene[i].playableAsset as TimelineAsset;
var trackList = timelineAsset.GetOutputTracks();
foreach (var track in trackList)
{
#region Props
if (track.name == "Player Animator Track")
{
playableDirectorsOfScene[i].SetGenericBinding(track, playerAnimator);
}
if(track.name == "Main Camera Cinemachine Track")
{
playableDirectorsOfScene[i].SetGenericBinding(track, mainCameraCinemachineBrain);
}
//if (track.name == "Polaroid Activation Track")
//{
// playableDiretorsOfScene[i].SetGenericBinding(track, polaroidProp);
//}
//if (track.name == "Camera Flash Activation Track")
//{
// playableDiretorsOfScene[i].SetGenericBinding(track, cameraFlash);
//}
//if (track.name == "Camera Audio Track")
//{
// playableDiretorsOfScene[i].SetGenericBinding(track, cameraAudioSource);
//}
#endregion
playableDirectorsOfScene[i].RebuildGraph();
}
}
}
public void AssignMedeaToTimelines()
{
// Remove null references from the array
playableDirectorsOfScene = System.Array.FindAll(playableDirectorsOfScene, director => director != null);
Animator medeaAnimator = MedeaDemonicEnemyBehaviour.GetInstance().medeaAnimator;
for (int i = 0; i < playableDirectorsOfScene.Length; i++)
{
var timelineAsset = playableDirectorsOfScene[i].playableAsset as TimelineAsset;
var trackList = timelineAsset.GetOutputTracks();
foreach (var track in trackList)
{
#region Props
if (track.name == "Medea Animator Track")
{
playableDirectorsOfScene[i].SetGenericBinding(track, medeaAnimator);
}
#endregion
playableDirectorsOfScene[i].RebuildGraph();
}
}
}
public void TeleportPlayer()
{
PlayerManager.GetInstance().playerGameObj.transform.localPosition = _playerTeleportPosition.localPosition;
PlayerManager.GetInstance().playerGameObj.transform.localRotation = _playerTeleportPosition.localRotation;
}
public void UpdatePlayerParent()
{
PlayerManager.GetInstance().playerGameObj.transform.parent = _playerParent;
}
public void PlayCutscene(PlayableDirector Cutscene)
{
Cutscene.enabled = true;
Cutscene.Play();
}
public void ScreenTitlesFadeIn()
{
UIManager.GetInstance().TitlesUI.GetComponent<Animator>().SetBool("IsFadingIn", true);
}
public void ScreenTitlesFadeOut()
{
UIManager.GetInstance().TitlesUI.GetComponent<Animator>().SetBool("IsFadingIn", false);
}
}