Compare commits

...

16 Commits

Author SHA1 Message Date
journaliciouz
d0da5d76cd Fixed a bug where state machines and auto play audio on awake fucked me 2025-10-31 11:19:47 +01:00
journaliciouz
d48b459fea Audio refactor almost done 2025-10-30 16:31:01 +01:00
journaliciouz
2b41a9f200 Gardener audio refactor 2025-10-30 15:25:07 +01:00
journaliciouz
e81879959e Properly queue critical VO clips 2025-10-30 14:17:47 +01:00
journaliciouz
64da60dadd Merge branch 'main' into audio-overhaul 2025-10-30 11:08:16 +01:00
9396bb76b4 Merge pull request 'Update Pause menu and MinigameSelection menu to icon-based with no text' (#43) from minigame_switch_improvements into main
Reviewed-on: #43
2025-10-30 09:48:35 +00:00
Michal Pikulski
f6ebadf21e Update Pause menu and MinigameSelection menu to icon-based with no text 2025-10-30 10:47:34 +01:00
Michal Pikulski
eeca4973ae Add component search+replace 2025-10-30 10:29:57 +01:00
988bc53ec8 Finally, priority VO 2025-10-29 17:01:02 +01:00
Michal Pikulski
a020e9af04 Update level select menu with icons and scrollable view 2025-10-29 14:37:11 +01:00
3cd2466fbb Merge branch 'main' into audio-overhaul 2025-10-29 14:22:53 +01:00
f7ee3a979a Merge branch 'main' of https://homelab.tailf7f81b.ts.net/tschesky/AppleHillsProduction 2025-10-29 14:22:38 +01:00
4e12e4f8c1 Fixed namespace kerfuffle prohibiting Android build 2025-10-29 14:22:33 +01:00
bf0a37fe2e Merge branch 'main' into audio-overhaul 2025-10-29 11:33:13 +01:00
1a04e82920 Merge branch 'main' into audio-overhaul 2025-10-28 16:10:48 +01:00
86bee75578 Implemented pauses on AudioManager 2025-10-28 13:19:33 +01:00
43 changed files with 4932 additions and 6197 deletions

View File

@@ -1,5 +1,38 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!243 &-6354048548703642832
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Flavor VO
m_AudioMixer: {fileID: 24100000}
m_GroupID: d96f2f2d9081a2b4680e4cc99ae6dde2
m_Children: []
m_Volume: 8b556d01082609a41b5e0ac71387eb2b
m_Pitch: 543e5193b3b867a4a9e179b532d94963
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 2755879577735596061}
m_UserColorIndex: 0
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &-2388863367724940654
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 70589a6f94c3a7e4f985d76dc20fec7d
m_EffectName: Attenuation
m_MixLevel: 1017da8a9e9644f46a2582f97a979436
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &-1208528772216134639
AudioMixerGroupController:
m_ObjectHideFlags: 0
@@ -19,6 +52,25 @@ AudioMixerGroupController:
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &-281949353495416486
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Critical VO
m_AudioMixer: {fileID: 24100000}
m_GroupID: 0564b669f5b88d74fbf644daddff7659
m_Children: []
m_Volume: b5a4611797e711d4384da7546db03ad4
m_Pitch: 6b6c6926b5cf7d64e8546ad727cd1b56
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 4434749241126400044}
m_UserColorIndex: 0
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!241 &24100000
AudioMixerController:
m_ObjectHideFlags: 0
@@ -33,7 +85,7 @@ AudioMixerController:
m_StartSnapshot: {fileID: 24500006}
m_SuspendThreshold: -80
m_EnableSuspend: 1
m_UpdateMode: 0
m_UpdateMode: 1
m_ExposedParameters: []
m_AudioMixerGroupViews:
- guids:
@@ -41,6 +93,9 @@ AudioMixerController:
- 18a903247b220fb47b8e743f756a2d19
- 7e41227c6d9a65c4898080710c015deb
- 93449300145f3ff4c9f21b59e4c06cb8
- 0564b669f5b88d74fbf644daddff7659
- d96f2f2d9081a2b4680e4cc99ae6dde2
- 69e7e2391e0225240b94aab8ac4968dd
name: View
m_CurrentViewIndex: 0
m_TargetSnapshot: {fileID: 24500006}
@@ -56,6 +111,7 @@ AudioMixerGroupController:
m_Children:
- {fileID: -1208528772216134639}
- {fileID: 1171626333864818265}
- {fileID: 5060278701334990569}
- {fileID: 3533147658878909314}
m_Volume: 59834639f5649d34cbb5ed8055029b93
m_Pitch: 2c79200ddd7bbf244bc5980d7fbb6e1c
@@ -124,6 +180,20 @@ AudioMixerGroupController:
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &2755879577735596061
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Attenuation
m_EffectID: 938281aaf51dfdb448130f1d299a9c32
m_EffectName: Attenuation
m_MixLevel: ba6923d75c4220e4bab55e5aa6eab3ea
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &3533147658878909314
AudioMixerGroupController:
m_ObjectHideFlags: 0
@@ -133,7 +203,9 @@ AudioMixerGroupController:
m_Name: Voice Over
m_AudioMixer: {fileID: 24100000}
m_GroupID: 7e41227c6d9a65c4898080710c015deb
m_Children: []
m_Children:
- {fileID: -281949353495416486}
- {fileID: -6354048548703642832}
m_Volume: f2db72fd62c62d74cb03d11a28b9ec8f
m_Pitch: f711bad694828024996b7a703eb57af7
m_Send: 00000000000000000000000000000000
@@ -143,6 +215,39 @@ AudioMixerGroupController:
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &4434749241126400044
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 28433275b262aa6499b0cf5076b597de
m_EffectName: Attenuation
m_MixLevel: 5925348bdea90b04a895b3cd54c45b27
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &5060278701334990569
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Music
m_AudioMixer: {fileID: 24100000}
m_GroupID: 69e7e2391e0225240b94aab8ac4968dd
m_Children: []
m_Volume: c518de39492791c49b618d0aeac5a88d
m_Pitch: 264704130d9d22745aa9fa1150ff4490
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -2388863367724940654}
m_UserColorIndex: 0
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &6612228481115079330
AudioMixerEffectController:
m_ObjectHideFlags: 3

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5f6f72f272957b4439cbaf4e18106470
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -16,3 +16,5 @@ MonoBehaviour:
targetMinigameSceneName: DivingForPictures
description: Level loading for Quarry
mapSprite: {fileID: -3645797367086948227, guid: fea1a8662ef819746b8073c9ba0d9047, type: 3}
menuSprite: {fileID: 0}
minigameMenuSprite: {fileID: 6579828237621196356, guid: 7031dc4d177f92b4f970e104cdd6de51, type: 3}

View File

@@ -0,0 +1,550 @@
using UnityEditor;
using UnityEngine;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
using UnityEditor.IMGUI.Controls;
namespace Editor.Tools
{
public class ComponentSearchReplaceWindow : EditorWindow
{
private Type selectedSearchType;
private Type selectedReplaceType;
private List<ComponentInfo> foundComponents = new List<ComponentInfo>();
private Vector2 scrollPos;
private int selectedComponentIndex = -1;
private string searchTypeName = "Select a Component...";
private string replaceTypeName = "Select a Component...";
private List<Type> allMonoBehaviourTypes = new List<Type>();
[MenuItem("Tools/Component Search & Replace")]
public static void ShowWindow()
{
var window = GetWindow<ComponentSearchReplaceWindow>("Component Search & Replace");
window.minSize = new Vector2(700, 500);
window.maxSize = new Vector2(1400, 1000);
window.position = new Rect(120, 120, 800, 600);
}
private void OnEnable()
{
CacheMonoBehaviourTypes();
EditorSceneManager.sceneOpened += (scene, mode) => ClearSearch();
SceneManager.activeSceneChanged += (oldScene, newScene) => ClearSearch();
}
private void OnDisable()
{
EditorSceneManager.sceneOpened -= (scene, mode) => ClearSearch();
SceneManager.activeSceneChanged -= (oldScene, newScene) => ClearSearch();
}
private void CacheMonoBehaviourTypes()
{
allMonoBehaviourTypes.Clear();
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in assemblies)
{
try
{
var types = assembly.GetTypes()
.Where(t => (t.IsSubclassOf(typeof(MonoBehaviour)) || t.IsSubclassOf(typeof(Component)))
&& !t.IsAbstract
&& t != typeof(Transform)) // Exclude Transform as it can't be removed
.OrderBy(t => t.Name);
allMonoBehaviourTypes.AddRange(types);
}
catch (Exception)
{
// Some assemblies may throw exceptions when getting types
continue;
}
}
}
private void ClearSearch()
{
foundComponents.Clear();
selectedComponentIndex = -1;
Repaint();
}
private void OnGUI()
{
GUILayout.Space(10);
// Search Section
EditorGUILayout.BeginVertical("box");
EditorGUILayout.LabelField("Search for Component", EditorStyles.boldLabel);
GUILayout.Space(5);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Component Type:", GUILayout.Width(120));
if (GUILayout.Button(searchTypeName, EditorStyles.popup, GUILayout.ExpandWidth(true)))
{
var dropdown = new ComponentTypeDropdown(
new AdvancedDropdownState(),
(type) =>
{
selectedSearchType = type;
searchTypeName = type != null ? type.Name : "Select a Component...";
ClearSearch();
Repaint();
});
dropdown.Show(GUILayoutUtility.GetLastRect());
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(5);
EditorGUI.BeginDisabledGroup(selectedSearchType == null);
if (GUILayout.Button("Search Scene", GUILayout.Height(30)))
{
SearchForComponents();
}
EditorGUI.EndDisabledGroup();
EditorGUILayout.EndVertical();
GUILayout.Space(10);
// Results Section
EditorGUILayout.BeginVertical("box");
EditorGUILayout.LabelField($"Search Results ({foundComponents.Count} found)", EditorStyles.boldLabel);
GUILayout.Space(5);
scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandHeight(true));
if (foundComponents.Count == 0)
{
EditorGUILayout.HelpBox("No components found. Select a component type and click 'Search Scene'.", MessageType.Info);
}
else
{
for (int i = 0; i < foundComponents.Count; i++)
{
var info = foundComponents[i];
if (info.component == null) continue;
bool isSelected = selectedComponentIndex == i;
Color originalColor = GUI.backgroundColor;
if (isSelected)
{
GUI.backgroundColor = new Color(0.3f, 0.6f, 1f, 0.5f);
}
EditorGUILayout.BeginVertical("box");
GUI.backgroundColor = originalColor;
EditorGUILayout.BeginHorizontal();
// Selection toggle
bool newSelected = GUILayout.Toggle(isSelected, "", GUILayout.Width(20));
if (newSelected != isSelected)
{
selectedComponentIndex = newSelected ? i : -1;
}
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField($"GameObject: {info.gameObject.name}", EditorStyles.boldLabel);
EditorGUILayout.LabelField($"Path: {info.hierarchyPath}", EditorStyles.miniLabel);
EditorGUILayout.LabelField($"Component: {info.component.GetType().Name}", EditorStyles.miniLabel);
EditorGUILayout.EndVertical();
if (GUILayout.Button("Ping", GUILayout.Width(80)))
{
Selection.activeObject = info.gameObject;
EditorGUIUtility.PingObject(info.gameObject);
SceneView.FrameLastActiveSceneView();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
GUILayout.Space(2);
}
}
EditorGUILayout.EndScrollView();
EditorGUILayout.EndVertical();
GUILayout.Space(10);
// Replace Section
EditorGUILayout.BeginVertical("box");
EditorGUILayout.LabelField("Replace Component", EditorStyles.boldLabel);
GUILayout.Space(5);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Replace With:", GUILayout.Width(120));
if (GUILayout.Button(replaceTypeName, EditorStyles.popup, GUILayout.ExpandWidth(true)))
{
var dropdown = new ComponentTypeDropdown(
new AdvancedDropdownState(),
(type) =>
{
selectedReplaceType = type;
replaceTypeName = type != null ? type.Name : "Select a Component...";
Repaint();
});
dropdown.Show(GUILayoutUtility.GetLastRect());
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(5);
bool canReplace = selectedComponentIndex >= 0 &&
selectedComponentIndex < foundComponents.Count &&
selectedReplaceType != null;
EditorGUI.BeginDisabledGroup(!canReplace);
if (!canReplace && selectedComponentIndex >= 0 && selectedReplaceType == null)
{
EditorGUILayout.HelpBox("Select a component type to replace with.", MessageType.Warning);
}
else if (!canReplace && selectedReplaceType != null)
{
EditorGUILayout.HelpBox("Select an object from the search results above.", MessageType.Warning);
}
if (GUILayout.Button("Replace Selected Component", GUILayout.Height(30)))
{
ReplaceComponent();
}
EditorGUI.EndDisabledGroup();
EditorGUILayout.EndVertical();
GUILayout.Space(5);
}
private void SearchForComponents()
{
if (selectedSearchType == null)
{
Debug.LogWarning("No component type selected for search.");
return;
}
foundComponents.Clear();
selectedComponentIndex = -1;
var allObjects = FindObjectsByType<GameObject>(FindObjectsInactive.Include, FindObjectsSortMode.None);
foreach (var go in allObjects)
{
var component = go.GetComponent(selectedSearchType);
if (component != null)
{
foundComponents.Add(new ComponentInfo
{
gameObject = go,
component = component,
hierarchyPath = GetHierarchyPath(go)
});
}
}
foundComponents = foundComponents.OrderBy(c => c.hierarchyPath).ToList();
Debug.Log($"Found {foundComponents.Count} objects with component type '{selectedSearchType.Name}'");
Repaint();
}
private void ReplaceComponent()
{
if (selectedComponentIndex < 0 || selectedComponentIndex >= foundComponents.Count)
{
Debug.LogError("No component selected to replace.");
return;
}
if (selectedReplaceType == null)
{
Debug.LogError("No replacement component type selected.");
return;
}
var info = foundComponents[selectedComponentIndex];
var go = info.gameObject;
var oldComponent = info.component;
if (go == null || oldComponent == null)
{
Debug.LogError("Selected component or GameObject is null.");
foundComponents.RemoveAt(selectedComponentIndex);
selectedComponentIndex = -1;
Repaint();
return;
}
// Confirm the replacement
bool confirmed = EditorUtility.DisplayDialog(
"Replace Component",
$"Are you sure you want to replace '{selectedSearchType.Name}' with '{selectedReplaceType.Name}' on GameObject '{go.name}'?\n\n" +
"This action can be undone with Ctrl+Z.",
"Replace",
"Cancel"
);
if (!confirmed)
{
return;
}
// Record undo
Undo.RegisterCompleteObjectUndo(go, "Replace Component");
// Copy serialized data if possible (optional enhancement)
// This attempts to preserve common fields between components
var serializedOldComponent = new SerializedObject(oldComponent);
// Remove old component
Undo.DestroyObjectImmediate(oldComponent);
// Add new component
var newComponent = Undo.AddComponent(go, selectedReplaceType);
// Try to copy matching serialized properties
var serializedNewComponent = new SerializedObject(newComponent);
CopyMatchingSerializedProperties(serializedOldComponent, serializedNewComponent);
serializedNewComponent.ApplyModifiedProperties();
// Mark scene as dirty
EditorSceneManager.MarkSceneDirty(go.scene);
Debug.Log($"Replaced '{selectedSearchType.Name}' with '{selectedReplaceType.Name}' on '{go.name}'");
// Update the found components list
foundComponents[selectedComponentIndex] = new ComponentInfo
{
gameObject = go,
component = newComponent,
hierarchyPath = info.hierarchyPath
};
// Update search type if needed
if (selectedSearchType != selectedReplaceType)
{
foundComponents.RemoveAt(selectedComponentIndex);
selectedComponentIndex = -1;
}
Repaint();
}
private void CopyMatchingSerializedProperties(SerializedObject source, SerializedObject destination)
{
SerializedProperty iterator = source.GetIterator();
bool enterChildren = true;
while (iterator.NextVisible(enterChildren))
{
enterChildren = false;
// Skip script reference
if (iterator.propertyPath == "m_Script")
continue;
SerializedProperty destProp = destination.FindProperty(iterator.propertyPath);
if (destProp != null && destProp.propertyType == iterator.propertyType)
{
try
{
destination.CopyFromSerializedProperty(iterator);
}
catch
{
// Some properties may not be copyable
}
}
}
}
private string GetHierarchyPath(GameObject go)
{
string path = go.name;
Transform t = go.transform.parent;
while (t != null)
{
path = t.name + "/" + path;
t = t.parent;
}
return path;
}
private class ComponentInfo
{
public GameObject gameObject;
public Component component;
public string hierarchyPath;
}
}
// Advanced Dropdown for Component Type Selection (including Unity built-in components)
public class ComponentTypeDropdown : AdvancedDropdown
{
private Action<Type> onTypeSelected;
private static List<Type> cachedTypes;
public ComponentTypeDropdown(AdvancedDropdownState state, Action<Type> onTypeSelected)
: base(state)
{
this.onTypeSelected = onTypeSelected;
minimumSize = new Vector2(300, 400);
if (cachedTypes == null)
{
CacheTypes();
}
}
private static void CacheTypes()
{
cachedTypes = new List<Type>();
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in assemblies)
{
try
{
var types = assembly.GetTypes()
.Where(t => (t.IsSubclassOf(typeof(MonoBehaviour)) || t.IsSubclassOf(typeof(Component)))
&& !t.IsAbstract
&& t != typeof(Transform)) // Exclude Transform as it can't be removed
.OrderBy(t => t.Name);
cachedTypes.AddRange(types);
}
catch (Exception)
{
// Some assemblies may throw exceptions when getting types
}
}
}
protected override AdvancedDropdownItem BuildRoot()
{
var root = new AdvancedDropdownItem("Component Types");
// Add "None" option
var noneItem = new TypeDropdownItem("None", null);
root.AddChild(noneItem);
root.AddSeparator();
// Separate Unity built-in components from custom ones
var unityComponents = cachedTypes.Where(t =>
t.Namespace != null && t.Namespace.StartsWith("UnityEngine")).ToList();
var customComponents = cachedTypes.Except(unityComponents).ToList();
// Add Unity Components section
if (unityComponents.Any())
{
var unitySection = new AdvancedDropdownItem("Unity Components");
// Group Unity components by category (second part of namespace)
var unityGrouped = unityComponents.GroupBy(t =>
{
if (t.Namespace == "UnityEngine")
return "Core";
var parts = t.Namespace.Split('.');
return parts.Length > 1 ? parts[1] : "Other";
}).OrderBy(g => g.Key);
foreach (var group in unityGrouped)
{
if (group.Count() <= 5)
{
// Add directly if few items
foreach (var type in group.OrderBy(t => t.Name))
{
var typeItem = new TypeDropdownItem(type.Name, type);
unitySection.AddChild(typeItem);
}
}
else
{
// Create subcategory
var categoryItem = new AdvancedDropdownItem(group.Key);
foreach (var type in group.OrderBy(t => t.Name))
{
var typeItem = new TypeDropdownItem(type.Name, type);
categoryItem.AddChild(typeItem);
}
unitySection.AddChild(categoryItem);
}
}
root.AddChild(unitySection);
}
// Add Custom Components section
if (customComponents.Any())
{
root.AddSeparator();
// Group by namespace
var groupedTypes = customComponents.GroupBy(t =>
string.IsNullOrEmpty(t.Namespace) ? "(No Namespace)" : t.Namespace);
foreach (var group in groupedTypes.OrderBy(g => g.Key))
{
// For small namespaces or no namespace, add directly to root
if (group.Count() <= 3 || group.Key == "(No Namespace)")
{
foreach (var type in group)
{
var typeItem = new TypeDropdownItem(
group.Key == "(No Namespace)" ? type.Name : $"{group.Key}.{type.Name}",
type);
root.AddChild(typeItem);
}
}
else
{
// Create namespace folder
var namespaceItem = new AdvancedDropdownItem(group.Key);
foreach (var type in group)
{
var typeItem = new TypeDropdownItem(type.Name, type);
namespaceItem.AddChild(typeItem);
}
root.AddChild(namespaceItem);
}
}
}
return root;
}
protected override void ItemSelected(AdvancedDropdownItem item)
{
var typeItem = item as TypeDropdownItem;
if (typeItem != null)
{
onTypeSelected?.Invoke(typeItem.Type);
}
}
private class TypeDropdownItem : AdvancedDropdownItem
{
public Type Type { get; private set; }
public TypeDropdownItem(string name, Type type) : base(name)
{
Type = type;
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 604b18a354fa44a49723ab9f9173762e
timeCreated: 1761816008

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -0,0 +1,195 @@
fileFormatVersion: 2
guid: c3d03e932743da340b8b2a2c290013f0
TextureImporter:
internalIDToNameTable:
- first:
213: -6037909929086895425
second: applehills_kort_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: applehills_kort_0
rect:
serializedVersion: 2
x: 8
y: 21
width: 498
height: 491
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: fbab8f2e8e8053ca0800000000000000
internalID: -6037909929086895425
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
applehills_kort_0: -6037909929086895425
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,195 @@
fileFormatVersion: 2
guid: 1bb06ae831042e24c915cd682fa2c6ab
TextureImporter:
internalIDToNameTable:
- first:
213: 3559306594824124945
second: power_off_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: power_off_0
rect:
serializedVersion: 2
x: 0
y: 0
width: 384
height: 384
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 11a723f6d72356130800000000000000
internalID: 3559306594824124945
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
power_off_0: 3559306594824124945
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,195 @@
fileFormatVersion: 2
guid: 9d084ac2438d6f9448c61a62639581ba
TextureImporter:
internalIDToNameTable:
- first:
213: -1083306995931140661
second: refresh-arrow_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: refresh-arrow_0
rect:
serializedVersion: 2
x: 0
y: 0
width: 464
height: 463
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: bcd24dcd60257f0f0800000000000000
internalID: -1083306995931140661
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
refresh-arrow_0: -1083306995931140661
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -54,6 +54,8 @@ SpriteRenderer:
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -75,6 +77,7 @@ SpriteRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 1
@@ -163,6 +166,8 @@ SpriteRenderer:
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -184,6 +189,7 @@ SpriteRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 2
@@ -214,6 +220,8 @@ GameObject:
- component: {fileID: 6455089331794006644}
- component: {fileID: 5043618791380611472}
- component: {fileID: 4538351495758615844}
- component: {fileID: 1474128690748341614}
- component: {fileID: 8147035636176183831}
m_Layer: 10
m_Name: AnneLise_Camera
m_TagString: Untagged
@@ -439,3 +447,115 @@ BoxCollider2D:
m_AutoTiling: 0
m_Size: {x: 4, y: 5}
m_EdgeRadius: 0
--- !u!82 &1474128690748341614
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5172497182660285677}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: -281949353495416486, guid: 727a7e4b6df4b0d47897f7d8ee7fa323, type: 2}
m_audioClip: {fileID: 0}
m_Resource: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 1
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!114 &8147035636176183831
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5172497182660285677}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 242e6101be071f44fb14c3c12641c833, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::AppleAudioSource
audioSourceType: 0
audioSource: {fileID: 0}
priority: 0

View File

@@ -134,12 +134,13 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f0f1834ce0c7b0b42b633a6d2bd67698, type: 3}
m_Name:
m_EditorClassIdentifier: '::'
gardenerAudioPlayer: {fileID: 2263287369158035129}
mowerAudioPlayer: {fileID: 647208781616539222}
gardenerAudioPlayer: {fileID: 0}
mowerAudioPlayer: {fileID: 0}
mowerStartAudio: {fileID: 8300000, guid: 082fcd5bdadf2884e9aefc6abf4a5cc5, type: 3}
mowerLoopAudio: {fileID: 8300000, guid: aed79daa951bce74196ce04da2990b22, type: 3}
mowerLoopAudio: {fileID: 0}
gardenerFleeAudioClip: {fileID: 6418180475301049370, guid: 4949348ce86bb9e43a4251c06c1cb5d1, type: 2}
gardenerChaseAudioClip: {fileID: 6418180475301049370, guid: 97ccaa2fcf396f446aa7fde8586d225a, type: 2}
gardenerSprite: {fileID: 0}
--- !u!1 &1251257928845417300
GameObject:
m_ObjectHideFlags: 0
@@ -308,7 +309,6 @@ Transform:
- {fileID: 5409891338185859165}
- {fileID: 3150182414053579701}
- {fileID: 1667791532132169314}
- {fileID: 3539173003033760347}
m_Father: {fileID: 2264394306674147778}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &20943836391379072
@@ -907,135 +907,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 5980d28f81eb545d78e1d84e1449a10f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &8590192324315186055
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3539173003033760347}
- component: {fileID: 647208781616539222}
m_Layer: 0
m_Name: MowerSFX
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3539173003033760347
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8590192324315186055}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -2.5896003, y: -4.9567494, z: 0}
m_LocalScale: {x: 0.7142856, y: 0.7142856, z: 0.7142856}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 8242272023601642381}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!82 &647208781616539222
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8590192324315186055}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 1171626333864818265, guid: 727a7e4b6df4b0d47897f7d8ee7fa323, type: 2}
m_audioClip: {fileID: 0}
m_Resource: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 20
MaxDistance: 50.5
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!1 &9197792684223820912
GameObject:
m_ObjectHideFlags: 0
@@ -1171,11 +1042,11 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 1592061707390547073, guid: 7be57ba4ecd292f4c90169045a2d69e4, type: 3}
propertyPath: m_LocalPosition.x
value: -0.22846493
value: -0.22846495
objectReference: {fileID: 0}
- target: {fileID: 1592061707390547073, guid: 7be57ba4ecd292f4c90169045a2d69e4, type: 3}
propertyPath: m_LocalPosition.y
value: -3.3647113
value: -3.3647115
objectReference: {fileID: 0}
- target: {fileID: 1592061707390547073, guid: 7be57ba4ecd292f4c90169045a2d69e4, type: 3}
propertyPath: m_LocalPosition.z
@@ -1232,9 +1103,6 @@ PrefabInstance:
- targetCorrespondingSourceObject: {fileID: 5034469437909578894, guid: 7be57ba4ecd292f4c90169045a2d69e4, type: 3}
insertIndex: -1
addedObject: {fileID: 7341880855800055810}
- targetCorrespondingSourceObject: {fileID: 5034469437909578894, guid: 7be57ba4ecd292f4c90169045a2d69e4, type: 3}
insertIndex: -1
addedObject: {fileID: 2263287369158035129}
m_SourcePrefab: {fileID: 100100000, guid: 7be57ba4ecd292f4c90169045a2d69e4, type: 3}
--- !u!1 &1789599716509294674 stripped
GameObject:
@@ -1253,103 +1121,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: eaefd3d5a2a864ca5b5d9ec5f2a7040f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!82 &2263287369158035129
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1789599716509294674}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 3533147658878909314, guid: 727a7e4b6df4b0d47897f7d8ee7fa323, type: 2}
m_audioClip: {fileID: 0}
m_Resource: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 20
MaxDistance: 50
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!4 &5409891338185859165 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 1592061707390547073, guid: 7be57ba4ecd292f4c90169045a2d69e4, type: 3}

View File

@@ -11,7 +11,7 @@ GameObject:
- component: {fileID: 536416456044738252}
- component: {fileID: 6629069534496617365}
m_Layer: 0
m_Name: SoundManager
m_Name: AudioManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -44,3 +44,11 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d8bd90cfc02c8274fac5ce090285ed6a, type: 3}
m_Name:
m_EditorClassIdentifier: '::'
currentPauseBehavior: 2
audioMixer: {fileID: 24100000, guid: 727a7e4b6df4b0d47897f7d8ee7fa323, type: 2}
currentlyPlayingVO: {fileID: 0}
criticalVOSources: []
VOSources: []
musicSources: []
ambienceSources: []
SFXSources: []

View File

@@ -136,6 +136,81 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &671326379795878693
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4498104668003212261}
- component: {fileID: 1384216111310773312}
- component: {fileID: 8822046367999630453}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4498104668003212261
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 671326379795878693}
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_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 538506048417711235}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.2, y: 0.2}
m_AnchorMax: {x: 0.8, y: 0.8}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1384216111310773312
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 671326379795878693}
m_CullTransparentMesh: 1
--- !u!114 &8822046367999630453
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 671326379795878693}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: -5941552768301239376, guid: 300528d856c15824989bade57a7e04e4, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &1519948061307491961
GameObject:
m_ObjectHideFlags: 0
@@ -969,13 +1044,14 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Children:
- {fileID: 4498104668003212261}
m_Father: {fileID: 5494371867874695937}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -100, y: 100}
m_SizeDelta: {x: 100, y: 100}
m_AnchoredPosition: {x: -56, y: 64}
m_SizeDelta: {x: 250, y: 250}
m_Pivot: {x: 1, y: 0}
--- !u!222 &1082932495279705792
CanvasRenderer:

View File

@@ -651,6 +651,7 @@ GameObject:
- component: {fileID: 578146208477020881}
- component: {fileID: 1193493154550576580}
- component: {fileID: 7652960462502122104}
- component: {fileID: 989520896849684110}
m_Layer: 0
m_Name: AnneLiseBush
m_TagString: Untagged
@@ -747,10 +748,11 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: edc43a9f07fedb44abb68b06c71d17ea, type: 3}
m_Name:
m_EditorClassIdentifier: '::'
VOPlayer: {fileID: 7652960462502122104}
SFXPlayer: {fileID: 5129281429389775297}
VOPlayer: {fileID: 989520896849684110}
SFXPlayer: {fileID: 2614810362455218124}
reactionClipToPlay: {fileID: 0}
flashSFXClipToPlay: {fileID: 8300000, guid: 2ac461fcc3f7a014ca716a4f231be004, type: 3}
birdGameStats: {fileID: 0}
birdCounterClip:
- {fileID: 8300000, guid: 60d02b75b267d5949a36f04bb5dfe409, type: 3}
- {fileID: 8300000, guid: 86dc2e8f9a1cf7440adccad824209334, type: 3}
@@ -853,6 +855,21 @@ AudioSource:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!114 &989520896849684110
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5943355783477523754}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 242e6101be071f44fb14c3c12641c833, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::AppleAudioSource
audioSourceType: 0
audioSource: {fileID: 0}
priority: 0
--- !u!1 &6948354193133336628
GameObject:
m_ObjectHideFlags: 0
@@ -863,6 +880,7 @@ GameObject:
m_Component:
- component: {fileID: 6330838396794415978}
- component: {fileID: 5129281429389775297}
- component: {fileID: 2614810362455218124}
m_Layer: 0
m_Name: SFXAudio
m_TagString: Untagged
@@ -982,6 +1000,21 @@ AudioSource:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!114 &2614810362455218124
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6948354193133336628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 242e6101be071f44fb14c3c12641c833, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::AppleAudioSource
audioSourceType: 3
audioSource: {fileID: 0}
priority: 0
--- !u!1 &7019503702609181254
GameObject:
m_ObjectHideFlags: 0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -178,13 +178,49 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 1936850923066780126, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_SizeDelta.x
- target: {fileID: 983415425082270079, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 983415425082270079, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 983415425082270079, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 983415425082270079, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1593702389427837575, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1804752920503555062, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1804752920503555062, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1804752920503555062, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1804752920503555062, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1936850923066780126, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_SizeDelta.x
value: 341.5
objectReference: {fileID: 0}
- target: {fileID: 1936850923066780126, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_SizeDelta.y
value: 0
value: 150
objectReference: {fileID: 0}
- target: {fileID: 2570593642998705886, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMax.y
@@ -248,19 +284,23 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4841071245403604065, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4841071245403604065, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4841071245403604065, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
value: 75
objectReference: {fileID: 0}
- target: {fileID: 4841071245403604065, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
value: -75
objectReference: {fileID: 0}
- target: {fileID: 5003708969225410361, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0.0002746582
objectReference: {fileID: 0}
- target: {fileID: 5275008271445494810, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_SizeDelta.x
@@ -270,6 +310,50 @@ PrefabInstance:
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5315106633118420968, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5315106633118420968, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5334678823793530471, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5334678823793530471, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5334678823793530471, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5334678823793530471, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5620538142629867345, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5620538142629867345, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5620538142629867345, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5620538142629867345, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5992029148489394405, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7086790971941574277, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_LocalPosition.x
value: -28.8398
@@ -332,19 +416,19 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 9220948749313234647, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 9220948749313234647, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 9220948749313234647, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
value: 266.5
objectReference: {fileID: 0}
- target: {fileID: 9220948749313234647, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
value: -75
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []

View File

@@ -18,7 +18,7 @@ public class PicnicBehaviour : MonoBehaviour
[Header("The FakeChocolate to destroy!")]
[SerializeField] private GameObject fakeChocolate; // Assign in Inspector
private AudioSource _audioSource;
private AppleAudioSource _audioSource;
public AudioResource distractedAudioClips;
public AudioResource angryAudioClips;
public AudioResource feederClips;
@@ -34,7 +34,7 @@ public class PicnicBehaviour : MonoBehaviour
{
stateMachine = GetComponent<StateMachine>();
animator = GetComponent<Animator>();
_audioSource = GetComponent<AudioSource>();
_audioSource = GetComponent<AppleAudioSource>();
}
private IEnumerator StateCycleRoutine()
@@ -68,8 +68,8 @@ public class PicnicBehaviour : MonoBehaviour
animator.SetTrigger("theyAngry");
//stateMachine.ChangeState("Picnic PPL Angry");
Logging.Debug("Hey! Don't steal my chocolate!");
_audioSource.resource = angryAudioClips;
_audioSource.Play();
_audioSource.audioSource.resource = angryAudioClips;
_audioSource.Play(0);
}
public void destroyFakeChocolate()
@@ -83,20 +83,20 @@ public class PicnicBehaviour : MonoBehaviour
public void PlayFeederAudio()
{
_audioSource.resource = feederClips;
_audioSource.Play();
_audioSource.audioSource.resource = feederClips;
_audioSource.Play(0);
}
public void PlayMoanerAudio()
{
_audioSource.resource = moanerClips;
_audioSource.Play();
_audioSource.audioSource.resource = moanerClips;
_audioSource.Play(0);
}
public void PlayDistractedAudio()
{
_audioSource.resource = distractedAudioClips;
_audioSource.Play();
_audioSource.audioSource.resource = distractedAudioClips;
_audioSource.Play(0);
}

View File

@@ -7,7 +7,7 @@ public class SoundGenerator : MonoBehaviour
[SerializeField] private Sprite enterSprite;
[SerializeField] private Sprite exitSprite;
[SerializeField] private AudioClip enterSound;
[SerializeField] private AudioSource audioSource;
[SerializeField] private AppleAudioSource audioSource;
[SerializeField] private StateMachine soundBirdSMRef;
[SerializeField] private soundBird_CanFly soundbirdHearingCheck;
@@ -35,7 +35,7 @@ public class SoundGenerator : MonoBehaviour
}
if (audioSource != null && enterSound != null)
{
audioSource.PlayOneShot(enterSound);
audioSource.audioSource.PlayOneShot(enterSound);
}
if (soundBirdSMRef != null && soundBirdSMRef.currentState.name == "SoundBird" && soundbirdHearingCheck.canFly == true)
{

View File

@@ -13,7 +13,7 @@ public class soundBird_TakeOffBehaviour : MonoBehaviour
private Animator animator;
private TweenBase objectTween;
public AudioSource audioSource;
public AppleAudioSource audioSource;
void Awake()
{
@@ -29,7 +29,7 @@ public class soundBird_TakeOffBehaviour : MonoBehaviour
{
animator.SetBool("isScared", true);
objectTween = Tween.Spline(FlightSpline, SoundBirdObject, 0, 1, false, flightDuration, flightDelay, Tween.EaseIn, Tween.LoopType.None, HandleTweenStarted, HandleTweenFinished);
audioSource.Play();
audioSource.Play(0);
}
void HandleTweenStarted()
{

View File

@@ -6,11 +6,12 @@ using Core;
using Interactions;
using UnityEngine;
using PuzzleS;
using UnityEngine.Audio;
namespace Dialogue
{
[AddComponentMenu("AppleHills/Dialogue/Dialogue Component")]
[RequireComponent(typeof(AudioSource))]
[RequireComponent(typeof(AppleAudioSource))]
public class DialogueComponent : MonoBehaviour
{
[SerializeField] private RuntimeDialogueGraph dialogueGraph;
@@ -19,7 +20,7 @@ namespace Dialogue
private int currentLineIndex;
private bool initialized = false;
private SpeechBubble speechBubble;
private AudioSource audioSource;
private AppleAudioSource appleAudioSource;
// Flag to track when a condition has been met but dialogue hasn't advanced yet
private bool _conditionSatisfiedPendingAdvance = false;
@@ -37,7 +38,7 @@ namespace Dialogue
private void Start()
{
// Get required components
audioSource = GetComponent<AudioSource>();
appleAudioSource = GetComponent<AppleAudioSource>();
speechBubble = GetComponentInChildren<SpeechBubble>();
if (speechBubble == null)
@@ -109,19 +110,19 @@ namespace Dialogue
/// Play the audio clip for the current dialogue content
/// </summary>
/// <param name="clip">Audio clip to play</param>
private void PlayDialogueAudio(AudioClip clip)
private void PlayDialogueAudio(AudioResource clip)
{
// Stop any currently playing audio
if (audioSource.isPlaying)
if (appleAudioSource.audioSource.isPlaying)
{
audioSource.Stop();
appleAudioSource.Stop();
}
// Play the new clip if it exists
if (clip != null)
{
audioSource.clip = clip;
audioSource.Play();
appleAudioSource.audioSource.resource = clip;
appleAudioSource.Play(1);
Logging.Debug($"Playing dialogue audio: {clip.name}");
}
}

View File

@@ -30,8 +30,13 @@ namespace Levels
public Sprite mapSprite;
/// <summary>
/// Icon to display for this level switch.
/// Icon to display in UI for this level switch.
/// </summary>
public Sprite menuSprite;
/// <summary>
/// Icon to display for minigame selection, attached to this level.
/// </summary>
public Sprite minigameMenuSprite;
}
}

View File

@@ -1,9 +1,10 @@
using System;
using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Core.SaveLoad;
using Unity.Android.Gradle;
using Core;
namespace Levels
{
@@ -13,20 +14,33 @@ namespace Levels
public class LevelSwitchMenu : MonoBehaviour
{
[Header("UI References")]
public Image iconImage;
public TMP_Text levelNameText;
public Button confirmButton;
public Image mainLevelIconImage;
public Image minigameIconImage;
public TMP_Text mainLevelNameText;
public TMP_Text minigameLevelNameText;
public Button puzzleLevelConfirmButton;
public Button puzzleLevelRestartButton;
public Button cancelButton;
public Button minigameButton;
public GameObject padlockIcon;
public Button restartButton;
public Button minigameConfirmButton;
public GameObject popupConfirmMenu;
public Button popupConfirmButton;
public Button popupCancelButton;
public Image tintTargetImage;
public Color popupTintColor = new Color(0.5f, 0.5f, 0.5f, 1f); // grey by default
public Color disabledTintColor = new Color(0.5f, 0.5f, 0.5f, 1f); // grey by default
[Header("Minigame Lock")]
public Image padlockImage;
[Header("Scroll View")]
public ScrollRect scrollView;
public Button scrollToPuzzleLevelButton;
public Button scrollToMinigameButton;
public float scrollDuration = 1f;
private Color _originalTintColor;
private Color _originalMinigameIconColor;
private Action _onRestart;
private Coroutine _activeScrollCoroutine;
private Action _onLevelConfirm;
private Action _onMinigameConfirm;
@@ -43,35 +57,55 @@ namespace Levels
_onMinigameConfirm = onMinigameConfirm;
_onCancel = onCancel;
_onRestart = onRestart;
if(switchData != null)
{
if (iconImage)
if (mainLevelIconImage)
{
iconImage.sprite = switchData.menuSprite != null
mainLevelIconImage.sprite = switchData.menuSprite != null
? switchData.menuSprite
: switchData.mapSprite;
}
if (levelNameText) levelNameText.text = switchData?.targetLevelSceneName ?? "";
if (minigameIconImage)
{
minigameIconImage.sprite = switchData.minigameMenuSprite;
}
if (mainLevelNameText) mainLevelNameText.text = switchData?.targetLevelSceneName ?? "";
if (minigameLevelNameText) minigameLevelNameText.text = switchData.targetMinigameSceneName ?? "";
}
else
{
Logging.LogWarning("[LevelSwitchMenu] No level data is assigned!");
Logging.Warning("[LevelSwitchMenu] No level data is assigned!");
}
if (confirmButton) confirmButton.onClick.AddListener(OnConfirmClicked);
// Setup button listeners
if (puzzleLevelConfirmButton) puzzleLevelConfirmButton.onClick.AddListener(OnPuzzleLevelConfirmClicked);
if (puzzleLevelRestartButton) puzzleLevelRestartButton.onClick.AddListener(OnRestartClicked);
if (cancelButton) cancelButton.onClick.AddListener(OnCancelClicked);
if (minigameButton) minigameButton.onClick.AddListener(OnMinigameClicked);
if (restartButton) restartButton.onClick.AddListener(OnRestartClicked);
if (popupConfirmMenu) popupConfirmMenu.SetActive(false);
if (tintTargetImage) _originalTintColor = tintTargetImage.color;
if (minigameConfirmButton) minigameConfirmButton.onClick.AddListener(OnMinigameConfirmClicked);
if (scrollToPuzzleLevelButton) scrollToPuzzleLevelButton.onClick.AddListener(OnScrollToPuzzleLevelClicked);
if (scrollToMinigameButton) scrollToMinigameButton.onClick.AddListener(OnScrollToMinigameClicked);
if (popupConfirmButton) popupConfirmButton.onClick.AddListener(OnPopupConfirmClicked);
if (popupCancelButton) popupCancelButton.onClick.AddListener(OnPopupCancelClicked);
if (popupConfirmMenu) popupConfirmMenu.SetActive(false);
if (tintTargetImage) _originalTintColor = tintTargetImage.color;
if (minigameIconImage) _originalMinigameIconColor = minigameIconImage.color;
// Initialize scroll view to start at left (puzzle level view)
if (scrollView) scrollView.horizontalNormalizedPosition = 0f;
// Initialize scroll button visibility
if (scrollToMinigameButton) scrollToMinigameButton.gameObject.SetActive(true);
if (scrollToPuzzleLevelButton) scrollToPuzzleLevelButton.gameObject.SetActive(false);
// --- Minigame unlock state logic ---
if (SaveLoadManager.Instance != null)
{
if (SaveLoadManager.Instance.IsSaveDataLoaded)
{
ApplyMinigameUnlockStateIfAvailable();
ApplyMinigameUnlockState();
}
else
{
@@ -82,25 +116,34 @@ namespace Levels
private void OnDestroy()
{
if (confirmButton) confirmButton.onClick.RemoveListener(OnConfirmClicked);
if (puzzleLevelConfirmButton) puzzleLevelConfirmButton.onClick.RemoveListener(OnPuzzleLevelConfirmClicked);
if (puzzleLevelRestartButton) puzzleLevelRestartButton.onClick.RemoveListener(OnRestartClicked);
if (cancelButton) cancelButton.onClick.RemoveListener(OnCancelClicked);
if (minigameButton) minigameButton.onClick.RemoveListener(OnMinigameClicked);
if (restartButton) restartButton.onClick.RemoveListener(OnRestartClicked);
if (minigameConfirmButton) minigameConfirmButton.onClick.RemoveListener(OnMinigameConfirmClicked);
if (scrollToPuzzleLevelButton) scrollToPuzzleLevelButton.onClick.RemoveListener(OnScrollToPuzzleLevelClicked);
if (scrollToMinigameButton) scrollToMinigameButton.onClick.RemoveListener(OnScrollToMinigameClicked);
if (popupConfirmButton) popupConfirmButton.onClick.RemoveListener(OnPopupConfirmClicked);
if (popupCancelButton) popupCancelButton.onClick.RemoveListener(OnPopupCancelClicked);
if (_activeScrollCoroutine != null)
{
StopCoroutine(_activeScrollCoroutine);
_activeScrollCoroutine = null;
}
if (SaveLoadManager.Instance != null)
{
SaveLoadManager.Instance.OnLoadCompleted -= OnSaveDataLoadedHandler;
}
}
private void OnConfirmClicked()
private void OnPuzzleLevelConfirmClicked()
{
_onLevelConfirm?.Invoke();
Destroy(gameObject);
}
private void OnMinigameClicked()
private void OnMinigameConfirmClicked()
{
_onMinigameConfirm?.Invoke();
Destroy(gameObject);
@@ -115,7 +158,7 @@ namespace Levels
private void OnRestartClicked()
{
if (popupConfirmMenu) popupConfirmMenu.SetActive(true);
if (tintTargetImage) tintTargetImage.color = popupTintColor;
if (tintTargetImage) tintTargetImage.color = disabledTintColor;
}
private void OnPopupCancelClicked()
@@ -131,20 +174,110 @@ namespace Levels
if (tintTargetImage) tintTargetImage.color = _originalTintColor;
}
private void ApplyMinigameUnlockStateIfAvailable()
private void OnScrollToMinigameClicked()
{
if (minigameButton == null || padlockIcon == null || _switchData == null)
if (_activeScrollCoroutine != null)
{
StopCoroutine(_activeScrollCoroutine);
}
_activeScrollCoroutine = StartCoroutine(ScrollToMinigameCoroutine());
}
private void OnScrollToPuzzleLevelClicked()
{
if (_activeScrollCoroutine != null)
{
StopCoroutine(_activeScrollCoroutine);
}
_activeScrollCoroutine = StartCoroutine(ScrollToPuzzleLevelCoroutine());
}
private IEnumerator ScrollToMinigameCoroutine()
{
// Hide the scroll to minigame button
if (scrollToMinigameButton) scrollToMinigameButton.gameObject.SetActive(false);
// Scroll to the right (normalized position 0.95)
float elapsed = 0f;
float startPos = scrollView.horizontalNormalizedPosition;
float targetPos = 0.9f;
while (elapsed < scrollDuration)
{
elapsed += Time.deltaTime;
float t = Mathf.Clamp01(elapsed / scrollDuration);
// Use SmoothStep for a smoother animation
float smoothT = Mathf.SmoothStep(0f, 1f, t);
scrollView.horizontalNormalizedPosition = Mathf.Lerp(startPos, targetPos, smoothT);
yield return null;
}
// Ensure we're at the final position
scrollView.horizontalNormalizedPosition = targetPos;
// Show the scroll to puzzle level button
if (scrollToPuzzleLevelButton) scrollToPuzzleLevelButton.gameObject.SetActive(true);
_activeScrollCoroutine = null;
}
private IEnumerator ScrollToPuzzleLevelCoroutine()
{
// Hide the scroll to puzzle level button
if (scrollToPuzzleLevelButton) scrollToPuzzleLevelButton.gameObject.SetActive(false);
// Scroll to the left (normalized position 0)
float elapsed = 0f;
float startPos = scrollView.horizontalNormalizedPosition;
float targetPos = 0f;
while (elapsed < scrollDuration)
{
elapsed += Time.deltaTime;
float t = Mathf.Clamp01(elapsed / scrollDuration);
// Use SmoothStep for a smoother animation
float smoothT = Mathf.SmoothStep(0f, 1f, t);
scrollView.horizontalNormalizedPosition = Mathf.Lerp(startPos, targetPos, smoothT);
yield return null;
}
// Ensure we're at the final position
scrollView.horizontalNormalizedPosition = targetPos;
// Show the scroll to minigame button
if (scrollToMinigameButton) scrollToMinigameButton.gameObject.SetActive(true);
_activeScrollCoroutine = null;
}
private void ApplyMinigameUnlockState()
{
if (_switchData == null)
return;
var data = SaveLoadManager.Instance?.currentSaveData;
string minigameName = _switchData.targetMinigameSceneName;
bool unlocked = data?.unlockedMinigames != null && !string.IsNullOrEmpty(minigameName) && data.unlockedMinigames.Contains(minigameName);
minigameButton.interactable = unlocked;
padlockIcon.SetActive(!unlocked);
// Show/hide padlock
if (padlockImage) padlockImage.gameObject.SetActive(!unlocked);
// Tint minigame icon if locked
if (minigameIconImage)
{
minigameIconImage.color = unlocked ? _originalMinigameIconColor : disabledTintColor;
}
// Enable/disable minigame confirm button
if (minigameConfirmButton)
{
minigameConfirmButton.interactable = unlocked;
}
}
private void OnSaveDataLoadedHandler(string slot)
{
ApplyMinigameUnlockStateIfAvailable();
ApplyMinigameUnlockState();
if (SaveLoadManager.Instance != null)
{
SaveLoadManager.Instance.OnLoadCompleted -= OnSaveDataLoadedHandler;

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
@@ -6,7 +7,7 @@ using UnityEngine.UI;
namespace Levels
{
/// <summary>
/// UI overlay for confirming a level switch. Displays level info and handles confirm/cancel actions, and supports leaderboard view.
/// UI overlay for confirming a level switch. Displays level info and handles confirm/cancel actions, and supports scrolling between level info and leaderboard.
/// </summary>
public class MinigameSwitchMenu : MonoBehaviour
{
@@ -15,14 +16,15 @@ namespace Levels
public TMP_Text levelNameText;
public Button confirmButton;
public Button cancelButton;
public Button leaderboardButton;
public GameObject levelInfoContainer;
public GameObject leaderboardContainer;
public Button leaderboardDismissButton;
public Button toLeaderboardButton;
public Button toLevelSelectButton;
public ScrollRect scrollView;
public float scrollDuration = 1f;
private Action _onLevelConfirm;
private Action _onCancel;
private LevelSwitchData _switchData;
private Coroutine _activeScrollCoroutine;
/// <summary>
/// Initialize the menu with data and callbacks.
@@ -36,18 +38,26 @@ namespace Levels
if (levelNameText) levelNameText.text = switchData?.targetLevelSceneName ?? "";
if (confirmButton) confirmButton.onClick.AddListener(OnConfirmClicked);
if (cancelButton) cancelButton.onClick.AddListener(OnCancelClicked);
if (leaderboardButton) leaderboardButton.onClick.AddListener(OnLeaderboardClicked);
if (leaderboardDismissButton) leaderboardDismissButton.onClick.AddListener(OnLeaderboardDismissClicked);
if (levelInfoContainer) levelInfoContainer.SetActive(true);
if (leaderboardContainer) leaderboardContainer.SetActive(false);
if (toLeaderboardButton) toLeaderboardButton.onClick.AddListener(OnToLeaderboardClicked);
if (toLevelSelectButton) toLevelSelectButton.onClick.AddListener(OnToLevelSelectClicked);
// Show only the toLeaderboardButton at start
if (toLeaderboardButton) toLeaderboardButton.gameObject.SetActive(true);
if (toLevelSelectButton) toLevelSelectButton.gameObject.SetActive(false);
// Initialize scroll view to start at left (level info view)
if (scrollView) scrollView.horizontalNormalizedPosition = 0f;
}
private void OnDestroy()
{
if (confirmButton) confirmButton.onClick.RemoveListener(OnConfirmClicked);
if (cancelButton) cancelButton.onClick.RemoveListener(OnCancelClicked);
if (leaderboardButton) leaderboardButton.onClick.RemoveListener(OnLeaderboardClicked);
if (leaderboardDismissButton) leaderboardDismissButton.onClick.RemoveListener(OnLeaderboardDismissClicked);
if (toLeaderboardButton) toLeaderboardButton.onClick.RemoveListener(OnToLeaderboardClicked);
if (toLevelSelectButton) toLevelSelectButton.onClick.RemoveListener(OnToLevelSelectClicked);
if (_activeScrollCoroutine != null)
{
StopCoroutine(_activeScrollCoroutine);
_activeScrollCoroutine = null;
}
}
private void OnConfirmClicked()
@@ -62,16 +72,60 @@ namespace Levels
Destroy(gameObject);
}
private void OnLeaderboardClicked()
private void OnToLeaderboardClicked()
{
if (levelInfoContainer) levelInfoContainer.SetActive(false);
if (leaderboardContainer) leaderboardContainer.SetActive(true);
if (_activeScrollCoroutine != null)
{
StopCoroutine(_activeScrollCoroutine);
}
_activeScrollCoroutine = StartCoroutine(ScrollToLeaderboardCoroutine());
}
private void OnLeaderboardDismissClicked()
private void OnToLevelSelectClicked()
{
if (levelInfoContainer) levelInfoContainer.SetActive(true);
if (leaderboardContainer) leaderboardContainer.SetActive(false);
if (_activeScrollCoroutine != null)
{
StopCoroutine(_activeScrollCoroutine);
}
_activeScrollCoroutine = StartCoroutine(ScrollToLevelSelectCoroutine());
}
private IEnumerator ScrollToLeaderboardCoroutine()
{
if (toLeaderboardButton) toLeaderboardButton.gameObject.SetActive(false);
float elapsed = 0f;
float startPos = scrollView.horizontalNormalizedPosition;
float targetPos = 0.95f;
while (elapsed < scrollDuration)
{
elapsed += Time.deltaTime;
float t = Mathf.Clamp01(elapsed / scrollDuration);
float smoothT = Mathf.SmoothStep(0f, 1f, t);
scrollView.horizontalNormalizedPosition = Mathf.Lerp(startPos, targetPos, smoothT);
yield return null;
}
scrollView.horizontalNormalizedPosition = targetPos;
if (toLevelSelectButton) toLevelSelectButton.gameObject.SetActive(true);
_activeScrollCoroutine = null;
}
private IEnumerator ScrollToLevelSelectCoroutine()
{
if (toLevelSelectButton) toLevelSelectButton.gameObject.SetActive(false);
float elapsed = 0f;
float startPos = scrollView.horizontalNormalizedPosition;
float targetPos = 0f;
while (elapsed < scrollDuration)
{
elapsed += Time.deltaTime;
float t = Mathf.Clamp01(elapsed / scrollDuration);
float smoothT = Mathf.SmoothStep(0f, 1f, t);
scrollView.horizontalNormalizedPosition = Mathf.Lerp(startPos, targetPos, smoothT);
yield return null;
}
scrollView.horizontalNormalizedPosition = targetPos;
if (toLeaderboardButton) toLeaderboardButton.gameObject.SetActive(true);
_activeScrollCoroutine = null;
}
}
}

View File

@@ -0,0 +1,94 @@
using AudioSourceEvents;
using System;
using System.Diagnostics.Tracing;
using UnityEditor.UI;
using UnityEngine;
using UnityEngine.Audio;
/// <summary>
/// We automatically add the AudioSource component here so we can control it. Do not add it manually!
/// </summary>
[RequireComponent(typeof(AudioSource))]
public class AppleAudioSource : MonoBehaviour
{
public enum AudioSourceType{CriticalVO,VO,Ambience,SFX,Music}
public AudioSourceType audioSourceType;
[HideInInspector] public AudioSource audioSource;
private AudioMixer _audioMixer;
[HideInInspector ] public int clipPriority;
public int sourcePriority;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
audioSource = GetComponent<AudioSource>();
AudioManager.Instance.RegisterNewAudioSource(this);
_audioMixer = AudioManager.Instance.audioMixer;
InitializeAudioSource();
audioSource.playOnAwake = false;
}
private void Awake()
{
Start();
}
public void InitializeAudioSource()
{
// Route the audio to the correct bus depending on type
switch (audioSourceType)
{
case AppleAudioSource.AudioSourceType.CriticalVO:
audioSource.outputAudioMixerGroup = _audioMixer.FindMatchingGroups("Critical VO")[0];
break;
case AppleAudioSource.AudioSourceType.VO:
audioSource.outputAudioMixerGroup = _audioMixer.FindMatchingGroups("Flavor VO")[0];
break;
case AppleAudioSource.AudioSourceType.SFX:
audioSource.outputAudioMixerGroup = _audioMixer.FindMatchingGroups("SFX")[0];
break;
case AppleAudioSource.AudioSourceType.Ambience:
audioSource.outputAudioMixerGroup = _audioMixer.FindMatchingGroups("Ambience")[0];
break;
case AppleAudioSource.AudioSourceType.Music:
audioSource.outputAudioMixerGroup = _audioMixer.FindMatchingGroups("Music")[0];
break;
}
}
public void Play(int requestedClipPriority)
{
clipPriority = requestedClipPriority;
if (audioSourceType == AudioSourceType.CriticalVO || audioSourceType == AudioSourceType.VO)
{
if (AudioManager.Instance.RequestPlayVO(this))
{
audioSource.Play();
}
else
{
Debug.Log("[AUDIOMANAGER] AppleAudioSource " + name + " was suppressed because something more important is playing");
}
}
else
{
audioSource.Play();
}
}
public void InterruptAudio(string nameOfInterruptingAudio)
{
Stop();
}
public void Stop()
{
clipPriority = 0;
audioSource.Stop();
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 242e6101be071f44fb14c3c12641c833

View File

@@ -1,16 +1,277 @@
using AppleHills.Core.Settings;
using Bootstrap;
using Core;
using PuzzleS;
using UnityEngine;
using UnityEngine.Audio;
using AppleHills.Core;
using AppleHills.Core.Interfaces;
using System.Collections.Generic;
using AudioSourceEvents;
using System;
public class AudioManager : MonoBehaviour
public class AudioManager : MonoBehaviour, IPausable
{
/// <summary>
/// Play all audio, just music or no audio at all when the game is paused.
/// </summary>
public enum PauseBehavior
{ PlayAllAudio, MusicOnly, NoAudio }
public PauseBehavior currentPauseBehavior;
public AudioMixer audioMixer;
private AudioListener _audioListener;
public AppleAudioSource currentlyPlayingVO;
private static AudioManager _instance;
private GameObject _player;
public List<AppleAudioSource> criticalVOSources;
public List<AppleAudioSource> VOSources;
public List<AppleAudioSource> musicSources;
public List<AppleAudioSource> ambienceSources;
public List<AppleAudioSource> SFXSources;
private IAudioEventSource _eventSource;
private bool wasInterrupted;
/// <summary>
/// Singleton instance of the AudioManager.
/// </summary>
public static AudioManager Instance => _instance;
void Awake()
{
_instance = this;
// Register for post-boot initialization
BootCompletionService.RegisterInitAction(InitializePostBoot);
GameManager.Instance.RegisterPausableComponent(this);
}
private void InitializePostBoot()
{
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
_player = QuickAccess.Instance.PlayerGameObject;
_audioListener = QuickAccess.Instance.MainCamera.GetComponent<AudioListener>();
foreach (AppleAudioSource _audioSource in criticalVOSources)
{
Debug.Log("Found source: " + _audioSource.name);
}
}
// Update is called once per frame
void Update()
public void SetAudioPauseBehavior(PauseBehavior newPauseBehavior)
{
switch (newPauseBehavior)
{
case PauseBehavior.PlayAllAudio:
audioMixer.updateMode = AudioMixerUpdateMode.UnscaledTime;
AudioListener.pause = false;
break;
case PauseBehavior.MusicOnly:
audioMixer.updateMode = AudioMixerUpdateMode.UnscaledTime; break;
//TODO: Pause all audio mixers except music mixer
case PauseBehavior.NoAudio:
audioMixer.updateMode = AudioMixerUpdateMode.Normal;
AudioListener.pause = true;
break;
}
}
public LevelAudioObject GetCurrentLevelAudioObject()
{
Debug.Log("Audio objects: " + FindObjectsByType<LevelAudioObject>(FindObjectsInactive.Include, FindObjectsSortMode.None).Length);
if (FindObjectsByType<LevelAudioObject>(FindObjectsInactive.Include, FindObjectsSortMode.None).Length > 1)
{
Debug.LogWarning("Warning! More than one LevelAudioObject in the level! Using the first one found");
return FindObjectsByType<LevelAudioObject>(FindObjectsInactive.Include, FindObjectsSortMode.None)[0];
}
if (FindObjectsByType<LevelAudioObject>(FindObjectsInactive.Include, FindObjectsSortMode.None).Length == 0)
{
Debug.LogWarning("Error! No LevelAudioObject found, AudioManager might not function properly!");
return null;
}
else
return FindFirstObjectByType<LevelAudioObject>();
}
public void Pause()
{
SetAudioPauseBehavior(PauseBehavior.NoAudio);
}
public void DoResume()
{
SetAudioPauseBehavior(PauseBehavior.PlayAllAudio);
}
public void RegisterNewAudioSource(AppleAudioSource newAudioSource)
{
switch (newAudioSource.audioSourceType)
{
case AppleAudioSource.AudioSourceType.CriticalVO:
criticalVOSources.Add(newAudioSource);
break;
case AppleAudioSource.AudioSourceType.VO:
VOSources.Add(newAudioSource);
break;
case AppleAudioSource.AudioSourceType.SFX:
SFXSources.Add(newAudioSource);
break;
case AppleAudioSource.AudioSourceType.Ambience:
ambienceSources.Add(newAudioSource);
break;
case AppleAudioSource.AudioSourceType.Music:
musicSources.Add(newAudioSource);
break;
}
}
/// <summary>
/// Request playing a VO line. Returns true if whatever is playing is not critical, or weight of requested VO line is lower.
/// </summary>
public bool RequestPlayVO(AppleAudioSource requestedAudioSource)
{
//Debug.Log($"[AUDIOMANAGER] CurrentVO source prio: {currentlyPlayingVO.sourcePriority}, clip prio: {currentlyPlayingVO.clipPriority} requested VO prio: {requestedAudioSource.sourcePriority}, clip prio: {clipPriority}");
// If nothing is playing, let the requested audio source play
if (currentlyPlayingVO == null)
{
SetupNewAudioSource(requestedAudioSource);
Debug.Log($"[AUDIOMANAGER] Playing {currentlyPlayingVO.name} as nothing is currently playing.");
return true;
}
// If the requested audio is not critical, and the currently playing audio is, tell the request to get bent
if (requestedAudioSource.audioSourceType == AppleAudioSource.AudioSourceType.VO && currentlyPlayingVO.audioSourceType == AppleAudioSource.AudioSourceType.CriticalVO)
{
return false;
}
// If the requested audio source is the same, interrupt and trigger it again
if (currentlyPlayingVO == requestedAudioSource)
{
InterruptAudioSource(requestedAudioSource);
SetupNewAudioSource(requestedAudioSource);
Debug.Log($"[AUDIOMANAGER] {currentlyPlayingVO.name} is the same as {requestedAudioSource.name}. Triggering it again.");
return true;
}
// if the currently playing audio source is not critical, interrupt it and play the requested audio source
if (currentlyPlayingVO.audioSourceType != AppleAudioSource.AudioSourceType.CriticalVO)
{
InterruptAudioSource(requestedAudioSource);
SetupNewAudioSource(requestedAudioSource);
Debug.Log($"[AUDIOMANAGER] {currentlyPlayingVO.name} is not critical. Playing {requestedAudioSource.name} instead because it is critical.");
return true;
}
// If the requested audio source has the same priority as currently playing source, check the priority of the requested clip
if (currentlyPlayingVO.audioSourceType == AppleAudioSource.AudioSourceType.CriticalVO && currentlyPlayingVO.sourcePriority == requestedAudioSource.sourcePriority)
{
if (currentlyPlayingVO.clipPriority > requestedAudioSource.clipPriority)
{
InterruptAudioSource(requestedAudioSource);
SetupNewAudioSource(requestedAudioSource);
Debug.Log($"[AUDIOMANAGER] Interrupted {currentlyPlayingVO.name} because it has same priority as {requestedAudioSource.name} but the requested clip has higher priority");
return true;
}
else
{
return false;
}
}
// If the requested audio source has higher priority than the currently playing source, interrupt the current source and let the requested one play
if (currentlyPlayingVO.audioSourceType == AppleAudioSource.AudioSourceType.CriticalVO && currentlyPlayingVO.sourcePriority > requestedAudioSource.sourcePriority)
{
currentlyPlayingVO.InterruptAudio(requestedAudioSource.name);
Debug.Log($"[AUDIOMANAGER] Interrupted {currentlyPlayingVO.name} because {requestedAudioSource.name} has higher priority");
InterruptAudioSource(requestedAudioSource);
SetupNewAudioSource(requestedAudioSource);
return true;
}
// If the requested audio source didn't clear any of the above cases, tell it to get rekt.
else
{
Debug.Log($"[AUDIOMANAGER] {currentlyPlayingVO.name} is still playing. {requestedAudioSource.name} has lower priority");
return false;
}
}
private void OnApplicationQuit()
{
// TODO: Release the handles safely ReleaseAllHandles();
}
private void SetupNewAudioSource(AppleAudioSource audioSource)
{
if (audioSource.audioSource.resource == null)
{
Debug.Log($"[AUDIOMANAGER] Faled to setup {audioSource.name}. Invalid resource");
}
else
{
currentlyPlayingVO = audioSource;
_eventSource = audioSource.audioSource.RequestEventHandlers();
_eventSource.AudioStopped += OnAudioStopped;
_eventSource.AudioStarted += OnAudioStarted;
}
}
private void OnAudioStopped(object sender, EventArgs e)
{
if (wasInterrupted)
{
ResetAudioSource();
}
else
{
currentlyPlayingVO = null;
ResetAudioSource();
}
}
private void OnAudioStarted(object sender, EventArgs e)
{
}
private void ResetAudioSource()
{
_eventSource.AudioStopped -= OnAudioStopped;
_eventSource.AudioStarted -= OnAudioStarted;
wasInterrupted = false;
}
private void InterruptAudioSource(AppleAudioSource newAudioSource)
{
wasInterrupted = true;
//currentlyPlayingVO.InterruptAudio(newAudioSource.name);
InterruptAllVOSources();
ResetAudioSource();
currentlyPlayingVO = newAudioSource;
}
private void InterruptAllVOSources()
{
foreach (AppleAudioSource source in criticalVOSources)
{
source.InterruptAudio("GlobalInterrupt");
}
foreach (AppleAudioSource source in VOSources)
{
source.InterruptAudio("GlobalInterrupt");
}
}
}

View File

@@ -8,8 +8,8 @@ using UnityEngine.Audio;
public class BushAudioController : MonoBehaviour
{
private IAudioEventSource _eventSource;
public AudioSource VOPlayer;
public AudioSource SFXPlayer;
public AppleAudioSource VOPlayer;
public AppleAudioSource SFXPlayer;
public AudioResource reactionClipToPlay;
public AudioResource flashSFXClipToPlay;
@@ -22,29 +22,30 @@ public class BushAudioController : MonoBehaviour
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
_eventSource = VOPlayer.RequestEventHandlers();
_eventSource = VOPlayer.audioSource.RequestEventHandlers();
_eventSource.AudioStopped += PlayBirdCounter;
}
public void PlayPhotoSoundBite()
{
VOPlayer.resource = reactionClipToPlay;
VOPlayer.Play();
VOPlayer.audioSource.resource = reactionClipToPlay;
VOPlayer.Play(1);
}
public void PlayFlashSound()
{
SFXPlayer.resource = flashSFXClipToPlay;
SFXPlayer.Play();
SFXPlayer.audioSource.resource = flashSFXClipToPlay;
SFXPlayer.Play(0);
}
private void PlayBirdCounter(object sender, EventArgs e)
{
VOPlayer.resource = birdCounterClip[birdGameStats.birdsFoundInLevel];
VOPlayer.Play();
birdGameStats.BirdFound();
_eventSource.AudioStopped -= PlayBirdCounter;
VOPlayer.audioSource.resource = birdCounterClip[birdGameStats.birdsFoundInLevel];
VOPlayer.Play(0);
birdGameStats.BirdFound();
}
public void OnDisable()

View File

@@ -7,8 +7,9 @@ using UnityEngine.Audio;
public class GardenerAudioController : MonoBehaviour
{
public AudioSource gardenerAudioPlayer;
public AudioSource mowerAudioPlayer;
public AppleAudioSource gardenerIdleAudioPlayer;
public AppleAudioSource gardenerRunningAudioPlayer;
public AppleAudioSource mowerAudioPlayer;
public AudioResource mowerStartAudio;
public AudioResource mowerLoopAudio;
public AudioResource gardenerFleeAudioClip;
@@ -23,15 +24,11 @@ public class GardenerAudioController : MonoBehaviour
{
}
void GardenerIsOnScreen()
{
Debug.Log("Gardener spotted!");
}
public void StartMowerSound()
{
mowerAudioPlayer.Play();
_eventSource = mowerAudioPlayer.RequestEventHandlers();
mowerAudioPlayer.Play(0);
_eventSource = mowerAudioPlayer.audioSource.RequestEventHandlers();
_eventSource.AudioStopped += PlayMowerLoop;
}
@@ -39,22 +36,22 @@ public class GardenerAudioController : MonoBehaviour
private void PlayMowerLoop(object sender, EventArgs e)
{
_eventSource.AudioStopped -= PlayMowerLoop;
mowerAudioPlayer.resource = mowerLoopAudio;
mowerAudioPlayer.loop = true;
mowerAudioPlayer.Play();
mowerAudioPlayer.audioSource.resource = mowerLoopAudio;
mowerAudioPlayer.audioSource.loop = true;
mowerAudioPlayer.Play(0);
}
public void PlayGardenerVOClip(bool fleeing)
{
if (gardenerAudioPlayer.isPlaying) { return; }
if (gardenerRunningAudioPlayer.audioSource.isPlaying) { return; }
if (fleeing) {
gardenerAudioPlayer.resource = gardenerFleeAudioClip;
gardenerAudioPlayer.Play();
gardenerRunningAudioPlayer.audioSource.resource = gardenerFleeAudioClip;
gardenerRunningAudioPlayer.Play(1);
}
if (!fleeing)
{
gardenerAudioPlayer.resource = gardenerChaseAudioClip;
gardenerAudioPlayer.Play();
gardenerRunningAudioPlayer.audioSource.resource = gardenerChaseAudioClip;
gardenerRunningAudioPlayer.Play(1);
}

View File

@@ -0,0 +1,22 @@
using UnityEngine;
using UnityEngine.Audio;
using System;
public class LevelAudioObject : MonoBehaviour
{
public AppleAudioSource narratorAudioSource;
public AudioResource firstNarration;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
PlayNarrationAudio();
}
void PlayNarrationAudio()
{
narratorAudioSource.audioSource.resource = firstNarration;
narratorAudioSource.Play(0);
}
}

View File

@@ -1,31 +0,0 @@
using UnityEngine;
using UnityEngine.Audio;
using System;
using UnityEngine.Events;
public class NarratorVO : MonoBehaviour
{
public AudioSource narratorAudioSource;
public AudioResource firstNarration;
public UnityEvent narrationFinished;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
PlayNarrationAudio();
}
void PlayNarrationAudio()
{
narratorAudioSource.resource = firstNarration;
narratorAudioSource.Play();
}
private void NarrationFinished(object sender, EventArgs e)
{
narrationFinished.Invoke();
}
}

View File

@@ -9,7 +9,8 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 1817619063130555080}
- component: {fileID: 2652043308892028149}
- component: {fileID: 7011897926976640219}
- component: {fileID: 2868668640744225356}
m_Layer: 0
m_Name: LakeAmbience
m_TagString: Untagged
@@ -32,7 +33,7 @@ Transform:
m_Children: []
m_Father: {fileID: 2873907538289469479}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!82 &2652043308892028149
--- !u!82 &7011897926976640219
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -129,6 +130,21 @@ AudioSource:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!114 &2868668640744225356
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1142003717250661430}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 242e6101be071f44fb14c3c12641c833, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::AppleAudioSource
audioSourceType: 2
audioSource: {fileID: 0}
priority: 0
--- !u!1 &5928208945904495084
GameObject:
m_ObjectHideFlags: 0
@@ -138,7 +154,8 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 4121215864022656322}
- component: {fileID: 4192226596753188864}
- component: {fileID: 4697053756786608239}
- component: {fileID: 3633366175640516686}
m_Layer: 0
m_Name: AmbiencePlayer
m_TagString: Untagged
@@ -161,7 +178,7 @@ Transform:
m_Children: []
m_Father: {fileID: 2873907538289469479}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!82 &4192226596753188864
--- !u!82 &4697053756786608239
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -258,6 +275,21 @@ AudioSource:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!114 &3633366175640516686
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5928208945904495084}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 242e6101be071f44fb14c3c12641c833, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::AppleAudioSource
audioSourceType: 2
audioSource: {fileID: 0}
priority: 0
--- !u!1 &6199677512542707633
GameObject:
m_ObjectHideFlags: 0
@@ -268,7 +300,6 @@ GameObject:
m_Component:
- component: {fileID: 2873907538289469479}
- component: {fileID: 8545106365577783398}
- component: {fileID: 7585931024614860467}
m_Layer: 0
m_Name: QuarryAudio
m_TagString: Untagged
@@ -306,24 +337,57 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: cb5c6632b7606ce43a0b2dbf11215dc8, type: 3}
m_Name:
m_EditorClassIdentifier: '::'
narratorAudioSource: {fileID: 9091997474527205907}
narratorAudioSource: {fileID: 4188190597242138317}
firstNarration: {fileID: 8300000, guid: d0a13dd948bacda48be267eec3e0b080, type: 3}
narrationFinished:
m_PersistentCalls:
m_Calls: []
--- !u!82 &7585931024614860467
--- !u!1 &6350035581257276269
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2279651898552875333}
- component: {fileID: 7536581660526894160}
- component: {fileID: 4188190597242138317}
m_Layer: 0
m_Name: Narrator1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2279651898552875333
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6350035581257276269}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -21.218311, y: -13.261439, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2873907538289469479}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!82 &7536581660526894160
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6199677512542707633}
m_GameObject: {fileID: 6350035581257276269}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
OutputAudioMixerGroup: {fileID: -281949353495416486, guid: 727a7e4b6df4b0d47897f7d8ee7fa323, type: 2}
m_audioClip: {fileID: 0}
m_Resource: {fileID: 0}
m_PlayOnAwake: 1
m_PlayOnAwake: 0
m_Volume: 1
m_Pitch: 1
Loop: 0
@@ -408,132 +472,18 @@ AudioSource:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!1 &6350035581257276269
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2279651898552875333}
- component: {fileID: 9091997474527205907}
m_Layer: 0
m_Name: Narrator1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2279651898552875333
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6350035581257276269}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -21.218311, y: -13.261439, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2873907538289469479}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!82 &9091997474527205907
AudioSource:
--- !u!114 &4188190597242138317
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6350035581257276269}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 3533147658878909314, guid: 727a7e4b6df4b0d47897f7d8ee7fa323, type: 2}
m_audioClip: {fileID: 0}
m_Resource: {fileID: 0}
m_PlayOnAwake: 0
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 0
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 242e6101be071f44fb14c3c12641c833, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::AppleAudioSource
audioSourceType: 0
audioSource: {fileID: 0}
priority: 1

View File

@@ -0,0 +1,44 @@
# Apple Hills Audio Manager
This document describes the classes and functionality of the AudioManager, LevelAudioObject and AppleAudioSource classes and components.
# AudioManager
The AudioManager is loaded through the bootstrap framework and will be added to every single level and minigame automatically.
It implements our Singletong framework and you can call functionality on the manager from any script in the project using:
```
AudioManager.Instance.WhatEverFunctionYouDesire();
```
## General overview
Everything that makes a sound should add the `AppleAudioSource` component. This component automatically adds Unity's own AudioSource that handles playing audio, but wraps it in our own custom class enabling more control over the game's audio assets.
All `AppleAudioSource` assets registers themselves with the `AudioManager` Singleton class that gets loaded in all levels allowing us to control all audio sources without fiddling with every single gameobject that makes sound.
All `AppleAudioSource` assets routes their audio to the AudioMixer which allows us to change the volume on categories of sounds i.e. ambience, music, sound etc. seperately. The AudioMixer also allows us to add effects to every category of sounds seperately and has a Master bus to control the general volume of all sound effects in the game.
## AudioManager component
![The AudioManager Component.](media/audiomanager_component.png)
The AudioManager component requires only one reference to function: The AudioMixer asset that handles all audio routing and volume mixing of the project.
### AudioManager options
The AudioManager only has one available option which is how it should handle audio when the game is paused.
**No Audio** pauses all audio sources when Pause is called on the GameManager.
**Play All Audio** ignores Pause completely by using `UnscaledTime`.
**MusicOnly** is still TODO and not fully implemented, but it also sets the mixer to work on `UnscaledTime` and we just need pause all other audio sources when Pause is called on the GameManager.
### AudioMixer
![The AudioMixer asset controlling all volumes.](media/audiomixer.png)
All AppleAudioSources outputs their audio to the `AppleHillsAudioMix` asset which handles the final volume of all audio sources of the game.
This allows us to expose volume sliders to options, and to tweak the volume of each sound source seperately, add effects like limiters, compressors etc.
**Ambience** is for the atmospheric background audio. Wind in the trees, bird chirps, water burbles etc. Outputs audio to the Master channel.
**SFX** is for smacks, whooshes, and other sound effects. Outputs audio to the Master channel.
**Music** is for.. music.. Outputs audio to the Master channel.
**Voice Over** is the accumulated audio of critical voice-over and flavor VO. Outputs audio to the Master channel.
**Critical VO** is all voice-over that guides the player and is considered more important to hear than everything else in the game. Outputs audio the the Voice Over channel.
**Flavor VO** is voice-over used for jokes, screams etc. and which is considered less important to hear than critical VO. Outputs audio to the Voice Over channel.
```
Some code
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
docs/media/audiomixer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB