Compare commits
16 Commits
6ece49bb28
...
audio-over
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d0da5d76cd | ||
|
|
d48b459fea | ||
|
|
2b41a9f200 | ||
|
|
e81879959e | ||
|
|
64da60dadd | ||
| 9396bb76b4 | |||
|
|
f6ebadf21e | ||
|
|
eeca4973ae | ||
| 988bc53ec8 | |||
|
|
a020e9af04 | ||
| 3cd2466fbb | |||
| f7ee3a979a | |||
| 4e12e4f8c1 | |||
| bf0a37fe2e | |||
| 1a04e82920 | |||
| 86bee75578 |
@@ -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
|
||||
|
||||
8
Assets/Art/Sprites/DRIcons.meta
Normal file
8
Assets/Art/Sprites/DRIcons.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5f6f72f272957b4439cbaf4e18106470
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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}
|
||||
|
||||
550
Assets/Editor/Tools/ComponentSearchReplaceWindow.cs
Normal file
550
Assets/Editor/Tools/ComponentSearchReplaceWindow.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Editor/Tools/ComponentSearchReplaceWindow.cs.meta
Normal file
3
Assets/Editor/Tools/ComponentSearchReplaceWindow.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 604b18a354fa44a49723ab9f9173762e
|
||||
timeCreated: 1761816008
|
||||
BIN
Assets/External/Placeholders/applehills_kort.png
vendored
Normal file
BIN
Assets/External/Placeholders/applehills_kort.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
195
Assets/External/Placeholders/applehills_kort.png.meta
vendored
Normal file
195
Assets/External/Placeholders/applehills_kort.png.meta
vendored
Normal 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:
|
||||
BIN
Assets/External/Placeholders/power_off.png
vendored
Normal file
BIN
Assets/External/Placeholders/power_off.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
195
Assets/External/Placeholders/power_off.png.meta
vendored
Normal file
195
Assets/External/Placeholders/power_off.png.meta
vendored
Normal 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:
|
||||
BIN
Assets/External/Placeholders/refresh-arrow.png
vendored
Normal file
BIN
Assets/External/Placeholders/refresh-arrow.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
195
Assets/External/Placeholders/refresh-arrow.png.meta
vendored
Normal file
195
Assets/External/Placeholders/refresh-arrow.png.meta
vendored
Normal 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:
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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: []
|
||||
@@ -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:
|
||||
|
||||
@@ -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
@@ -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: []
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
94
Assets/Scripts/Sound/AppleAudioSource.cs
Normal file
94
Assets/Scripts/Sound/AppleAudioSource.cs
Normal 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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
2
Assets/Scripts/Sound/AppleAudioSource.cs.meta
Normal file
2
Assets/Scripts/Sound/AppleAudioSource.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 242e6101be071f44fb14c3c12641c833
|
||||
@@ -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");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
22
Assets/Scripts/Sound/LevelAudioObject.cs
Normal file
22
Assets/Scripts/Sound/LevelAudioObject.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
44
docs/audiomanager_readme.md
Normal file
44
docs/audiomanager_readme.md
Normal 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 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
|
||||

|
||||
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
|
||||
```
|
||||
BIN
docs/media/audiomanager_component.png
Normal file
BIN
docs/media/audiomanager_component.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/media/audiomixer.png
Normal file
BIN
docs/media/audiomixer.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
Reference in New Issue
Block a user