diff --git a/Assets/Resources.meta b/Assets/Resources.meta new file mode 100644 index 0000000..47081a9 --- /dev/null +++ b/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65911971c649b6a879742f70d31d501f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Fire Cracks.ogg b/Assets/Resources/Fire Cracks.ogg new file mode 100644 index 0000000..a4ca97f Binary files /dev/null and b/Assets/Resources/Fire Cracks.ogg differ diff --git a/Assets/Resources/Fire Cracks.ogg.meta b/Assets/Resources/Fire Cracks.ogg.meta new file mode 100644 index 0000000..aa35708 --- /dev/null +++ b/Assets/Resources/Fire Cracks.ogg.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 2ed31ce62ac0fd8b198268d252895d2f +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Fire.ogg b/Assets/Resources/Fire.ogg new file mode 100644 index 0000000..0e6b1cf Binary files /dev/null and b/Assets/Resources/Fire.ogg differ diff --git a/Assets/Resources/Fire.ogg.meta b/Assets/Resources/Fire.ogg.meta new file mode 100644 index 0000000..6a97493 --- /dev/null +++ b/Assets/Resources/Fire.ogg.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 0b58c959db13665d0a948b9c284f2f79 +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Hunted.ogg b/Assets/Resources/Hunted.ogg new file mode 100644 index 0000000..64f6777 Binary files /dev/null and b/Assets/Resources/Hunted.ogg differ diff --git a/Assets/Resources/Hunted.ogg.meta b/Assets/Resources/Hunted.ogg.meta new file mode 100644 index 0000000..dea7453 --- /dev/null +++ b/Assets/Resources/Hunted.ogg.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 9c25236eb6c7d320584c7c90b1771990 +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Tree Cut.ogg b/Assets/Resources/Tree Cut.ogg new file mode 100644 index 0000000..e88d9a3 Binary files /dev/null and b/Assets/Resources/Tree Cut.ogg differ diff --git a/Assets/Resources/Tree Cut.ogg.meta b/Assets/Resources/Tree Cut.ogg.meta new file mode 100644 index 0000000..c768283 --- /dev/null +++ b/Assets/Resources/Tree Cut.ogg.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: af8c14d7d1d36749ab624a3aaf4bf012 +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/MainMenu.unity b/Assets/Scenes/MainMenu.unity index d325efe..5d4aa01 100644 --- a/Assets/Scenes/MainMenu.unity +++ b/Assets/Scenes/MainMenu.unity @@ -236,6 +236,62 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c8ef96580d66d15569418aaf508311d3, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &335870012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 335870015} + - component: {fileID: 335870014} + - component: {fileID: 335870013} + m_Layer: 0 + m_Name: AudioController + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &335870013 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 335870012} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e9ef43588bdc8ffda9204b41ef5a58af, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &335870014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 335870012} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 93eaa725ebfe1c77a8286d5fea05229a, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &335870015 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 335870012} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &356894237 GameObject: m_ObjectHideFlags: 0 @@ -690,6 +746,7 @@ GameObject: m_Component: - component: {fileID: 1628028771} - component: {fileID: 1628028770} + - component: {fileID: 1628028772} m_Layer: 0 m_Name: Level Controller m_TagString: Untagged @@ -726,6 +783,18 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1628028772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628028769} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3d6a8f4dff66810239f482b0236a94d7, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1629685493 GameObject: m_ObjectHideFlags: 0 @@ -803,7 +872,7 @@ Canvas: m_SortingBucketNormalizedSize: 0 m_AdditionalShaderChannelsFlag: 25 m_SortingLayerID: 0 - m_SortingOrder: 0 + m_SortingOrder: 32767 m_TargetDisplay: 0 --- !u!224 &1629685497 RectTransform: diff --git a/Assets/Scripts/AudioController.cs b/Assets/Scripts/AudioController.cs new file mode 100644 index 0000000..ce398d5 --- /dev/null +++ b/Assets/Scripts/AudioController.cs @@ -0,0 +1,212 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class AudioController : MonoBehaviour { + //public structures + public enum Mode { + NONE, + ONCE, + LOOP, + JUMP + } + + public struct AudioContainer { + public AudioSource source; + public Mode mode; + public float jumpStart; + public float jumpEnd; + } + + //internals + Dictionary audioDictionary = new Dictionary(); + static bool initialized = false; + + //monobehaviour methods + void Awake() { + if (initialized) { + Destroy(gameObject); + } + + initialized = true; + + DontDestroyOnLoad(gameObject); + } + + void Update() { + foreach(KeyValuePair iter in audioDictionary) { + //handle the jump points + if (iter.Value.mode == Mode.JUMP && iter.Value.jumpStart >= 0f && iter.Value.jumpEnd > 0f) { + if (iter.Value.source.time >= iter.Value.jumpEnd) { + iter.Value.source.time = iter.Value.jumpStart; + } + } + } + } + + void OnDestroy() { + foreach(KeyValuePair iter in audioDictionary) { + Resources.UnloadAsset(iter.Value.source.clip); + Destroy(iter.Value.source); + } + } + + //public access members + public void Load(string name, string filename) { + AudioContainer container = new AudioContainer(); + + container.source = gameObject.AddComponent(typeof(AudioSource)) as AudioSource; + container.source.clip = Resources.Load(filename) as AudioClip; + container.source.volume = 0f; + container.mode = Mode.NONE; + + audioDictionary[name] = container; + } + + public bool Unload(string name) { + if (!audioDictionary.ContainsKey(name)) { + return false; + } + + AudioContainer container = audioDictionary[name]; + + Resources.UnloadAsset(container.source.clip); + Destroy(container.source); + + audioDictionary.Remove(name); + return true; + } + + //controls + public void Play(string name, Mode mode = Mode.ONCE, float jumpStart = -1f, float jumpEnd = -1f) { + AudioContainer container = audioDictionary[name]; + + container.source.Play(); + container.source.loop = mode == Mode.LOOP; + container.source.volume = 1f; + container.mode = mode; + container.jumpStart = jumpStart; + container.jumpEnd = jumpEnd; + audioDictionary[name] = container; + } + + public void Pause(string name) { + AudioContainer container = audioDictionary[name]; + + container.source.Pause(); + } + + public void Unpause(string name, Mode mode = Mode.ONCE, float jumpStart = -1f, float jumpEnd = -1f) { + AudioContainer container = audioDictionary[name]; + + if (container.source.isPlaying) { + container.source.UnPause(); + } else { + Play(name, mode, jumpStart, jumpEnd); + } + } + + public void Stop(string name) { + AudioContainer container = audioDictionary[name]; + + container.source.Stop(); + container.mode = Mode.NONE; + + audioDictionary[name] = container; + } + + public void StopAll() { + List names = new List(); + foreach(KeyValuePair iter in audioDictionary) { + names.Add(iter.Key); + } + + foreach(string name in names) { + Stop(name); + } + } + + //fade controls + public void FadeIn(string name, float seconds) { + StartCoroutine(FadeInCallback(audioDictionary[name].source, 1f/seconds)); + } + + IEnumerator FadeInCallback(AudioSource source, float amountPerSecond) { + source.volume = 0; + while (source.volume < 1f) { + yield return new WaitForSeconds(0.1f); + source.volume += amountPerSecond / 10f; + } + } + + public void FadeOut(string name, float seconds) { + StartCoroutine(FadeOutCallback(audioDictionary[name].source, 1f/seconds)); + } + + IEnumerator FadeOutCallback(AudioSource source, float amountPerSecond) { + while (source.volume > 0f) { + yield return new WaitForSeconds(0.1f); + source.volume -= amountPerSecond / 10f; + } + } + + //hybrid controls + public void PlayFadeIn(string name, float seconds, Mode mode = Mode.ONCE, float jumpStart = -1f, float jumpEnd = -1f) { + FadeIn(name, seconds); + Play(name, mode, jumpStart, jumpEnd); + } + + public void PauseFadeOut(string name, float seconds) { + FadeOut(name, seconds); + StartCoroutine(PauseFadeOutCallback(name, seconds)); + } + + public void PauseFadeOutAll(float seconds, List exclude = null) { + foreach(KeyValuePair iter in audioDictionary) { + if (exclude != null && exclude.Contains(iter.Key)) { + continue; + } + FadeOut(iter.Key, seconds); + StartCoroutine(PauseFadeOutCallback(iter.Key, seconds)); + } + } + + IEnumerator PauseFadeOutCallback(string name, float seconds) { + yield return new WaitForSeconds(seconds); + Pause(name); + } + + public void UnpauseFadeIn(string name, float seconds, Mode mode = Mode.ONCE, float jumpStart = -1f, float jumpEnd = -1f) { + Unpause(name, mode, jumpStart, jumpEnd); + FadeIn(name, seconds); + } + + public void StopFadeOut(string name, float seconds) { + FadeOut(name, seconds); + StartCoroutine(StopFadeOutCallback(name, seconds)); + } + + public void StopFadeOutAll(float seconds, List exclude = null) { + foreach(KeyValuePair iter in audioDictionary) { + if (exclude != null && exclude.Contains(iter.Key)) { + continue; + } + FadeOut(iter.Key, seconds); + StartCoroutine(StopFadeOutCallback(iter.Key, seconds)); + } + } + + IEnumerator StopFadeOutCallback(string name, float seconds) { + yield return new WaitForSeconds(seconds); + Stop(name); + } + + //status + public bool GetPlaying(string name) { + return audioDictionary[name].source.isPlaying; + } + + public Mode GetMode(string name) { + return audioDictionary[name].mode; + } +} diff --git a/Assets/Scripts/AudioController.cs.meta b/Assets/Scripts/AudioController.cs.meta new file mode 100644 index 0000000..d8a02a2 --- /dev/null +++ b/Assets/Scripts/AudioController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93eaa725ebfe1c77a8286d5fea05229a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AudioMainMenu.cs b/Assets/Scripts/AudioMainMenu.cs new file mode 100644 index 0000000..c27b738 --- /dev/null +++ b/Assets/Scripts/AudioMainMenu.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class AudioMainMenu : MonoBehaviour { + AudioController controller; + + void Start() { + controller = GameObject.Find("AudioController").GetComponent(); + } + + void Update() { + //won't work in start, for some reason + if (controller.GetPlaying("fire") == false) { + controller.Play("fire", AudioController.Mode.LOOP); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/AudioMainMenu.cs.meta b/Assets/Scripts/AudioMainMenu.cs.meta new file mode 100644 index 0000000..b8a07db --- /dev/null +++ b/Assets/Scripts/AudioMainMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d6a8f4dff66810239f482b0236a94d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AudioStartup.cs b/Assets/Scripts/AudioStartup.cs new file mode 100644 index 0000000..e0c821a --- /dev/null +++ b/Assets/Scripts/AudioStartup.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class AudioStartup : MonoBehaviour { + AudioController controller; + void Awake() { + controller = GetComponent(); + controller.Load("fire", "Fire"); + controller.Load("crackle", "Fire Cracks"); + controller.Load("cut", "Tree Cut"); + controller.Load("hunted", "Hunted"); + } +} \ No newline at end of file diff --git a/Assets/Scripts/AudioStartup.cs.meta b/Assets/Scripts/AudioStartup.cs.meta new file mode 100644 index 0000000..d582f92 --- /dev/null +++ b/Assets/Scripts/AudioStartup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e9ef43588bdc8ffda9204b41ef5a58af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Endings/Claws.cs b/Assets/Scripts/Endings/Claws.cs index dbcf343..f8eebf6 100644 --- a/Assets/Scripts/Endings/Claws.cs +++ b/Assets/Scripts/Endings/Claws.cs @@ -5,12 +5,16 @@ using UnityEngine.SceneManagement; public class Claws : MonoBehaviour { SpriteRenderer spriteRenderer; + AudioController audioController; void Awake() { spriteRenderer = GetComponent(); + audioController = GameObject.Find("AudioController").GetComponent(); StartCoroutine(FadeOverTime(2f)); StartCoroutine(SwitchScenesAfter("MainMenu", 5f)); + + audioController.StopAll(); } IEnumerator FadeOverTime(float delay) { diff --git a/Assets/Scripts/Endings/FireGoesOut.cs b/Assets/Scripts/Endings/FireGoesOut.cs index 97ca405..7845038 100644 --- a/Assets/Scripts/Endings/FireGoesOut.cs +++ b/Assets/Scripts/Endings/FireGoesOut.cs @@ -4,9 +4,14 @@ using UnityEngine; using UnityEngine.SceneManagement; public class FireGoesOut : MonoBehaviour { + AudioController audioController; + void Awake() { - //TODO: play extinguished sound + audioController = GameObject.Find("AudioController").GetComponent(); + StartCoroutine(SwitchScenesAfter("MainMenu", 3f)); + + audioController.StopAll(); } IEnumerator SwitchScenesAfter(string sceneName, float delay) { diff --git a/Assets/Scripts/GameObjects/Character.cs b/Assets/Scripts/GameObjects/Character.cs index 6d4c95d..9e4d0b5 100644 --- a/Assets/Scripts/GameObjects/Character.cs +++ b/Assets/Scripts/GameObjects/Character.cs @@ -4,6 +4,9 @@ using UnityEngine; using UnityEngine.SceneManagement; public class Character : MonoBehaviour { + //references + AudioController audioController; + //components SpriteRenderer spriteRenderer; Rigidbody2D rb; @@ -22,6 +25,8 @@ public class Character : MonoBehaviour { float huntingTime; void Awake() { + audioController = GameObject.Find("AudioController").GetComponent(); + spriteRenderer = GetComponent(); rb = GetComponent(); fadeToBlack = GetComponent(); @@ -75,8 +80,13 @@ public class Character : MonoBehaviour { void HandleHunted() { if (fadeToBlack.brightness < 0f) { huntingTime -= Time.deltaTime; + + if (!audioController.GetPlaying("hunted")) { + audioController.Play("hunted"); + } } else { huntingTime = 3f; + audioController.Stop("hunted"); } if (huntingTime <= 0f) { diff --git a/Assets/Scripts/GameObjects/Fire.cs b/Assets/Scripts/GameObjects/Fire.cs index e1fb9cc..c8c8e40 100644 --- a/Assets/Scripts/GameObjects/Fire.cs +++ b/Assets/Scripts/GameObjects/Fire.cs @@ -5,6 +5,7 @@ using UnityEngine; public class Fire : MonoBehaviour { Animator animator; LevelController levelController; + AudioController audioController; [SerializeField] int size = 1; @@ -12,6 +13,7 @@ public class Fire : MonoBehaviour { void Awake() { animator = GetComponent(); levelController = GameObject.Find("Level Controller").GetComponent(); + audioController = GameObject.Find("AudioController").GetComponent(); } void Start() { @@ -38,6 +40,8 @@ public class Fire : MonoBehaviour { levelController.globalWood -= 1; levelController.globalLightLevel += 0.2f; levelController.globalLightLevel = Mathf.Clamp(levelController.globalLightLevel, 0f, 1f); + + audioController.Play("crackle"); } } diff --git a/Assets/Scripts/GameObjects/Tree.cs b/Assets/Scripts/GameObjects/Tree.cs index 044921c..cab7138 100644 --- a/Assets/Scripts/GameObjects/Tree.cs +++ b/Assets/Scripts/GameObjects/Tree.cs @@ -4,6 +4,7 @@ using UnityEngine; public class Tree : MonoBehaviour { static LevelController levelController; + static AudioController audioController; static GameObject character; SpriteRenderer spriteRenderer; @@ -19,6 +20,10 @@ public class Tree : MonoBehaviour { levelController = GameObject.Find("Level Controller").GetComponent(); } + if (!audioController) { + audioController = GameObject.Find("AudioController").GetComponent(); + } + if (!character) { character = GameObject.Find("Character"); } @@ -28,6 +33,8 @@ public class Tree : MonoBehaviour { if (GamePad.GetState().Pressed(CButton.Y)) { life -= 1; + audioController.Play("cut"); + //wiggle StartCoroutine(Wiggle()); diff --git a/Audio/Fire Raw.aac b/Audio/Fire Raw.aac new file mode 100644 index 0000000..23e04e5 Binary files /dev/null and b/Audio/Fire Raw.aac differ diff --git a/Audio/cut_tree.wav b/Audio/cut_tree.wav new file mode 100644 index 0000000..eccad8c Binary files /dev/null and b/Audio/cut_tree.wav differ diff --git a/Audio/hunted.wav b/Audio/hunted.wav new file mode 100644 index 0000000..1e559e3 Binary files /dev/null and b/Audio/hunted.wav differ diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 66ece0b..650d59f 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -12,7 +12,7 @@ PlayerSettings: targetDevice: 2 useOnDemandResources: 0 accelerometerFrequency: 60 - companyName: DefaultCompany + companyName: KR Game Studios productName: Keep It Alive defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0} @@ -119,7 +119,7 @@ PlayerSettings: 16:10: 1 16:9: 1 Others: 1 - bundleVersion: 0.1 + bundleVersion: 1.0 preloadedAssets: [] metroInputSource: 0 wsaTransparentSwapchain: 0