Adventure Creator Wikia

The follow Action (Third Party: Slate), allows for the control of Slate cutscenes.

using System;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace AC
{

    [Serializable]
	public class ActionSLATE : Action
	{

		[SerializeField] private Slate.Cutscene slateCutscene;
		[SerializeField] private int constantID = 0;
		[SerializeField] private int parameterID = -1;
		private Slate.Cutscene runtimeSlateCutscene;

		[SerializeField] private float startTime;
		[SerializeField] private float endTime;
		[SerializeField] private Slate.Cutscene.WrapMode wrapMode = Slate.Cutscene.WrapMode.Once;
		[SerializeField] private Slate.Cutscene.PlayingDirection playDirection = Slate.Cutscene.PlayingDirection.Forwards;
		[SerializeField] private Slate.Cutscene.StopMode stopMode;
		[SerializeField] private string sectionName;
		[SerializeField] private bool alsoSkip;
		[SerializeField] private GameObject newActor;
		[SerializeField] private int newActorConstantID = 0;
		[SerializeField] private int newActorParameterID = -1;
		private GameObject runtimeNewActor;
		private bool isComplete;

		[SerializeField] private SlateMethod method = SlateMethod.Play;
		private enum SlateMethod { Play, PlayDetailed, PlaySection, PlayFromSection, Sample, Stop, Pause, Resume, Rewind, SkipAll, SkipCurrentSection, BreakSectionLoop, JumpToSection, SetGroupActorOfName };

		public override ActionCategory Category { get { return ActionCategory.ThirdParty; } }
		public override string Title { get { return "Slate"; } }
		public override string Description { get { return "Runs a Slate Cutscene"; } }


		public override void AssignValues (List<ActionParameter> parameters)
		{
			runtimeSlateCutscene = AssignFile (parameters, parameterID, constantID, slateCutscene);
			runtimeNewActor = AssignFile (parameters, newActorParameterID, newActorConstantID, newActor);
		}


		public override float Run ()
		{
			if (runtimeSlateCutscene == null)
			{
				return 0f;
			}

			if (!isRunning)
			{
				isComplete = false;

				switch (method)
				{
					case SlateMethod.Play:
						if (willWait)
						{
							if (UsesSlateCamera ())
							{
								KickStarter.mainCamera.Disable ();
							}
							runtimeSlateCutscene.Play (startTime, OnComplete);
							isRunning = true;
							return defaultPauseTime;
						}
						runtimeSlateCutscene.Play (startTime);
						return 0f;

					case SlateMethod.PlayDetailed:
						if (willWait)
						{
							if (UsesSlateCamera ())
							{
								KickStarter.mainCamera.Disable ();
							}
							runtimeSlateCutscene.Play (startTime, endTime, wrapMode, OnComplete, playDirection);
							isRunning = true;
							return defaultPauseTime;
						}
						runtimeSlateCutscene.Play (startTime, endTime, wrapMode, null, playDirection);
						return 0f;

					case SlateMethod.PlaySection:
						if (willWait)
						{
							if (UsesSlateCamera ())
							{
								KickStarter.mainCamera.Disable ();
							}
							runtimeSlateCutscene.PlaySection (sectionName, wrapMode, OnComplete);
							isRunning = true;
							return defaultPauseTime;
						}
						runtimeSlateCutscene.PlaySection (sectionName, wrapMode, null);
						return 0f;

					case SlateMethod.PlayFromSection:
						if (willWait)
						{
							if (UsesSlateCamera ())
							{
								KickStarter.mainCamera.Disable ();
							}
							runtimeSlateCutscene.PlayFromSection (sectionName, wrapMode, OnComplete);
							isRunning = true;
							return defaultPauseTime;
						}
						runtimeSlateCutscene.PlayFromSection (sectionName, wrapMode, null);
						return 0f;

					case SlateMethod.Sample:
						if (startTime >= 0f)
						{
							runtimeSlateCutscene.Sample (startTime);
						}
						else
						{
							runtimeSlateCutscene.Sample ();
						}
						return 0f;

					case SlateMethod.Stop:
						runtimeSlateCutscene.Stop (stopMode);
						return 0f;

					case SlateMethod.Pause:
						runtimeSlateCutscene.Pause ();
						return 0f;

					case SlateMethod.Resume:
						runtimeSlateCutscene.Resume ();
						return 0f;

					case SlateMethod.Rewind:
						runtimeSlateCutscene.Rewind ();
						return 0f;

					case SlateMethod.SkipAll:
						runtimeSlateCutscene.SkipAll ();
						return 0f;

					case SlateMethod.SkipCurrentSection:
						runtimeSlateCutscene.SkipCurrentSection ();
						return 0f;

					case SlateMethod.BreakSectionLoop:
						runtimeSlateCutscene.BreakSectionLoop ();
						return 0f;

					case SlateMethod.JumpToSection:
						runtimeSlateCutscene.JumpToSection (sectionName);
						return 0f;

					case SlateMethod.SetGroupActorOfName:
						runtimeSlateCutscene.SetGroupActorOfName (sectionName, runtimeNewActor);
						return 0f;

					default:
						return 0f;
				}
			}

			switch (method)
			{
				case SlateMethod.Play:
				case SlateMethod.PlayDetailed:
				case SlateMethod.PlaySection:
				case SlateMethod.PlayFromSection:
					if (isComplete)
					{
						if (UsesSlateCamera ())
						{
							KickStarter.mainCamera.Enable ();
						}
						isRunning = false;
						return 0f;
					}
					return defaultPauseTime;

				default:
					isRunning = false;
					return 0f;
			}
		}


		private void OnComplete ()
		{
			isComplete = true;
		}


		public override void Skip ()
		{
			if (runtimeSlateCutscene == null)
			{
				return;
			}

			switch (method)
			{
				case SlateMethod.Play:
				case SlateMethod.PlayDetailed:
				case SlateMethod.PlayFromSection:
					runtimeSlateCutscene.SkipAll ();
					if (willWait && UsesSlateCamera ())
					{
						KickStarter.mainCamera.Enable ();
					}
					break;

				case SlateMethod.PlaySection:
					runtimeSlateCutscene.PlaySection (sectionName);
					runtimeSlateCutscene.SkipCurrentSection ();
					if (willWait && UsesSlateCamera ())
					{
						KickStarter.mainCamera.Enable ();
					}
					break;

				default:
					Run ();
					break;
			}
		}


		private bool UsesSlateCamera ()
		{
			return runtimeSlateCutscene && runtimeSlateCutscene.cameraTrack && runtimeSlateCutscene.cameraTrack.isActive;
		}


		#if UNITY_EDITOR
		override public void ShowGUI (List<ActionParameter> parameters)
		{
			parameterID = ChooseParameterGUI ("Slate Cutscene:", parameters, parameterID, ParameterType.GameObject);
			if (parameterID >= 0)
			{
				constantID = 0;
				slateCutscene = null;
			}
			else
			{
				slateCutscene = (Slate.Cutscene) EditorGUILayout.ObjectField ("Slate Cutscene:", slateCutscene, typeof (Slate.Cutscene), true);
				constantID = FieldToID (slateCutscene, constantID);
				slateCutscene = IDToField (slateCutscene, constantID, false);
			}

			method = (SlateMethod) EditorGUILayout.EnumPopup ("Method:", method);

			switch (method)
			{
				case SlateMethod.Play:
					startTime = EditorGUILayout.FloatField ("Start time:", startTime);
					break;

				case SlateMethod.PlayDetailed:
					startTime = EditorGUILayout.FloatField ("Start time:", startTime);
				    endTime = EditorGUILayout.FloatField ("End time:", endTime);
					wrapMode = (Slate.Cutscene.WrapMode) EditorGUILayout.EnumPopup ("Wrap mode:", wrapMode);
					playDirection = (Slate.Cutscene.PlayingDirection) EditorGUILayout.EnumPopup ("Play direction:", playDirection);
					break;

				case SlateMethod.PlaySection:
				case SlateMethod.PlayFromSection:
					sectionName = EditorGUILayout.TextField ("Section name:", sectionName);
					wrapMode = (Slate.Cutscene.WrapMode) EditorGUILayout.EnumPopup ("Wrap mode:", wrapMode);
					break;

				case SlateMethod.Sample:
					startTime = EditorGUILayout.FloatField ("Time:", startTime);
					EditorGUILayout.HelpBox ("Set to negative to sample the current time", MessageType.Info);
					break;

				case SlateMethod.Stop:
					stopMode = (Slate.Cutscene.StopMode) EditorGUILayout.EnumPopup ("Stop mode:", stopMode);
					break;

				case SlateMethod.BreakSectionLoop:
					alsoSkip = EditorGUILayout.Toggle ("Also skip?", alsoSkip);
					break;

				case SlateMethod.JumpToSection:
					sectionName = EditorGUILayout.TextField ("Section name:", sectionName);
					break;

				case SlateMethod.SetGroupActorOfName:
					sectionName = EditorGUILayout.TextField ("Group name:", sectionName);
					newActorParameterID = ChooseParameterGUI ("Slate Cutscene:", parameters, newActorParameterID, ParameterType.GameObject);
					if (newActorParameterID >= 0)
					{
						newActor = null;
						newActorConstantID = 0;
					}
					else
					{
						newActor = (GameObject) EditorGUILayout.ObjectField ("New actor:", newActor, typeof (GameObject), true);
						newActorConstantID = FieldToID (newActor, newActorConstantID);
						newActor = IDToField (newActor, newActorConstantID, false);
					}
					break;

				default:
					break;
			}

			switch (method)
			{
				case SlateMethod.Play:
				case SlateMethod.PlayDetailed:
				case SlateMethod.PlaySection:
				case SlateMethod.PlayFromSection:
					willWait = EditorGUILayout.Toggle ("Wait until finish?", willWait);
					break;

				default:
					break;
			}
		}


		public override void AssignConstantIDs (bool saveScriptsToo, bool fromAssetFile)
		{
			AssignConstantID (slateCutscene, constantID, parameterID);
		}

		#endif

	}
}