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 uniqueDirectors = new HashSet(); 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(); // 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(); // Find all PlayableDirectors in the scene PlayableDirector[] directorsInScene = FindObjectsOfType(); // 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(true).gameObject; //GameObject polaroidProp = PlayersManager.GetInstance().MaxReplaceCharacterModel.characterSpawnPoint.GetComponentInChildren(true).gameObject; //GameObject cameraFlash = cameraProp.transform.Find("CameraFlash").gameObject; //AudioSource cameraAudioSource = PlayersManager.GetInstance().MaxReplaceCharacterModel.characterSpawnPoint.GetComponentInChildren(true).gameObject.GetComponent(); Animator playerAnimator = PlayerManager.GetInstance().FPSControllerAnimator; CinemachineBrain mainCameraCinemachineBrain = PlayerManager.GetInstance().PlayerMainCamera.GetComponent(); 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().SetBool("IsFadingIn", true); } public void ScreenTitlesFadeOut() { UIManager.GetInstance().TitlesUI.GetComponent().SetBool("IsFadingIn", false); } }