Adventure Creator Wikia

The following is a custom Action that will play music tracks at random. It can be amended to play only within a selected range by changing the Random.Range values.

For details on how to implement custom Actions, see the Manual's "Custom Actions" chapter.

ActionShuffleMusic.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace AC
{

	[System.Serializable]
	public class ActionShuffleMusic : Action
	{

		public float fadeTime;
		public int fadeTimeParameterID = -1;

		public bool loop;
		public bool isQueued;

		public bool resumeFromStart = true;
		public bool resumeIfPlayedBefore = false;

		private Music music;
		private int trackID;
		public bool willWaitComplete;

		public int minRange = 0;
		public int maxRange = -1;


		public override ActionCategory Category { get { return ActionCategory.Sound; }}
		public override string Title { get { return "Shuffle music"; }}
		public override string Description { get { return "Plays or queues random music clips."; }}


		public override void AssignValues (List<ActionParameter> parameters)
		{
			fadeTime = AssignFloat (parameters, fadeTimeParameterID, fadeTime);
			music = KickStarter.stateHandler.GetMusicEngine ();

			int runtimeMin = Mathf.Max (minRange, 0);
			int runtimeMax = Mathf.Min (maxRange+1, KickStarter.settingsManager.musicStorages.Count);
			trackID = Random.Range (runtimeMin, runtimeMax);
		}


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

			if (!isRunning)
			{
				isRunning = true;
				float waitTime = Perform (fadeTime);

				if (willWait && waitTime > 0f && !isQueued)
				{
					return (waitTime);
				}
				else if (!loop && willWaitComplete)
				{
					return defaultPauseTime;
				}
			}
			else
			{
				if (!loop && willWaitComplete && music.GetCurrentTrackID () == trackID && music.IsPlaying ())
				{
					return defaultPauseTime;
				}
				isRunning = false;
			}
			return 0f;
		}


		public override void Skip ()
		{
			Perform (0f);
		}


		private float Perform (float _time)
		{
			if (music != null)
			{
				return music.Play (trackID, loop, isQueued, _time, resumeIfPlayedBefore);
			}
			return 0f;
		}


		#if UNITY_EDITOR

		public override void ShowGUI (List<ActionParameter> parameters)
		{
			if (AdvGame.GetReferences ().settingsManager != null)
			{
				SettingsManager settingsManager = AdvGame.GetReferences ().settingsManager;

				if (GUILayout.Button ("Music Storage window"))
				{
					MusicStorageWindow.Init ();
				}

				if (settingsManager.musicStorages.Count == 0)
				{
					EditorGUILayout.HelpBox ("Before a track can be selected, it must be added to the Music Storage window.", MessageType.Info);
					return;
				}

				string fadeLabel = "Transition time (s):";

				loop = EditorGUILayout.Toggle ("Loop?", loop);
				isQueued = EditorGUILayout.Toggle ("Queue?", isQueued);
				resumeIfPlayedBefore = EditorGUILayout.Toggle ("Resume if played before?", resumeIfPlayedBefore);

				minRange = EditorGUILayout.DelayedIntField ("Min track index:", minRange);
				maxRange = EditorGUILayout.DelayedIntField ("Max track index:", maxRange);

				fadeTimeParameterID = Action.ChooseParameterGUI (fadeLabel, parameters, fadeTimeParameterID, ParameterType.Float);
				if (fadeTimeParameterID < 0)
				{
					fadeTime = EditorGUILayout.Slider (fadeLabel, fadeTime, 0f, 10f);
				}

				if (fadeTime > 0f && !isQueued)
				{
					willWait = EditorGUILayout.Toggle ("Wait until transition ends?", willWait);

					if (willWait && !loop)
					{
						willWaitComplete = EditorGUILayout.Toggle ("Wait until track ends?", willWaitComplete);
					}
				}
				else if (!loop)
				{
					willWaitComplete = EditorGUILayout.Toggle ("Wait until finish?", willWaitComplete);
				}
			}
			else
			{
				EditorGUILayout.HelpBox ("A Settings Manager must be defined for this Action to function correctly. Please go to your Game Window and assign one.", MessageType.Warning);
			}
		}

		#endif

	}