浏览代码

Updated Gameplay Ingredients

/main
Thomas ICHÉ 5 年前
当前提交
8cc356ac
共有 163 个文件被更改,包括 2477 次插入269 次删除
  1. 4
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/Discover/DiscoverAsset.cs
  2. 10
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/Discover/DiscoverEditor.cs
  3. 16
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/Discover/DiscoverWindow.cs
  4. 36
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/FindAndReplace/FindAndReplaceWindow.cs
  5. 2
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/GameViewLink/LinkGameView.cs
  6. 3
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/GameplayIngredients-Editor.asmdef
  7. 20
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/HiearchyItems.cs
  8. 38
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/HierarchyHints/HierarchyHints.cs
  9. 5
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/MenuItems.cs
  10. 4
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/NewSceneWindow/NewSceneWindow.cs
  11. 4
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/PropertyDrawers/CallablePropertyDrawer.cs
  12. 31
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/PropertyDrawers/TypeDropDownPropertyDrawer.cs
  13. 332
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/SelectionHistory/SelectionHistoryWindow.cs
  14. 2
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/WelcomeScreen/WelcomeScreen.cs
  15. 2
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/CodeGeneration/CodeGenerator.cs
  16. 2
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/CodeGeneration/PropertyDrawerDatabase.cs
  17. 17
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/Editors/InspectorEditor.cs
  18. 11
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/ReorderableListPropertyDrawer.cs
  19. 29
      LocalPackages/net.peeweek.gameplay-ingredients/README.md
  20. 21
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Controllers/FirstPersonController.cs
  21. 2
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Discover/Discover.cs
  22. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/GameplayIngredients.asmdef
  23. 66
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Factory/Factory.cs
  24. 29
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Rigs/ReachPositionRig.cs
  25. 7
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/StateMachine/State.cs
  26. 20
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/StateMachine/StateMachine.cs
  27. 4
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/ApplicationExitAction.cs
  28. 7
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/CycleResolutionsAction.cs
  29. 12
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/GameSaveSetValueAction.cs
  30. 2
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/SendMessageAction.cs
  31. 13
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/ToggleGameObjectAction.cs
  32. 6
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Callable.cs
  33. 9
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Events/EventBase.cs
  34. 4
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Events/OnGameManagerLevelStart.cs
  35. 5
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Events/OnMessageEvent.cs
  36. 1
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Events/OnTriggerEvent.cs
  37. 5
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Logic/EditorOnlyLogic.cs
  38. 3
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Logic/SetInstigatorFromFactoryLogic.cs
  39. 37
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Managers/Implementations/GameManager.cs
  40. 5
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Managers/Manager.cs
  41. 6
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Managers/Messager/Messager.cs
  42. 3
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Managers/Messager/Playables/SendMessage/SendMessageBehaviour.cs
  43. 10
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Settings/GameplayIngredientsSettings.cs
  44. 9
      LocalPackages/net.peeweek.gameplay-ingredients/package.json
  45. 150
      LocalPackages/net.peeweek.gameplay-ingredients/CHANGELOG.md
  46. 7
      LocalPackages/net.peeweek.gameplay-ingredients/CHANGELOG.md.meta
  47. 172
      LocalPackages/net.peeweek.gameplay-ingredients/Documentation~/Images/PoweredByGameplayIngredients.afdesign
  48. 2
      LocalPackages/net.peeweek.gameplay-ingredients/Documentation~/Images/bg-source.txt
  49. 8
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/CallTree.meta
  50. 8
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/CustomInspectors.meta
  51. 8
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/GlobalsDebugWindow.meta
  52. 29
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/PropertyDrawers/BehaviourTogglePropertyDrawer.cs
  53. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Editor/PropertyDrawers/BehaviourTogglePropertyDrawer.cs.meta
  54. 5
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Actions/ic-action-generic.png
  55. 110
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Actions/ic-action-generic.png.meta
  56. 7
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Actions/ic-action-rigidbody.png
  57. 103
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Actions/ic-action-rigidbody.png.meta
  58. 4
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Events/ic-event-generic.png
  59. 115
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Events/ic-event-generic.png.meta
  60. 47
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Misc/ic-callable.png
  61. 115
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Misc/ic-callable.png.meta
  62. 8
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Misc/ic-timer.png
  63. 91
      LocalPackages/net.peeweek.gameplay-ingredients/Icons/Misc/ic-timer.png.meta
  64. 18
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/DrawerAttributes/LabelAttribute.cs
  65. 11
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/DrawerAttributes/LabelAttribute.cs.meta
  66. 12
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs
  67. 11
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs.meta
  68. 12
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef
  69. 7
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef.meta
  70. 16
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef
  71. 7
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef.meta
  72. 16
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/LabelPropertyDrawer.cs
  73. 11
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/LabelPropertyDrawer.cs.meta
  74. 56
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs
  75. 11
      LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta
  76. 50
      LocalPackages/net.peeweek.gameplay-ingredients/Resources/Default_ScreenshotManager.prefab
  77. 7
      LocalPackages/net.peeweek.gameplay-ingredients/Resources/Default_ScreenshotManager.prefab.meta
  78. 31
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/GameObjectExtensions.cs
  79. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/GameObjectExtensions.cs.meta
  80. 27
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Folder.cs
  81. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Folder.cs.meta
  82. 128
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Rigs/RigidBodyForceRig.cs
  83. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Rigs/RigidBodyForceRig.cs.meta
  84. 8
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Timer.meta
  85. 20
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/AudioMixSnapshotAction.cs
  86. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/AudioMixSnapshotAction.cs.meta
  87. 84
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/RigidbodyAction.cs
  88. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/RigidbodyAction.cs.meta
  89. 55
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/SetAnimatorParameterAction.cs
  90. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/SetAnimatorParameterAction.cs.meta
  91. 52
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/ToggleBehaviourAction.cs
  92. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/ToggleBehaviourAction.cs.meta
  93. 17
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/VFXSendEventAction.cs
  94. 11
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/VFXSendEventAction.cs.meta
  95. 126
      LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/VFXSetPropertyAction.cs

4
LocalPackages/net.peeweek.gameplay-ingredients/Editor/Discover/DiscoverAsset.cs


public string Title;
[Multiline]
public string Description;
public EditorSceneSetup SceneSetup;
public SceneAsset SingleScene;
public EditorSceneSetup[] SceneSetups;
public SceneAsset[] SingleScenes;
}
}

10
LocalPackages/net.peeweek.gameplay-ingredients/Editor/Discover/DiscoverEditor.cs


{
using (new GUILayout.HorizontalScope())
{
if (GUILayout.Button("Align Discover to View"))
{
var transform = (serializedObject.targetObject as Discover).gameObject.transform;
var svTransform = SceneView.lastActiveSceneView.camera.transform;
transform.position = svTransform.position;
transform.rotation = svTransform.rotation;
transform.localScale = Vector3.one;
}
GUILayout.FlexibleSpace();
editing = GUILayout.Toggle(editing, "Edit", EditorStyles.miniButton, GUILayout.Width(48));
}

16
LocalPackages/net.peeweek.gameplay-ingredients/Editor/Discover/DiscoverWindow.cs


{
GUILayout.FlexibleSpace();
if (map.SceneSetup != null && GUILayout.Button($"Open {map.SceneSetup.name}"))
if (map.SceneSetups != null)
LoadSceneSetup(map.SceneSetup);
foreach(var sceneSetup in map.SceneSetups)
{
if (sceneSetup != null && GUILayout.Button($"Open {sceneSetup.name}"))
LoadSceneSetup(sceneSetup);
}
else if(map.SingleScene != null && GUILayout.Button($"Open {map.SingleScene.name}"))
if(map.SingleScenes != null)
LoadSingleScene(map.SingleScene);
foreach(var singleScene in map.SingleScenes)
{
if (singleScene != null && GUILayout.Button($"Open {singleScene.name}"))
LoadSingleScene(singleScene);
}
}
}

36
LocalPackages/net.peeweek.gameplay-ingredients/Editor/FindAndReplace/FindAndReplaceWindow.cs


Layer,
Mesh,
Material,
Selection
}
private void OnEnable()

Mesh meshSearch;
[SerializeField]
Material materialSearch;
[SerializeField]
bool selectionRecurse = false;
[SerializeField]
bool keepPosition = true;

EditorGUIUtility.labelWidth = 120;
GUILayout.Space(4);
GUILayout.Label("Search Scene Objects", Styles.boldLabel);
searchBy = (SearchBy)EditorGUILayout.EnumPopup(Contents.searchBy, searchBy);
searchBy = (SearchBy)EditorGUILayout.EnumPopup(Contents.criteria, searchBy);
switch (searchBy)
{
case SearchBy.Name:

materialSearch = (Material)EditorGUILayout.ObjectField(Contents.materialSearch, materialSearch, typeof(Material), true);
SearchButtonsGUI(searchBy, materialSearch);
break;
case SearchBy.Selection:
selectionRecurse = EditorGUILayout.Toggle(Contents.selectionRecurse, selectionRecurse);
SearchButtonsGUI(searchBy, selectionRecurse);
break;
}

}
EditorGUI.BeginDisabledGroup(prefabReplacement == null);
GUILayout.Label("Keep Properties:");
GUILayout.Label("Keep Properties from Original:");
using (new GUILayout.HorizontalScope())
{

}
}
break;
case SearchBy.Selection:
foreach(var selected in Selection.gameObjects)
{
bool recurse = (bool)criteria;
if(!recurse)
query.Add(selected);
else
query.AddRange(selected.GetAllChildren());
}
break;
}
switch (op)

{
GUILayout.Label("Search Results", Styles.boldLabel);
GUILayout.FlexibleSpace();
if(GUILayout.Button("From Selection", GUILayout.Height(24)))
if(GUILayout.Button("Select in Scene", GUILayout.Height(24)))
searchResults = Selection.gameObjects.ToList();
Selection.objects = searchResults.ToArray();
if(GUILayout.Button("Select", GUILayout.Height(24)))
if(GUILayout.Button("Clear", GUILayout.Height(24)))
Selection.objects = searchResults.ToArray();
searchResults.Clear();
}
}

static class Contents
{
public static GUIContent title = new GUIContent("Find and Replace", (Texture)EditorGUIUtility.LoadRequired("ViewToolZoom On"));
public static GUIContent searchBy = new GUIContent("Search by");
public static GUIContent criteria = new GUIContent("Criteria");
public static GUIContent nameSearch = new GUIContent("GameObject Name");
public static GUIContent tagSearch = new GUIContent("Tag");
public static GUIContent layerSearch = new GUIContent("Layer");

public static GUIContent selectionRecurse = new GUIContent("Include Children");
public static GUIContent prefabReplacement = new GUIContent("Prefab Replacement");
}

2
LocalPackages/net.peeweek.gameplay-ingredients/Editor/GameViewLink/LinkGameView.cs


}
// If we have a VirtualCameraManager, manage its state here
if(Application.isPlaying && Manager.Get<VirtualCameraManager>() != null)
if(Application.isPlaying && Manager.Has<VirtualCameraManager>())
{
var camera = Manager.Get<VirtualCameraManager>().gameObject;

3
LocalPackages/net.peeweek.gameplay-ingredients/Editor/GameplayIngredients-Editor.asmdef


{
"name": "GameplayIngredients-Editor",
"references": [
"NaughtyAttributes",
"NaughtyAttributes.Core",
"NaughtyAttributes>Editor",
"GameplayIngredients",
"Unity.ugui",
"Unity.Timeline"

20
LocalPackages/net.peeweek.gameplay-ingredients/Editor/HiearchyItems.cs


{
#region TRIGGERS
[MenuItem("GameObject/GameplayIngredients/Events/Trigger (Box)", false, 10)]
[MenuItem("GameObject/Gameplay Ingredients/Events/Trigger (Box)", false, 10)]
static void CreateTriggerBox()
{
var go = new GameObject();

go.transform.parent = Selection.activeGameObject.transform;
}
[MenuItem("GameObject/GameplayIngredients/Events/Trigger (Sphere)", false, 10)]
[MenuItem("GameObject/Gameplay Ingredients/Events/Trigger (Sphere)", false, 10)]
static void CreateTriggerSphere()
{
var go = new GameObject();

go.transform.parent = Selection.activeGameObject.transform;
}
[MenuItem("GameObject/GameplayIngredients/Events/Trigger (Capsule)", false, 10)]
[MenuItem("GameObject/Gameplay Ingredients/Events/Trigger (Capsule)", false, 10)]
static void CreateTriggerCapsule()
{
var go = new GameObject();

go.transform.parent = Selection.activeGameObject.transform;
}
[MenuItem("GameObject/GameplayIngredients/Events/On Awake", false, 10)]
[MenuItem("GameObject/Gameplay Ingredients/Events/On Awake", false, 10)]
static void CreateOnAwake()
{
var go = new GameObject();

go.transform.parent = Selection.activeGameObject.transform;
}
[MenuItem("GameObject/GameplayIngredients/Events/On Enable/Disable", false, 10)]
[MenuItem("GameObject/Gameplay Ingredients/Events/On Enable", false, 10)]
static void CreateOnEnableDisable()
{
var go = new GameObject();

go.transform.parent = Selection.activeGameObject.transform;
}
[MenuItem("GameObject/Gameplay Ingredients/Events/On Start", false, 10)]
static void CreateOnStart()
{
var go = new GameObject();
var evt = go.AddComponent<Events.OnStartEvent>();
go.name = "On Start";
if (Selection.activeGameObject != null)
go.transform.parent = Selection.activeGameObject.transform;
}
#endregion
}

38
LocalPackages/net.peeweek.gameplay-ingredients/Editor/HierarchyHints/HierarchyHints.cs


static Dictionary<Type, string> s_Definitions = new Dictionary<Type, string>()
{
{ typeof(Folder), "Folder Icon"},
{ typeof(MonoBehaviour), "cs Script Icon"},
{ typeof(Camera), "Camera Icon"},
{ typeof(MeshRenderer), "MeshRenderer Icon"},

if (o == null) return;
var c = GUI.color;
if (o.isStatic)
{
GUI.Label(fullRect, " S");
EditorGUI.DrawRect(fullRect, Colors.dimGray);
}
bool isFolder = o.GetComponent<Folder>() != null;
foreach(var type in s_Definitions.Keys)
if(isFolder)
if (o.GetComponents(type).Length > 0) selectionRect = DrawIcon(selectionRect, Contents.GetContent(type), Color.white);
fullRect.xMin += 28 + 14 * GetObjectDepth(o.transform);
fullRect.width = 16;
EditorGUI.DrawRect(fullRect, EditorGUIUtility.isProSkin? Styles.proBackground : Styles.personalBackground);
DrawIcon(fullRect, Contents.GetContent(typeof(Folder)), o.GetComponent<Folder>().Color);
else
{
if (o.isStatic)
{
GUI.Label(fullRect, " S");
EditorGUI.DrawRect(fullRect, Colors.dimGray);
}
foreach (var type in s_Definitions.Keys)
{
if (o.GetComponents(type).Length > 0) selectionRect = DrawIcon(selectionRect, Contents.GetContent(type), Color.white);
}
}
}
static int GetObjectDepth(Transform t, int depth=0)
{
if (t.parent == null)
return depth;
else
return GetObjectDepth(t.parent, depth + 1);
}

{
public static GUIStyle rightLabel;
public static GUIStyle icon;
public static Color proBackground = new Color(0.25f, 0.25f, 0.25f, 1.0f);
public static Color personalBackground = new Color(0.75f, 0.75f, 0.75f, 1.0f);
static Styles()
{

5
LocalPackages/net.peeweek.gameplay-ingredients/Editor/MenuItems.cs


{
public static class MenuItems
{
const int kPlayMenuPriority = 160;
const int kMenuPriority = 330;
public const int kWindowMenuPriority = 100;
public const int kPlayMenuPriority = 160;
public const int kMenuPriority = 330;
#region PLAY HERE

4
LocalPackages/net.peeweek.gameplay-ingredients/Editor/NewSceneWindow/NewSceneWindow.cs


DrawTemplateList();
}
GUILayout.Space(4);
templateDetailsScroll = EditorGUILayout.BeginScrollView(templateDetailsScroll);
EditorGUILayout.EndScrollView();
GUILayout.Space(4);
}
using (new GUILayout.HorizontalScope())

GUILayout.FlexibleSpace();
GUILayout.EndScrollView();
}
Vector2 templateDetailsScroll;
void DrawTemplateDetails()
{

4
LocalPackages/net.peeweek.gameplay-ingredients/Editor/PropertyDrawers/CallablePropertyDrawer.cs


{
property.objectReferenceValue = setNextObjectValue;
setNextObjectValue = null;
if(CallTreeWindow.visible)
{
CallTreeWindow.Refresh();
}
}
if(property.objectReferenceValue == null)

31
LocalPackages/net.peeweek.gameplay-ingredients/Editor/PropertyDrawers/TypeDropDownPropertyDrawer.cs


{
Dictionary<string, List<string>> m_AssignableTypeNames;
Type type;
Type type = ((TypeDropDownAttribute)attribute).m_BaseType;
if(type == null)
type = ((TypeDropDownAttribute)attribute).m_BaseType;
EditorGUI.BeginChangeCheck();
if(GUI.changed && index != newVal)
if(EditorGUI.EndChangeCheck() && index != newVal)
{
property.stringValue = m_AssignableTypeNames[TypeName][newVal];
}

{
if (m_AssignableTypeNames == null)
{
string key = baseType.FullName;
string key = baseType.FullName;
if (!m_AssignableTypeNames.ContainsKey(key))
m_AssignableTypeNames.Add(key, new List<string>());
if (!m_AssignableTypeNames.ContainsKey(key))
m_AssignableTypeNames.Add(key, new List<string>());
foreach(var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
foreach(var type in assembly.GetTypes())
foreach(var assembly in AppDomain.CurrentDomain.GetAssemblies())
if(baseType.IsAssignableFrom(type) && !type.IsAbstract)
foreach(var type in assembly.GetTypes())
m_AssignableTypeNames[key].Add(type.Name);
if(baseType.IsAssignableFrom(type) && !type.IsAbstract)
{
m_AssignableTypeNames[key].Add(type.Name);
}
}
}
}

332
LocalPackages/net.peeweek.gameplay-ingredients/Editor/SelectionHistory/SelectionHistoryWindow.cs


using System.Reflection;
using UnityEngine;
using UnityEditor;
public class SelectionHistoryWindow : EditorWindow
namespace GameplayIngredients.Editor
[MenuItem("Window/Selection History")]
public static void OpenSelectionHistoryWindow()
public class SelectionHistoryWindow : EditorWindow
EditorWindow.GetWindow<SelectionHistoryWindow>();
}
Vector2 scrollPos = Vector2.zero;
void OnGUI()
{
titleContent = Contents.title;
scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
[MenuItem("Window/General/Selection History")]
public static void OpenSelectionHistoryWindow()
Selection_OnGUI();
EditorWindow.GetWindow<SelectionHistoryWindow>();
EditorGUILayout.EndScrollView();
}
void OnEnable()
{
lockedObjects = null;
selectionHistory = null;
}
Vector2 scrollPos = Vector2.zero;
void OnDisable()
{
lockedObjects = null;
selectionHistory = null;
}
void OnGUI()
{
titleContent = Contents.title;
List<GameObject> selectionHistory;
List<GameObject> lockedObjects;
scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
{
Selection_OnGUI();
}
EditorGUILayout.EndScrollView();
}
int maxHistoryCount = 32;
bool ignoreNextSelection = false;
void OnEnable()
{
lockedObjects = null;
selectionHistory = null;
}
void OnSelectionChange()
{
if (ignoreNextSelection)
void OnDisable()
ignoreNextSelection = false;
return;
lockedObjects = null;
selectionHistory = null;
if (selectionHistory == null) selectionHistory = new List<GameObject>();
if (lockedObjects == null) lockedObjects = new List<GameObject>();
List<GameObject> selectionHistory;
List<GameObject> lockedObjects;
int maxHistoryCount = 32;
bool ignoreNextSelection = false;
if (Selection.activeGameObject != null || Selection.gameObjects.Length > 0)
void OnSelectionChange()
foreach(var go in Selection.gameObjects)
if (ignoreNextSelection)
if (!selectionHistory.Contains(go))
selectionHistory.Add(go);
ignoreNextSelection = false;
return;
if (selectionHistory.Count > maxHistoryCount)
selectionHistory.Take(maxHistoryCount);
if (selectionHistory == null) selectionHistory = new List<GameObject>();
if (lockedObjects == null) lockedObjects = new List<GameObject>();
Repaint();
}
if (Selection.activeGameObject != null || Selection.gameObjects.Length > 0)
{
}
foreach(var go in Selection.gameObjects)
{
if (!selectionHistory.Contains(go))
selectionHistory.Add(go);
}
public bool CompareArray(GameObject[] a, GameObject[] b)
{
return a.SequenceEqual(b);
}
if (selectionHistory.Count > maxHistoryCount)
selectionHistory.Take(maxHistoryCount);
void Selection_OnGUI()
{
if (selectionHistory == null) selectionHistory = new List<GameObject>();
if (lockedObjects == null) lockedObjects = new List<GameObject>();
int i = 0;
int toRemove = -1;
Repaint();
}
if (lockedObjects.Count > 0)
}
public bool CompareArray(GameObject[] a, GameObject[] b)
GUILayout.Label("Favorites", EditorStyles.boldLabel);
i = 0;
toRemove = -1;
foreach (var obj in lockedObjects)
return a.SequenceEqual(b);
}
void Selection_OnGUI()
{
if (selectionHistory == null) selectionHistory = new List<GameObject>();
if (lockedObjects == null) lockedObjects = new List<GameObject>();
int i = 0;
int toRemove = -1;
if (lockedObjects.Count > 0)
if (obj == null)
GUILayout.Label("Favorites", EditorStyles.boldLabel);
i = 0;
toRemove = -1;
foreach (var obj in lockedObjects)
using (new EditorGUILayout.HorizontalScope())
if (obj == null)
GUILayout.Label("(object is either null or has been deleted)");
if (GUILayout.Button("X", GUILayout.Width(24)))
using (new EditorGUILayout.HorizontalScope())
toRemove = i;
GUILayout.Label("(object is either null or has been deleted)");
if (GUILayout.Button("X", GUILayout.Width(24)))
{
toRemove = i;
}
else
{
bool highlight = Selection.gameObjects.Contains(obj);
Color backup = GUI.color;
if (highlight)
GUI.color = Styles.highlightColor;
using (new EditorGUILayout.HorizontalScope())
{
var b = GUI.color;
GUI.color = Color.yellow * 3;
if (GUILayout.Button(Contents.star, Styles.icon, GUILayout.Width(24)))
{
toRemove = i;
}
GUI.color = b;
string label = obj.name;
if (GUILayout.Button(label, EditorStyles.foldout))
{
ignoreNextSelection = true;
Selection.activeObject = obj;
}
if (GUILayout.Button("Focus", EditorStyles.miniButton, GUILayout.Width(40)))
{
ignoreNextSelection = true;
Selection.activeObject = obj;
SceneView.lastActiveSceneView.FrameSelected();
}
}
GUI.color = backup;
}
i++;
else
if (toRemove != -1) lockedObjects.RemoveAt(toRemove);
}
int toAdd = -1;
toRemove = -1;
i = 0;
using (new EditorGUILayout.HorizontalScope())
{
GUILayout.Label("History", EditorStyles.boldLabel);
GUILayout.FlexibleSpace();
if (GUILayout.Button("Clear", EditorStyles.miniButton))
{
selectionHistory.Clear();
Repaint();
}
}
GUILayout.Space(8);
var reversedHistory = selectionHistory.Reverse<GameObject>().ToArray();
foreach (var obj in reversedHistory)
{
if (obj != null)
{
bool highlight = Selection.gameObjects.Contains(obj);
Color backup = GUI.color;

using (new EditorGUILayout.HorizontalScope())
{
var b = GUI.color;
GUI.color = Color.yellow * 3;
if (GUILayout.Button(Contents.star, Styles.icon, GUILayout.Width(24)))
if (GUILayout.Button(Contents.starDisabled, Styles.icon, GUILayout.Width(24)))
toRemove = i;
toAdd = i;
GUI.color = b;
if (GUILayout.Button("Focus", EditorStyles.miniButton, GUILayout.Width(40)))
if (GUILayout.Button("Focus", Styles.historyButton, GUILayout.Width(40)))
{
ignoreNextSelection = true;
Selection.activeObject = obj;

var rect = GUILayoutUtility.GetLastRect();
EditorGUI.DrawRect(rect, new Color(0.2f,0.2f,0.2f,0.5f));
if (toRemove != -1) lockedObjects.RemoveAt(toRemove);
}
int toAdd = -1;
toRemove = -1;
i = 0;
using (new EditorGUILayout.HorizontalScope())
{
GUILayout.Label("History", EditorStyles.boldLabel);
GUILayout.FlexibleSpace();
if (GUILayout.Button("Clear", EditorStyles.miniButton))
if (toAdd != -1)
{
lockedObjects.Add(reversedHistory[toAdd]);
Repaint();
}
if (toRemove != -1)
selectionHistory.Clear();
selectionHistory.RemoveAt(toRemove);
}
GUILayout.Space(8);
}
var reversedHistory = selectionHistory.Reverse<GameObject>().ToArray();
foreach (var obj in reversedHistory)
static class Styles
if (obj != null)
{
bool highlight = Selection.gameObjects.Contains(obj);
Color backup = GUI.color;
if (highlight)
GUI.color = Styles.highlightColor;
public static GUIStyle historyButton;
public static GUIStyle highlight;
public static Color highlightColor = new Color(2.0f, 2.0f, 2.0f);
using (new EditorGUILayout.HorizontalScope())
{
public static GUIStyle icon;
if (GUILayout.Button(Contents.starDisabled, Styles.icon, GUILayout.Width(24)))
{
toAdd = i;
}
static Styles()
{
historyButton = new GUIStyle(EditorStyles.miniButton);
historyButton.alignment = TextAnchor.MiddleLeft;
highlight = new GUIStyle(EditorStyles.miniLabel);
highlight.onNormal.background = Texture2D.whiteTexture;
highlight.onHover.background = Texture2D.whiteTexture;
highlight.onActive.background = Texture2D.whiteTexture;
highlight.onFocused.background = Texture2D.whiteTexture;
string label = obj.name;
if (GUILayout.Button(label, EditorStyles.foldout))
{
ignoreNextSelection = true;
Selection.activeObject = obj;
}
if (GUILayout.Button("Focus", Styles.historyButton, GUILayout.Width(40)))
{
ignoreNextSelection = true;
Selection.activeObject = obj;
SceneView.lastActiveSceneView.FrameSelected();
}
}
var rect = GUILayoutUtility.GetLastRect();
EditorGUI.DrawRect(rect, new Color(0.2f,0.2f,0.2f,0.5f));
icon = new GUIStyle(EditorStyles.label);
icon.fixedHeight = 16;
icon.padding = new RectOffset(8,2,2,0);
icon.margin = new RectOffset();
GUI.color = backup;
i++;
}
if (toAdd != -1)
{
lockedObjects.Add(reversedHistory[toAdd]);
Repaint();
}
if (toRemove != -1)
{
selectionHistory.RemoveAt(toRemove);
Repaint();
}
static class Styles
{
public static GUIStyle historyButton;
public static GUIStyle highlight;
public static Color highlightColor = new Color(2.0f, 2.0f, 2.0f);
public static GUIStyle icon;
static Styles()
static class Contents
historyButton = new GUIStyle(EditorStyles.miniButton);
historyButton.alignment = TextAnchor.MiddleLeft;
highlight = new GUIStyle(EditorStyles.miniLabel);
highlight.onNormal.background = Texture2D.whiteTexture;
highlight.onHover.background = Texture2D.whiteTexture;
highlight.onActive.background = Texture2D.whiteTexture;
highlight.onFocused.background = Texture2D.whiteTexture;
icon = new GUIStyle(EditorStyles.label);
icon.fixedHeight = 16;
icon.padding = new RectOffset(8,2,2,0);
icon.margin = new RectOffset();
public static GUIContent title = new GUIContent("Selection History");
public static GUIContent star = new GUIContent(EditorGUIUtility.IconContent("Favorite Icon").image);
public static GUIContent starDisabled = new GUIContent(EditorGUIUtility.IconContent("Favorite").image);
}
static class Contents
{
public static GUIContent title = new GUIContent("Selection History");
public static GUIContent star = new GUIContent(EditorGUIUtility.IconContent("Favorite Icon").image);
public static GUIContent starDisabled = new GUIContent(EditorGUIUtility.IconContent("Favorite").image);
}
}

2
LocalPackages/net.peeweek.gameplay-ingredients/Editor/WelcomeScreen/WelcomeScreen.cs


EditorApplication.update -= ShowAtStartup;
}
[MenuItem("Window/Gameplay Ingredients")]
[MenuItem("Window/Gameplay Ingredients/Welcome Screen", priority = MenuItems.kWindowMenuPriority)]
static void ShowFromMenu()
{
GetWindow<WelcomeScreen>(true, "Gameplay Ingredients");

2
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/CodeGeneration/CodeGenerator.cs


private static readonly string DRAW_CONDITION_ENTRY_FORMAT = "drawConditionsByAttributeType[typeof({0})] = new {1}();" + Environment.NewLine;
//[UnityEditor.Callbacks.DidReloadScripts]
//[MenuItem("Tools/NaughtyAttributes/Update Attributes Database")]
[MenuItem("Tools/NaughtyAttributes/Update Attributes Database")]
private static void GenerateCode()
{
GenerateScript<PropertyMeta, PropertyMetaAttribute>("PropertyMetaDatabase", "PropertyMetaDatabaseTemplate", META_ENTRY_FORMAT);

2
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/CodeGeneration/PropertyDrawerDatabase.cs


drawersByAttributeType[typeof(DisableIfAttribute)] = new DisableIfPropertyDrawer();
drawersByAttributeType[typeof(DropdownAttribute)] = new DropdownPropertyDrawer();
drawersByAttributeType[typeof(EnableIfAttribute)] = new EnableIfPropertyDrawer();
drawersByAttributeType[typeof(LabelAttribute)] = new LabelPropertyDrawer();
drawersByAttributeType[typeof(MinMaxSliderAttribute)] = new MinMaxSliderPropertyDrawer();
drawersByAttributeType[typeof(ProgressBarAttribute)] = new ProgressBarPropertyDrawer();
drawersByAttributeType[typeof(ReadOnlyAttribute)] = new ReadOnlyPropertyDrawer();

drawersByAttributeType[typeof(SliderAttribute)] = new SliderPropertyDrawer();
drawersByAttributeType[typeof(TagAttribute)] = new TagPropertyDrawer();
}

17
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/Editors/InspectorEditor.cs


private void ValidateAndDrawField(FieldInfo field)
{
if (!ShouldDrawField(field))
{
return;
}
this.ValidateField(field);
this.ApplyFieldMeta(field);
this.DrawField(field);

}
}
private void DrawField(FieldInfo field)
private bool ShouldDrawField(FieldInfo field)
{
// Check if the field has draw conditions
PropertyDrawCondition drawCondition = this.GetPropertyDrawConditionForField(field);

if (!canDrawProperty)
{
return;
return false;
}
}

{
return;
return false;
// Draw the field
return true;
}
private void DrawField(FieldInfo field)
{
EditorGUI.BeginChangeCheck();
PropertyDrawer drawer = this.GetPropertyDrawerForField(field);
if (drawer != null)

11
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/ReorderableListPropertyDrawer.cs


drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
{
var element = property.GetArrayElementAtIndex(index);
rect.y += 2f;
rect.y += 1.0f;
rect.x += 10.0f;
rect.width -= 10.0f;
EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, true);
},
EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element);
elementHeightCallback = (int index) =>
{
return EditorGUI.GetPropertyHeight(property.GetArrayElementAtIndex(index)) + 4.0f;
}
};

29
LocalPackages/net.peeweek.gameplay-ingredients/README.md


Gameplay Ingredients for your Unity Games - A collection of scripts that ease simple tasks while making games and prototypes.
<u>You can read Documentation at this address :</u> [https://peeweek.readthedocs.io/en/latest/gameplay-ingredients/](https://peeweek.readthedocs.io/en/latest/gameplay-ingredients/)
* Unity 2018.3
* **Unity 2019.3** (Older versions compatible with 2018.3 / 2019.1 / 2019.2)
* (**Optional** : Command-line Git installed on your system, for example [Git For Windows](https://gitforwindows.org/))
You can use a manual, local package installation if you need to alter the code locally or automate the fetch of the repository by using a git address directly. The latter option shall download and manage automatically the repository, with the drawback of being read-only.
You can use a manual, local package installation if you need to alter the code locally or update the code base regularly.
Otherwise, you can perform a git referenced package in your `manifset.json` file : this option shall download and manage automatically the repository, with the drawback of being read-only.
- Clone repository somewhere of your liking
- Clone this repository somewhere of your liking
- The repository shall be added
- The package shall be added as a **local package**
- With unity closed, edit the `Packages/manifest.json` with a text editor
- append the line ` "net.peeweek.gameplay-ingredients": "https://github.com/peeweek/net.peeweek.gameplay-ingredients.git#2018.3.0",` under `dependencies`
- Ensure you have a **[Command Line Git](https://gitforwindows.org/) Installed**
- With Unity 2019.3 closed, edit the `Packages/manifest.json` with a text editor
- Append the line ` "net.peeweek.gameplay-ingredients": "https://github.com/peeweek/net.peeweek.gameplay-ingredients.git#2019.3.0",` under `dependencies`
# Version / Tag Compatibility
Gameplay Ingredients comes at latest version with the following compatibility:
**Unity 2019.3** : clone and check out the `master` branch at the tag `2019.3.0`
#### Older Versions
* **Unity 2018.3 / 2018.4 :** choose the tag `2018.3.0`
* **Unity 2019.1 / 2019.2 :** choose the tag `2019.1.2`

21
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Controllers/FirstPersonController.cs


public void OnValidate()
{
if (m_Controller == null)
m_Controller = GetComponent<CharacterController>();
float realHeight = PlayerHeight + PlayerRadius;
var controller = GetComponent<CharacterController>();
var center = new Vector3(0, realHeight / 2, 0);
if (controller.center != center)
controller.center = center;
if (controller.height != realHeight)
controller.height = realHeight;
float realHeight = PlayerHeight + PlayerRadius;
m_Controller.center = new Vector3(0, realHeight / 2, 0);
m_Controller.height = realHeight;
m_Controller.radius = PlayerRadius;
if(controller.radius != PlayerRadius)
controller.radius = PlayerRadius;
m_Camera.transform.localPosition = new Vector3(0, PlayerHeight, 0);
if(m_Camera != null)
m_Camera.transform.localPosition = new Vector3(0, PlayerHeight, 0);
}
public void UpdateRotation()

2
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Discover/Discover.cs


public DiscoverSection[] Sections;
#if UNITY_EDITOR
[UnityEditor.MenuItem("GameObject/GameplayIngredients/Discover", priority=10)]
[UnityEditor.MenuItem("GameObject/Gameplay Ingredients/Discover", priority=10)]
static void CreateObject()
{
GameObject selected = UnityEditor.Selection.activeGameObject;

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/GameplayIngredients.asmdef


{
"name": "GameplayIngredients",
"references": [
"GUID:8159fdb6c7801b34fb01c3bf046a6e57",
"GUID:4307f53044263cf4b835bd812fc161a4",
"GUID:f06555f75b070af458a003d92f9efb00",
"GUID:2bafac87e7f4b9b418d9448d219b01ab"
"NaughtyAttributes.Core",
"Cinemachine",
"Unity.Timeline",
"UnityEngine.UI"
],
"includePlatforms": [],
"excludePlatforms": [],

"autoReferenced": true,
"defineConstraints": [],
"versionDefines": []
"versionDefines": [],
"noEngineReferences": false
}

66
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Factory/Factory.cs


{
Random,
Sequential,
Shuffle
Shuffle,
GameSave
}
public enum SpawnTargetSelection

DontDestroyOnLoad
}
[Header("Blueprint")]
public BlueprintSelectionMode blueprintSelecionMode = BlueprintSelectionMode.Random;
[ShowIf("usesGameSave")]
public GameSaveManager.Location gameSaveLocation = GameSaveManager.Location.User;
[ShowIf("usesGameSave")]
public string gameSaveVariableName = "FactoryBPIndex";
[ShowIf("usesGameSave")]
public int defaultGameSaveIndex = 0;
[Header("Spawn Target")]
public SpawnLocation spawnLocation = SpawnLocation.SameSceneAsTarget;
[Tooltip("Sacrifices oldest instance if necessary")]
public bool SacrificeOldest = false;
public BlueprintSelectionMode blueprintSelecionMode = BlueprintSelectionMode.Random;
[Header("Reap and Respawn")]
public SpawnLocation spawnLocation = SpawnLocation.SameSceneAsTarget;
public float RespawnDelay = 3.0f;
public bool ReapInstancesOnDestroy = true;

List<GameObject> m_Instances;
private void OnEnable()
{
if(m_Instances != null)
m_Instances.RemoveAll(item => item == null);
}
private void OnDestroy()
{
if(ReapInstancesOnDestroy && m_Instances != null)

}
}
bool usesGameSave()
{
return blueprintSelecionMode == BlueprintSelectionMode.GameSave;
}
public void SetTarget(GameObject target)
{
if(target != null)

public GameObject GetInstance(int index)
{
if (m_Instances.Count > index)
if (m_Instances != null && m_Instances.Count > index)
return m_Instances[index];
else
return null;

if (m_Instances == null)
m_Instances = new List<GameObject>();
if(m_Instances.Count == MaxInstances && SacrificeOldest)
{
var oldest = m_Instances[0];
m_Instances.RemoveAt(0);
Destroy(oldest);
}
if (m_Instances.Count < MaxInstances)
{
GameObject newInstance = Spawn(SelectBlueprint(), SpawnTarget);

private GameObject SelectBlueprint()
{
if(FactoryBlueprints == null || FactoryBlueprints.Length == 0)
{
Debug.LogError($"Factory '{gameObject.name}' could not spawn anything as there are no blueprints set up");
return null;
}
default:
case BlueprintSelectionMode.Random:
currentBlueprintIndex = Random.Range(0, FactoryBlueprints.Length);
break;

case BlueprintSelectionMode.Shuffle:
currentBlueprintIndex = Shuffle(currentBlueprintIndex);
break;
case BlueprintSelectionMode.GameSave:
currentBlueprintIndex = GetFromGameSave();
break;
}
return FactoryBlueprints[currentBlueprintIndex];
}

shuffleIndices = Enumerable.Range(0, FactoryBlueprints.Length).OrderBy(x => Random.value).ToList();
}
return shuffleIndices[(shuffleIndices.IndexOf(i) + 1) % shuffleIndices.Count];
}
private int GetFromGameSave()
{
var gsm = Manager.Get<GameSaveManager>();
int index = -1;
if(gsm.HasInt(gameSaveVariableName, gameSaveLocation))
{
index = gsm.GetInt(gameSaveVariableName, gameSaveLocation);
}
else
{
index = defaultGameSaveIndex;
}
return Mathf.Clamp(index, 0, FactoryBlueprints.Length - 1);
}
}
}

29
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Rigs/ReachPositionRig.cs


using NaughtyAttributes;
using UnityEngine;
namespace GameplayIngredients.Rigs

public Transform target => m_Target;
[Header("Target")]
[Header("Motion")]
[Header("On Reach Position")]
[ReorderableList]
public Callable[] OnReachPosition;
public float ReachSnapDistance = 0.01f;
bool m_PositionReached = false;
var delta = m_Target.position - transform.position;
var speed = Time.deltaTime * Mathf.Min((Dampen * delta.magnitude), MaximumVelocity);
gameObject.transform.position += delta.normalized * speed;
if(Vector3.Distance(transform.position , m_Target.position) < ReachSnapDistance)
{
transform.position = m_Target.position;
if(!m_PositionReached)
{
Callable.Call(OnReachPosition, this.gameObject);
m_PositionReached = true;
}
}
else
{
var delta = m_Target.position - transform.position;
var speed = Time.deltaTime * Mathf.Min((Dampen * delta.magnitude), MaximumVelocity);
gameObject.transform.position += delta.normalized * speed;
m_PositionReached = false;
}
}
}

7
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/StateMachine/State.cs


public Callable[] OnStateEnter;
[ReorderableList]
public Callable[] OnStateExit;
[ReorderableList]
[ReorderableList, ShowIf("AllowUpdateCalls")]
private bool AllowUpdateCalls()
{
return GameplayIngredientsSettings.currentSettings.allowUpdateCalls;
}
}
}

20
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/StateMachine/StateMachine.cs


[ReorderableList, NonNullCheck]
public State[] States;
public State CurrentState { get { return m_CurrentState; } }
[ContextMenu("Reset State Objects")]
private void UpdateFromState()
{
foreach(var state in States)
{
state.gameObject.SetActive(state == States.FirstOrDefault(o => o.StateName == DefaultState));
}
}
void Start()
{

Debug.LogWarning(string.Format("{0} : Trying to set unknown state {1}", gameObject.name, stateName), gameObject);
}
public void Update()
void Update()
if (m_CurrentState != null)
if (GameplayIngredientsSettings.currentSettings.allowUpdateCalls
&& m_CurrentState != null
&& m_CurrentState.OnStateUpdate != null
&& m_CurrentState.OnStateUpdate.Length > 0)
{
}
}
}

4
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/ApplicationExitAction.cs


{
public override void Execute(GameObject instigator = null)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.ExitPlaymode();
#else
#endif
}
}
}

7
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/CycleResolutionsAction.cs


string getText(Resolution currentResolution)
{
#if UNITY_EDITOR
return "No resolution switch in the editor";
#endif
#if !UNITY_EDITOR
if (currentResolution.width == 0 || currentResolution.height == 0)
{

return string.Format("Resolution: {0}X{1}", currentResolution.width, currentResolution.height);
#else
return "No resolution switch in the editor";
#endif
}
Resolution[] availableResolutions;

12
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/GameSaveSetValueAction.cs


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

public string Key = "SomeKey";
public GameSaveManager.Location saveLocation = GameSaveManager.Location.System;
public GameSaveManager.ValueType valueType = GameSaveManager.ValueType.String;
[ShowIf("isString")]
[ShowIf("isInt")]
[ShowIf("isBool")]
[ShowIf("isFloat")]
public float FloatValue;
public override void Execute(GameObject instigator = null)

case GameSaveManager.ValueType.String: gsm.SetString(Key, saveLocation, StringValue); break;
}
}
bool isString() { return valueType == GameSaveManager.ValueType.String; }
bool isBool() { return valueType == GameSaveManager.ValueType.Bool; }
bool isInt() { return valueType == GameSaveManager.ValueType.Int; }
bool isFloat() { return valueType == GameSaveManager.ValueType.Float; }
}
}

2
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/SendMessageAction.cs


public override void Execute(GameObject instigator = null)
{
Messager.Send(MessageToSend);
Messager.Send(MessageToSend, instigator);
}
}
}

13
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/ToggleGameObjectAction.cs


{
public class ToggleGameObjectAction : ActionBase
{
[ContextMenu("Update Toggles from Current State")]
void UpdateFromCurrentState()
{
for (int i = 0; i < Targets.Length; i++)
{
if (Targets[i].GameObject == null)
continue;
Targets[i].State = Targets[i].GameObject.activeSelf ? GameObjectToggle.GameObjectToggleState.Enable : GameObjectToggle.GameObjectToggleState.Disable;
}
}
[ReorderableList]
public GameObjectToggle[] Targets;

6
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Callable.cs


public static void Call(Callable[] calls, GameObject instigator = null)
{
if (calls == null)
{
Debug.LogError("Cannot execute callable list: Null or Missing");
return;
}
foreach (var call in calls)
{
if (GameplayIngredientsSettings.currentSettings.verboseCalls)

9
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Events/EventBase.cs


{
public abstract class EventBase : MonoBehaviour
{
protected bool AllowUpdateCalls()
{
return GameplayIngredientsSettings.currentSettings.allowUpdateCalls;
}
protected bool ForbidUpdateCalls()
{
return !GameplayIngredientsSettings.currentSettings.allowUpdateCalls;
}
}
}

4
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Events/OnGameManagerLevelStart.cs


}
}
void Execute()
void Execute(GameObject instigator = null)
Callable.Call(OnMessageRecieved, gameObject);
Callable.Call(OnMessageRecieved, instigator);
}
catch (System.Exception e)
{

5
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Events/OnMessageEvent.cs


using NaughtyAttributes;
using UnityEngine;
namespace GameplayIngredients.Events
{

Messager.RemoveMessage(MessageName, Execute);
}
void Execute()
void Execute(GameObject instigator)
Callable.Call(OnMessageRecieved, gameObject);
Callable.Call(OnMessageRecieved, instigator);
}
catch(System.Exception e)
{

1
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Events/OnTriggerEvent.cs


public Callable[] onTriggerExit;
public bool OnlyInteractWithTag = true;
[EnableIf("OnlyInteractWithTag")]
public string Tag = "Player";
private void OnTriggerEnter(Collider other)

5
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Logic/EditorOnlyLogic.cs


break;
}
}
public override string GetDefaultName()
{
return $"If {ExecutionPath} {(DisableOnPlayFromHere? "(Not Play From Here)":"")}" ;
}
}
}

3
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Logic/SetInstigatorFromFactoryLogic.cs


[NonNullCheck]
public Factory Factory;
public int FactoryIndex = 0;
public bool ContinueEvenIfNull = false;
public override void Execute(GameObject instigator = null)
{

if (instance != null)
if(instance != null || ContinueEvenIfNull)
Call(Next, instance);
}
}

37
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Managers/Implementations/GameManager.cs


public GameLevel[] MainGameLevels;
[Header("Save")]
public bool EnableSaveProgress = true;
public string ProgressSaveName = "Progress";
public static string MainMenuStartMessage = "GAME_MANAGER_MAINMENU_START";

public int currentSaveProgress
{
get { Manager.Get<GameSaveManager>().LoadUserSave(0); return Manager.Get<GameSaveManager>().GetInt(ProgressSaveName, GameSaveManager.Location.User); }
set { Manager.Get<GameSaveManager>().SetInt(ProgressSaveName, GameSaveManager.Location.User, value); Manager.Get<GameSaveManager>().SaveUserSave(0); }
get
{
if(EnableSaveProgress)
{
Manager.Get<GameSaveManager>().LoadUserSave(0);
return Manager.Get<GameSaveManager>().GetInt(ProgressSaveName, GameSaveManager.Location.User);
}
else
{
Debug.LogWarning("Game Manager : Saving Game Progress is Disabled, Returing first level instead.");
return 0;
}
}
set
{
if(EnableSaveProgress)
{
Manager.Get<GameSaveManager>().SetInt(ProgressSaveName, GameSaveManager.Location.User, value);
Manager.Get<GameSaveManager>().SaveUserSave(0);
}
else
{
Debug.LogWarning("Game Manager : Saving Game Progress is Disabled");
}
}
}
GameObject m_CurrentLevelSwitch;

currentLevel = int.MinValue;
Callable.Call(OnGameStart);
Manager.Get<GameSaveManager>().LoadUserSave(0);
if(EnableSaveProgress)
Manager.Get<GameSaveManager>().LoadUserSave(0);
}
Callable GetCurrentLevelSwitch(int targetLevel, bool showUI = false, Callable[] onComplete = null)

if (m_CurrentLevelSwitch == null)
{
var call = GetCurrentLevelSwitch(nextLevel, showUI, onComplete);
Globals.ResetLocals();
// Save Progression if not mainmenu
if(nextLevel != -1 && saveProgress)
// Save Progression if Enabled and not mainmenu
if(EnableSaveProgress && nextLevel != -1 && saveProgress)
currentSaveProgress = currentLevel;
}
else

5
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Managers/Manager.cs


}
}
public static bool Has<T>() where T:Manager
{
return(s_Managers.ContainsKey(typeof(T)));
}
static readonly Type[] kAllManagerTypes = GetAllManagerTypes();
[RuntimeInitializeOnLoadMethod]

6
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Managers/Messager/Messager.cs


{
public static class Messager
{
public delegate void Message();
public delegate void Message(GameObject instigator = null);
private static Dictionary<string, List<Message>> m_RegisteredMessages;

m_RegisteredMessages.Remove(messageName);
}
public static void Send(string eventName)
public static void Send(string eventName, GameObject instigator = null)
{
if(GameplayIngredientsSettings.currentSettings.verboseCalls)
Debug.Log(string.Format("[MessageManager] Broadcast: {0}", eventName));

{
foreach (var message in m_RegisteredMessages[eventName])
{
message.Invoke();
message.Invoke(instigator);
}
}
catch (Exception e)

3
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Managers/Messager/Playables/SendMessage/SendMessageBehaviour.cs


public class SendMessageBehaviour : PlayableBehaviour
{
public string StartMessage;
public GameObject Instigator;
public override void OnBehaviourPlay(Playable playable, FrameData info)
{

if (Application.isPlaying)
Messager.Send(StartMessage);
Messager.Send(StartMessage, Instigator);
else
Debug.Log("[SendMessageBehaviour] Would have sent broadcast message : '" + StartMessage + "'");
}

10
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Settings/GameplayIngredientsSettings.cs


{
public string[] excludedeManagers { get { return m_ExcludedManagers; } }
public bool verboseCalls { get { return m_VerboseCalls; } }
public bool allowUpdateCalls { get { return m_AllowUpdateCalls; } }
public bool disableWelcomeScreenAutoStart { get { return m_DisableWelcomeScreenAutoStart; } }
[BoxGroup("Editor")]

protected string[] m_ExcludedManagers;
[BoxGroup("Callables")]
[SerializeField, InfoBox("Verbose Calls enable logging at runtime, this can lead to performance drop, use only when debugging.",InfoBoxType.Warning, "m_VerboseCalls")]
protected bool m_VerboseCalls;
[SerializeField, InfoBox("Verbose Calls enable logging at runtime, this can lead to performance drop, use only when debugging.", InfoBoxType.Warning, "m_VerboseCalls")]
private bool m_VerboseCalls = false;
[BoxGroup("Callables")]
[SerializeField, InfoBox("Per-update calls should be avoided due to high performance impact. Enable and use with care, only if strictly necessary.", InfoBoxType.Warning, "m_AllowUpdateCalls")]
private bool m_AllowUpdateCalls = false;
const string kAssetName = "GameplayIngredientsSettings";

9
LocalPackages/net.peeweek.gameplay-ingredients/package.json


{
"name": "net.peeweek.gameplay-ingredients",
"displayName": "Gameplay Ingredients",
"version": "2019.1.0-preview",
"version": "2019.3.1",
"unity": "2019.1",
"description": "Gameplay ingredients - A Collection of scripts for the editor and runtime to set-up gameplay actions and logic in your games",
"unity": "2019.3",
"description": "Gameplay ingredients - A Collection of scripts for the editor and runtime to set-up gameplay actions and logic in your games.",
"dependencies": {
"com.unity.cinemachine": "2.3.4"
},

"State Machine",
"Editor",
"Streaming"
]
],
"hideInEditor": false
}

150
LocalPackages/net.peeweek.gameplay-ingredients/CHANGELOG.md


# Changelog
## 2019.3.1
#### Changed
* **Messager** is now able to pass instigator Game Object through message broadcast.
* **OnMessageEvent** now passes the optional instigator instead of itself as instigator to the Calls. In order to pass itself use an intermediate **SetInstigatorLogic** that targets the OnMessageEvent owner to replicate the former behaviour.
* **SendMessageAction** now passes its instigator game object to the **Messager**
#### Added
* **Call Tree Explorer**: Added Category for Erroneous Calls
* Added **ToggleBehaviourAction** working the same as ToggleGameObjectAction, but for behaviour components instead.
* **SendMessageBehaviour** (Timeline Send Message Tracks/Clips) now displays an instigator game object field in the inspector to be attached to the sent message.
#### Fixed
* Fixed `OnValidate` for FirstPersonController leading to infinite import loop when displaying the inspector for a Prefab Asset.
* Fix for null Callables in Callable Tree Window.
## 2019.3.0
* Feature Release
* Requires Unity 2019.3.0 or newer
#### Added
* **Call Tree Explorer :** Using Window/Gameplay Ingredients/Call Tree Explorer , opens a window that lists the tree of Events, Logic and Actions, State Machines and Event Calling Actions
* **Folders:** In the Game Object creation Menu, Select folder to add a folder in the hierarchy. Automatically adds Static Game Objects with colored icon (Displayed using Advanced Hierarchy View)
* **Global Variables System**:
- Added Global Variables (Globals + Local Scope)
- Added Global Variable Debug Window (`Window/Gameplay Ingredients/Globals Debug`)
- Added Global Variable Set Action
- Added Global Variable Logic
- Added Global Variables Reset Action
* **Timers**:
* Added Timer Component
* Added TimerAction to control Timer
* Added TimerDisplayRig
* Added option in GameplayIngredientsSettings to disable visibility of Callable[] bound to Update Loops.
* Added OnUpdate Event : Perform calls every update
* Added OnColider Event : Perform calls upon collisions
* Added OnJoinBreak Event : Perform calls upon Rigid body joint break
* Added FlipFlop Logic : Two-state latch logic
* Added State Logic : Perform logic based on State Machine current state.
* Added Audio Mix Snapshot Action : Set Mixer Snapshots
* Added RigidBody Action : Perform actions on a rigidbody
* Added SetAnimatorParameterAction : Perform parameter setting on Animators
* Added Sacrifice Oldest option to Factory : When needing a new spawn but no slots left, sacrifices the first spawn of the list
* Added Context Menu in ToggleGameObjectAction to update entries based on current enabled state in scene.
#### Changed
- Improved **Find & Replace** window, with a selection-based criteria.
- Moved Menu Items in Window menu into a Gameplay Ingredients Subfolder
- GameManager Resets Global Variables Local Scope on Level Load
- Updated NaughtyAttributes to a more recent version
- Renamed the Add Game Object menu category from `'GameplayIngredients' to 'Gameplay Ingredients'` and adjusted its contents
#### Fixed
* Fixed LinkGameView not working in play mode when excluding VirtualCameraManager.
* Fixed Performance issue in GameplayIngredientsSettings when having a big list of Excluded managers.
* Fixed ApplicationExitAction : Exits play mode when in Editor.
## 2019.1.2
#### Changed
* **[Breaking Change]** Discover Assets now reference many Scenes/SceneSetups
* Action to take: have to re-reference scenes in Discover Asset
#### Added
* Added Screenshot Manager (Defaults to F11 to take screenshots)
* Added OnMouseDownEvent
* Added OnMouseHoverEvent
* Added OnVisibilityEvent
* Added SaveDataSwitchOnIntLogic
#### Fixed
* Fixed warning in CycleResolutionsAction
## 2019.1.1
#### Changed
#### Added
* Log Action
* Added Playable Director to objects in discover (to open atimeline at a give playable director)
* Added support of Game Save Value index for Factories (in order to select a blueprint object from a saved value)
#### Fixed
* Fixed Import Errors at first project load, including the way we load discover and GameplayIngredients project settings
* Secure checks in Gathering Manager classes from assembly (skips protected assemblies now)
## 2019.1.0
#### Changed
* Removed counts in OnTriggerEvent
* Callables can now be friendly-named (with default formatting)
* Updated Starter Packages
#### Added
- Added NTimesLogic (split from OnTriggerEvent)
- Added Replace Mode for Level Streaming Manager
- Added UIToggle Action and Property Drawer
- Added Audio Play Clip Action
- Added Platform Logic
- New Welcome Screen, with Wizard
- New optional GameplayIngredients Project Configuration asset
- Toggles for verbose callable logging
- Manager Exclusion List
- New Scene from Template Window + Config SceneTemplateLists Assets
- Helps creating new scenes from user-made templates
- New Discover Window System:
- Adds a new DiscoverAsset to reference Levels / Scene Setups
- Adds new Discover components in scenes
- Discover window helps navigate scenes while in editor and discover content.
- Added improved Game Manager
- Manages loading of main menu & levels directly instead of using LevelStreamingManager
- Manages Level Startup in sync after all scenes have started.
#### Fixed
* Fixed code to run on Unity 2019.1
* Fixed factory managed objects upon destroy
* Fixes in LinkGameView when application is not playing
* Fix in LevelStreamingManager incorrect computation of Scene Counts
* Fixes in VirtualCameraManager
* Fixes in Find/Replace window
* Fixes in Hierarchy View Hints for Unity 2019.3 new skin
## 2018.3.0
Initial Version

7
LocalPackages/net.peeweek.gameplay-ingredients/CHANGELOG.md.meta


fileFormatVersion: 2
guid: a2d80afb13247c646b079b5f51dcb6ac
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

172
LocalPackages/net.peeweek.gameplay-ingredients/Documentation~/Images/PoweredByGameplayIngredients.afdesign


�KA nsrP#Inf�`��`�]Prot #Fil(�/�H��ʣ�PPZq�ta`�0�d������[3^��?L�� W �`�n��I3���L�����8ʆ I;�7T] JSy���%����-�)�H��g�N2E�M�R����k��k�T�������P�T�ꠈ}mA�É $���Bj�$I�$I�E� �Ù�B�qĆ6�19qC���?8�f�h������U2o8�� G36�cȼ\6�Qu,C�%�!k�g�2G48�f"t,qjȕ��e�^:+_0��0�V� �̺h��c7��������'!�����˨B�$I�$�"E����lA (�a����9LJ��D�����)�IS?P�H�ä9L�&/�ab��q*g�h_����2b�2U���N�������"YM%گ�r���Mh��>2�� ��5�&vRN����/������"Ցɐ�'(Ċ��h)����`��Ce���k'��,����Oe�d�}O%��w�c�J�Sɉ{�j}ZM��"����I��ӟL��!zObE�T�Α��X�����+c7:�kbEgJ�X�ʒUN'Eh^�D���l݄HM�����D X���YS~J�����
�hh�O���b0{� V���Yl��I ����ZW�.)k2Ǚ��_�ft�'��� �9����kh�K��:���M}djK|������忆+?~D���l,;V�PY1}��v<T��ʶ��YFݪ��۫}�Tުu����-���^E˓Qi Z�:�b%���Rܟ�?��/m�?X��)gJ}��9�����'�B��� }�⤛L�M�����x�o�#�oJ�3!6���M�M}i����P)S'��Г���B�uP�+?��ELq4֋������,�_��?c��7���ֿg��@����@=)���Q`Ax�R�B�B��p�$�cL�C�0��5��f�&l�$W�&��4c�8sD���!$�Eo����6'����nBs3"�Кh�������In�^ �J9�%��5��|�񆒳1��H�j^Z�E�a����-���wr�=`1���ݶ�����*#,<T��G*,_�o�?��B}��ƥ�����5��Lfh�Y��%�"�W<Q�����ٔ.�/�b��t�,���-ӵ��u����ۺ��LhM�:�_&R΃��E����sl�ؘW�
�k��#Ӗ(�n,����,� �B���ʙ)�,�3=��s���X�˿_�����k��3&��%�D�l;F � T���B|c%E��%��˱�PҬy���՗����~�h�%� Ê4bz~�{�.��qy���_��
ԣ�rgL��bHt�e�!��k�;)��P�R�J��w��Δ]�Z�5�\jhM0T�y��Y�7��"��T���Z�LunگI���������h�C<���p�x45��+���_�b�
���t�xM�j
y8(�y����6";@�ϯ�@���C6А �g����CM��!��l��)�Ҫ P��be�)���bfͧ������u��?�be��OV�#��u�leV�:�<��?Dc����Kz��s^�^�D�o��+%���D�6��ua���n:�kb� �\�M�u
e�x~��钲Yr�?���-���`���������:��v�
[�5��տ.���+���ﲫ1�O�*I �n��Bc@)B����+��p �%"JCF`a�HJa�<�1 �r{l=L۶�`{�P�X�Ne�c���±x*�>�(zt>LC8���1�E)fG����*N0Vtx�4�0B��ҐUVtx�~i����q�%_� 8�զ��Ū������ԼR�j��#1�h#�5�i�Ò%K�,�B�D(-_�I�Tc�nb��e�8�%�i/��#����)�)dRУ�X�C �P:}���d����B�H���Q����G�*�������J�ܦ�����L#o ]$A ���Q�+c
%�!��%�f�.���%KP�\�d%��|P� �QXwc�Ph?�W�����'4 �g��L���"4���Kq ����D@I�dM_"G޼R#�H,�`'����1c��Ia�$�z�+��T��\ݿ�6a�oB�D��c$�c�(����# �ƌ�%��?��<X������^F�+��C�3�܀�R��b‰D���b�@h��LLv�[TF��/�ߗ�+��~Y2��-XƎl�5�Mۡ��1�XL>xx+?v���F>T������i�vt�ig���X���e��K)A��9�>��aN�+��v'���cUgM7�VVVVVV����]i��+W��TJa@�D -J)��Ź�Q5�)���L�R�����ʥ�Nl@��P��Ja�(ݸb��b�(��A�Q, �º�/���9D�U�%�-ۿX�L�V���C������W]�z~m�����dŊ��_[�h��t� ���4�-Ha��E��\�L�/JY�#� m����o-�2���eLo<�~d+\������?�}�+��/��0�@� ��Q`*�Q���#��ǁ\�W��������dΔ!��C���Ǝ������<�ɊLY)O#ǯ�T���T��S�S�����T�R�}O���򒹔�����4j���G�pJq�b�3����@��b v�Ӷ�~]��̀�ׅD������7���f?��(�ghEQD]\b��Ngggg�C}�E��
y&*��:k"5_姅]�+z�a��_s�a����ް�%��^���cm�!E"+��!�ϙ5�$��L-�Bˈ��6�(-D�d����:�!z(���2� "2�b K(��Ё��ρ0B�@bR����'���0|��6Ç��(���A� i��HT��$`��@�tX�dɒ%K���@CCCCCCZ������
I c������
��$I�$IN�����ܿ��8���ԸV��J��s�l���q^Й��s�e�����<��<گx���kų4��K��f1# R�33��w�7[��-r2��2�Iܖ!�)��u.]�K2�$Y�������w����-�8�4R5K�_�� L��&����Ԗr���M��>�濵���M��I�FR�"?LZC���`P�7d��fv����^`P߉��V��,��'�6�fu�@��gh��
,Kq���O4/5C�Ųk��(s�
�'Zj�����#��f����+�*�?�/��R�W$K���d��'�ɵ�ۃ�9�!�XZr ���Hr"��Q$I(ǯ����ՕȊ&P�(bWQ"��D��%�$;���t��ТL�%���C��_��N���Ju�_����S�(�%۪��[�fM��� ����� K��ޘ#���T ����0R��� �z�Ŋr�h�_�%�;`��D�����3S�(%kF�� ��W�I�pZ����JM��<B�g�J�T��˄����±ڈ̚WJ�h� ���?�x�V �A4� D� ����i��:��Gb�_֫�̬��&u��f�K7�p�M�4�%�L&�ٵ�N�SyEb���\Db�=�ρ+BH6���2ɏ)>BtH�>Btذ���fF 4.d�^�|����@ �G� ���l��,U�q�*����?~��tԠ�+Gr9rD� g�66�иP�[�q�R�@��;r��`�h��.Cl��'LD��c�$ Hj!gb��F��,a2�XI� ��I�B���ѺA�b� II�ˆ�N�.,26��^ MH�l1_5� ��7�񔑤xD q ?����\�"�y.�vLk�T(��`+?���jŢ��������!�:k����<3#K��SX�+�����
c�R�ag�k)�L��N�?k�����V��jU%6�Pf��‹!(�M)����
/L.܋�C�D+�� ��F� NY?�"�,E{�$[���dbk۱�Wl���˚�� ˺�a)"�~aɚ�(aȚ��o �zI���Z�^�_Kl �"��tvvvvP�K���A��_4�S�TLun��ɸB{�h�e��B�/�U��X���6�_X���? ��V�`�,E����2�{�C�C����xh����h��^�A�����9��a՘/�H��4�P,]�gA�#������6'���p��+��Ԇ��#�Tg6��c�a�!eU��R$�7|�.r� �~�`�? |�.χz����������1��J�g�e�qf�MK�Rn4l*��&���� ��f�#[�2��d�Y��8�P G�`��#�PD��b�!���[�O���ԄF�� ����p�^�^!�BX��
��vR�P

5��O(� a�a�_"d�����K�*ag�I��H��#����"�D�
! �VY�)������h[%��^ӵ�ɱ*�Ȳ~�J���:n-� ����®:9n�� .d� FP��9���`�o�M����}-�����'7XQ ����`F � d�`���ى!���@{�zP��.X��ς�$��!X���|V@C3R�A���0J NH��`���������_{ �X�|�� gE<Y��=q�����X�R3��#˺���G��`�G����dY��b���~dY�E�ؑЯ�f'�B�c�����:����3�:+u��Xb��X�Xg�{+�/��%�{ d����=�mc�Nh�R<C#�e�e1*����sLW�BÒ��cN�+�1]�
m�ˈ�6���
m W��S'�Wh�Ѓ��E��L���!�y��<Z��K���o�Ā1+koB��>0a��h�01��ρ�����_ihRm1���R�^����C�|�!�J~�,��WY*�I�FK�e�-*�hB����� �A]���"���I�F4#��\iII덙+ց�rfd��P�3������6�+2��� X`�* ��WYn��ܟ;I �d�)��6ق��ܴ_�L��_F��R�Z��4��{^F)�~Y3�od^Y΀�gY3 l[�%D�^T��!R��X~��1%=�b�dy Q2���I� rg����˕��+�p�_���������!��NJ3P5�)��aɄJxY���⒏N���D��b� ���z,0��N\mh��+����:qE6툰�r���i����"8�f"�K9�P���[�w�����/��lI� qEr�����;qE6VSp�Y����4����R� ���@�r �S�9X7�� �) �1��2�� ��&l���;&�O6������%s�ftM�C�pG),�Q���i�����oBcr��>��N@��=4�<y�#����$~üW�_�;`7�&fA�t���8 L\j�sG�'W��W� ��QE��e�x��QSh�m��$?�9|�V��b��hVS"�J
&��m,�qQx�q`#?�z�K��� +k���w9��P� ��p"f>���x��b�X���?�8���* ����\��D1�����S�#+���ǜ�S�:Sg�Yt�t�}����lq��)ӕ��P0��∑;�#�r���������|�˝�h����w��ʞ2�)q]��C�g,j��@��Ǡuڅ髏E�<N'� �qн�� Ff#�F�7bͧ@�kp����1a�-�ܠlӈG�1 a�x�:@6�LF9�?��z)�5S& +��f,�&a� 9r��@_J����i��W&�L�́��R�9�����^!"v���I�I��t��I$������i�y������o)ߟV�M�?P!�������_�����~����b��p��5�d� -]L�*�' � Ckv5��`�}y#�#�Q��"�L�b���u��Y�.�52Aw�M�k��Ȣ�y��<fw�w�4@�vn!>֥���{ `)�o��O��K�� �b��]��Mr�e�3CQ~�f���<�K���ug� O����*\�����˶���h��ʁ�l�alf��o�x'�C���Wt���|X~����җ�E���W����m�� �R>�o#��� *�e$��T��� �Va�Nw�x��Z�s���m�f���Qv �|���ޅ����ĢV[�6@�@)Г��I��\�/�������)gl���՞*��N�gt�3�DYR��\���*<���K���c���w��ڍnR ��.���Qق��&Y�3�7�����o�!B�GJ-|�_J80]�
��c�؜OyM�h��Km~Q8#��3Kz� V�R?�v�f5$O���|}��B]1zOQ�p��ӂ`��)F4��1H͙d �Dz�s8�����BO�UJ�Dal���#0!@7T�ow�P���~c��C�N��h]6b%c��/pǼyi=�1P��E����>h�H@d������`V�8��eoCS�W��#k��6�C��WB�B����)�*F�,0C�2?�@Xԟ_+�U%2�q�qT�h���UPw���\�!�x�
S��3�
M�F��yHű�á���h�ڔ��lF�{�n�G�.�Z�L-n�Q��g������ ��vA�HW'�H�%g"w���ơؒ��p�����;�F�j��=�
H��ζޚ��Oi'o^�{/j�eU�Aq�=0Ef�V<t�"/ƳhI��^�`���\�s�Ƹ�D�i�ej)�*b�İ1��e ����/͞'�H�CTIثUR��M�V�ķq�4��k��2ҟe��4��f1�nyi 8*K@ԙ� �a�f5U�Pd�΂��߲𘵤�Lg�G��*% -T�G����$�Me��n���NG ��&U.Oc��
U��>C���U�Cn >�6����l�� j\��|��+�*�H��E۔����#FT3�`�]`�/H�_���v�doc.dat����Thmb�����PNG

IHDR�}W� pHYs���+ IDATx��}yxE��������� � !���K�x��'(��7�(��.���U�]��P9��\�!g8c9�}�d�>L����'�ˮ��<�L2SU]U�[���[Uo*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B���ⷮ�y�l���'�P�B�
*.r�~�
��� �1�B�
*TD@g7�'!�_N�ȿ���Ȩ��uW�B�
):� V�٧\ir��}O �"� K �+�ƅj�j��P�B�%��l�J_���8F�ӥ�t� �a��(�a���(EQ�iii[�|,�F@��ϧ.� ��<�r��;N�y�^���}�m9e�*T�Pq�3b���b� �iZg�Zg�,�Ȳl˲��<���F��aN���#�@�S��H�9_()�s��8��s6��<�%�;q���g$��j�P�B�E���WBH��"h���X�-[�l� ��{oڕ����O��2B����4�{8H�|)�����[7v�X������KKK#jjjB _x���I�������3f������ć~�@�4}�]w� \a��}��l6�t:=EQLuu����㞚�&++Kw��w�3�L&�՚���T��;�[�p�� ��9�b��5��8����)|���*T�P�Bů����Ll�$�,�_�p�H]d��]���?`Y�CQ�/mmm���y�h7 ���644�ç�?~|�0�,˶���e�;�^�w�0�@`cLLLLUU��,�:h�>�0�����?����|�a���8�e� Ü�����ʂ ��-\��˲N��8��shnn��0L3�qMӥ,��h�>QWW��u�]ͷǀ�Q���(d$}������!����cIHH�555=�t:��v�?����m޼9��v�0L�0�4M�$����o$I�'�߿����ޝ;w���v���iz���}��[��՘T�B�
���@<�T�e}�|��٢' @׊���}>��{��7��cAP
�� ���-�8��i��n���[�b��@ �#EQ�۶mο/����3�e����cǎM�i����v��jMܱc�h��++++��?���'O>D�t����o�Z�I�=�\w��9���7x��d�+V�DQԩ�7^�|����V��hѢ|�$�<xp���'?�0L�ѣG��r��Qu��t�ѻwoڍڽ#zF��7�,[����G��V �h��
Y���,��5;w$�#����sժU���Q����޽{o+))y�7
���� ��r����n޼9��S�P�B�
 r @"�4�a�Ǐa���7>�u�և�����x<���1*@3�Y0�#�<�ʲ�����S���M�6] @ʩS���i����޻ @*�����ٵ��o���t�$�*++_~��f͚ki��6��]>���� øv��q� iR|>��Ç� @EQ�����駟�o6�����7���t��{��q�"����`��n�X�����q�W�J�?q��,��X��h����8�^�d�]���s?��.$I����| �Kjjjfyy��.�뛊���$H8u��=^��KQ�
ƈj�P�B�E�o]���q������{l]��������~][��YY� |�[p���{��Y�m7nܫ$I��۷������E�vk4��#F �\ccc�ٷo��ٳg�`Ɨ��� D�����s�y��g����q�_~��)�y�5�D[^^� @���k�j�)&�I@��_�о��{N�ϧ�5 �a��{� ����yYrr��S�L�A����n��c��$I ڗ �'O���={��cǎ5�:�<x��^�a�������V����E �j��d�?� ��ҙ���U�P��"Bg5"m&�h���o��� K-Z�������f�$!:>����:����ݭ[��555bcc �+�7�|�A�dYlllw���z*�`0��2e��!C� hii��+N�L ���+�߿���jV��D5440]�t1�ݻ�� 6�����'N,�MKK3�kkk������8q����hDFKkk�_�������[�l�`0��:u���I��bY֒��u���;333����_~�����^سg�2C��('MӴ���4M3111�O�8��C��ޭ[���B��_�
*.btV@��Ns��w������w߹����ߜ9s��� �����Hg�!���dZ,���ƍ[@�bŊ�f����#G��4���굱���h'M�4��r����RSS�����T�i����h���{���Uǎ���O?�����mW^y���������;���kh���{EQ����ڤG}tb]]ݪ��,���:�� B/z1w��*\RR���v�۩�(����V�Z5�_�~�߿�-!!�����#t�v�r@||�Y��n���!� �0��l���ʺ;''gjBB��&R�A5T�P��"Cg5")�l6��իW4�#��?�q�p�O>�׎7�n��s詧���v�ګ�ڟaǬY� �/^��j��_y啖�������46��'�qȼ�>����%K���߿�E������|>��ӧO���p���Y��K/^�ؑ���faa! ё��}��&B'z���4,˶!8�W:Ψ��8.��ߣG��4MԴi�����.--=@s����qt�>}�~����+���0 ��x�X,��M&ӸY�fݫ�h�E���w5�P�B����������h?:�O�<|�611Ѱlٲ�f�Y���x��b����3bĈGz��5��8:77w�P�+��R��z��቉�#V�^��8�dgg���q8��Ddgg�hll�L�$Dz��ĉ��t�M�6m�������}��$��#˲��������d�s�=/���j5E�B��_y���5M��={6�ʒߕ��8��Z�iQQQ�6�p� �k�Z{aaa�$I��8BB�2@���}>_��;�aH�QE466R�@<�W�
*T\d��@�Ry�����ZmB�=��M�Qp�޽{k C�F�1�ٳ����{���?����q�ƽ��������Gy���<.::�����g���?NNNc��BA�ZZZ�2�i�a\�f�*�}�����v�ջv� &��8|��=6��߂ >��3�ʲ�?555�w�ކ &����e���?�9r��-[�_��%�������ljII�Å���^{��e|39�����z�s��כ����:�U�ƍ;�}�����ٓ���7�>}zJJ�u���駟����S�NM$”��h_�hQO��
LQQQ�-��n�����8F�n�Ν.�Fc���.1b��\��B�
*T�+��oz����h���rGq<Z[[�D��]*�ԣG�>"�o'I��a˲������6:����mmm?����@���ʅ�q _����u��eY�[\\����ٍ��K9���^��>�� ˲������4��nw!˲~���~��O�nذ�Q�e�E����OS><���'I����j�a øh�n���p���|��~���'OΪ��������������� �#~V�6F!� @zUU�<�$k�͛7��_����W:����/^|/���2t-++{���&��l (����QRR��q����'�Cttt6˲��芊��! ��T�B����UXK6��o۶�QQ�{�޽�������5551�����[��]w]����kjj������W_}��!wRR���t�k׮u����f΃6>����[�nmX�t�S��}����_8Eu�bbb��K��۷��Ah����uӧO��멝9sfzJJJT[[��믟!I�������o�٫W��m۶���_�r�x�������Ί����z�U�՚5��a��ի�x���� q,<�� ƒaҤI�,��.]�����3��n���,`��0j�(syy����8гgO�ѣG��^{-%'''� �l6����p� ����kx���VTT�<������y�楦��h����_�������.�P�B��N�����p�\Xs�_�w�Gڜ��5€Tq)����~Jq��q�Ϧ�� ��.�@����4I $����#�&Y~�@�6E�����Q��j�P�B�E��|�X9 J�*W����ҟM�utݮ:��鶽�.�Q�}O^����G~�1#�+�_\�XA�����CnD�J_�
*."tf�*�%�*(=� � >���H�)����F��ٔ"!K�T�Xي���O��L\h����|<��+�M$#@5T�P��"Cg5�JD��%/N#^��!��I F�� ��"R�H�X�
����X��.��q6�G����T��
*T\���{���ut�\>{��\���?�u���R�����=Ҟ������Jɓ�*T�Pq�3@x���I������k���E8�ߔ���6�'^���D��P�B�������.~y�s��*��E_���r.{:*�?�����W�B����p>��MBY�Z��t�_H���K�
*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B�
*T�P�B�
*T\(\��T�P�B��C=�;Cg �B�g���B�� ��Tu�\B� ��1��������=�ƅ�����b��h-� �t���y>����Hp��ƂCe�KJ�7vtGį��b�R4�s �- R]�}v1�l7�*�&�?D�Ε�n���d��"���I:%�n�ӊ>� ��|���� 9]���G@��O?e�۷/��q)������P������ �'�/q�*~()�HrP��h.))���o��`��ɱUWW?����x��/���w�i�B��r&.��e�����&fh�(�4 � �/����|��)0 ��0�iV>���p�A�/zǁ�~��� @������i�|~=T��Б<4���<��v��%������`����jll�����mB�,�������Ҭ_2����Ү\�2/55���d��h4f���̲l���-*..>x��WW"��ݳ��TWW��d��x�b��Q�����&�)�f���X,W�����&�!�
��{S2f-Z}�=�L��t�Zmo��H�$�X����a$¤�h��Zm,�q~���� K~~~ށ�>p����%oWH&N�4�2cƌ�.]�\a�Xzj�Z��%K^|���[�4�U�VX,�q|y������^B)*~�r�Kk�_6wI�b1������{ﵼ��ۓ���o����5M2�4}���j���t:]V\\��Ç���������ggg�ȗ#} |Ӌ�<3\�HKK�8##��q^�׻�d2].(�(���, ]߼iM� :4�d2�� ��$O�|�SF�1�j�^�Qf�$O�4]��xv ���J�x.��������Ϸ=����2 �J��U���!�,d�8�S]]�
�F���n��8ۋ���~A�`Ю�/%���5�*~�_���� 莌/..��0L��]u�������ѣ �d��oذ!����M�e������{/A�f_��رc9~��չs�ڡ�{]LPⓘɓ'wKII�У��a��W�n�]$!�S&>��Dkaf�G�}V1V�5 @:�ncƌ��a/555+�D���\�B{�����ߐ��a������p���������?=zt���---_H� @�3f �8��D{���7�xc,��O@��e�K����/�� �V�7�|sW�˵QΩ��՟���2k:�L���� ��o���J��N�4}jΜ9=h16l�e� EQ; � �����"� ���=s���b~q8����� �F�{0b]T�yuuu?D�?���rd#�Wqh�;����b~7 h�F#(��d�����t,,,� @�t����~;�����@�,e��d��������^���'v��U�y#�|ß����K�ꫯVX��1�ĵ��k�u��v [m�#^͸q�*�z��; ��O�2eQ׮]������^�� �ܹs�/,,$D�\���@�6��8N/�� �о��R? @>�t U�2|���G���U�h灄����ӻ��\.��7�����֮]�:�q�8=I��{���}(���i�x�L��7���i�K��PR��W^y��{キ�b����|��aÆ�&IR|~U~vU����^h�?�x�N�㧟~�1o޼/t:]������3ϸ u]�Lp��CÏ$IR�0��������x|p4ǎ�E1#�q+V�h@�A�"��;�N�\j4�+���LMM�'<q�D �;�`n��� �W��*���ٳg�ڳg��k��=2����ɱX��8�a���%��j2Wvvv�3�<�/���S���o��_VV&X�,��J+<b&&�N�Z}����222���������� ��>����,$�4�dӫ��s��Ac��g ���׿�(e$�����m�2��Ag����R�rE,7�4qqq���v�톜@G
��0a�������{��O��׿��.?;#���I��N���s��{D�]�|�!:��8�_�|�6��jyb��Uz��w�@�1i�U�D20r���n���P^ii�~��u��E�\���A�Qڳm���H3T�aJ\�F#Y�m�5y.�����+�����D*g���bdy��eeI/d� �x�l�Η7M���}�h���`�'�z��(�0I��h�vO�6��E�=]PP���t�;R����-~R��C=��h���^]R���N��A����R>�h.•��j+���O �.\�
˲~�H�z��^������8~M�"�=_�-�:� my$dznRrssmmmM�h�ZC�+� ��-J[��)�;�VJ��x��treBkk���)N���=%��K @;f�CZZ�~Μ9�W\q������B��lc�? >&O���8��^�zu)�< (?/ϲe��y���E�x�������?��R΅�����_z��{h�Zm
�r�Bչӡ�J�1~����i�Z�<��㩝5k�a�+��_i9@b̘1�����[p�\.�}m�#F?�0đ�<ґ"��?R����v.m�(ܨ��J����`5j�%,޾}{�����y��֫cbb� �h4Z��l����lm�6>�G���W��R\���ҥKDoHII� R�����.�N��x�|�����>t�P�����T]]��>}z�޽{w�޽�����v,��q���\��
��8F�bb�8��@���<��EP���.O��R]~m[�d����S~RzOh~���]�v}�8
¸T�t.t�P�����L�`��������d���+��_��3��� 7��d"�>���\�^̴�8�b��Vz:R��GD��,ίWxΥ.BxZ��f3?~|�w�}��`0LHHH������/��EEEŋ �ɧH����4���6��s�=g�ӟ�d���8�JP��`9�������@:��F��G�6l� R� ���"<ۘ�͝;7)//o%I��6m�f۶m��^�����-�7o�a�����<ϳs�̉F8�Ϧ�"��1ґl���rc%L��4`�ٴP� �3 {HH������ln$cW>!�#�w���۳�-[��_�Or�H�����cƏ�A:0�=du�hBu6��l��o�� PN$��Q�b�v������u_cUP��� ���9s�O#G�<���+^뒗!�g����򡉉�cu:]Wz��J�����;�,Y�G�[��e*��Gy�h2�����/J���8͆ r����N�;�
� �gϞ�o��������Z�6���vׄ ~>z���U����� ( �I�&��}�������d�\��fq����?}q��W����t>���R����'IR�=&&�TT��&�i��҃:<o� 0@��;�����n�Xr�~iQQ��[n��Dkk�|�6�t:�E�?EQ�mJh\QQ1<!!�&��:���^|��y��Q__?.::�n�e9�aH�e9Tk�U IDAT�^���hl,��4�A���i��.cǎv�5ה �y�eYA6��X� LA� �`X�-%B���߾v�Za_hG� �w$???.R�]�v9����BP�w��AyyyO���q_}�Ք����pyyy����zHrr��$�)���|��m۶|�� UHJ�Ν� ,47n�m ø�z��b�����?dȐ�<����j�M7�t��by=77w��ڵkӯ���'������<x����zANȗDB�㡇2����0 F��r�V��q�����=y������#�NN�����Eò��ЫW�XH��9Tx���lp�\� e1hqqq�cǎ�m6�����A:��' (���Y����Ea���_2��裏�������v�>��O�v���'''����@ �L�������G�u�r6�9��a�����~�킨����!B��@XZ�D��b��ݙ�z�FӴ7�.X�`����w/��X�+�2N7:Ӏ`��Y�v�z9R��iӦ=`��LRp�hn�� �b��M����J�_��S#���ǯ�z��Y�m�i����~U[[;����4M�qDZ,��z�k֮];�Ki,h��F�t��-6������)gΜy����@ ��%-eee�|� �ԉ��r�\����7vԨQ)������?2 S#�G��+������ɉG��/� HY�-l�g��jnn�MQT1�qI���U]]�2I�'Dw�1"��D�,�����&$$�z��'/kiiYʲ�b��@ ���������B�EP6��d�kll�+�w�̙�hr"D9.� ��ĉ��^���'�^�2����i��������^�re��6�<ۡC�F{�޵,�:#��$�����9����?��c�|1�7oBQT��d�cqCC��^������gh���Y˷͎``�>��~�X�z�Jd0�>���`}����N�����/TWW?����/�$O��nܸ�&)Ǐ��a�j�e[�K�Z8�c������{��)�O��x�$�C�� ����{�d�׻�̙3o�Z�n�� ø���ξ^�w�����q�� �7�S�N�
Y�����3㮻�������e�$I ;X��3 S�o߾+e<�Ϝ9s�[ZZޢi�4O�#����VWW�B�d��O���Æ K��!�Q>C֢�kd`�������?Y^^>�СC7�92@� ����$��̙3���` A�٣��c ��ꫯ�mٲe|ii�K���_�$y�a�����]�3�P]���������H�<�qA���Ҳ����E�ϷS��������/g�ƪ �����a���Zmm�̚��W|>�^��(!ouu�l��}�� �$qG�4}�eY˲!����^VV��>+����/�?����|>��g9���@�#�<r��n�ɏ��ٳg���R9�&������F�e= Ô�,���N[ss󟲳��D���+**�S���'�3@.�R�������w����`D�Dʀ�K� ��E!� �|~!Z`,��ĉ�����(����q���[[TT4�j�
e$H�X,iǏ��q���Ç߆��� ����l˲-MMM���_~�����%����0�B{�N�j�'O��*P��*<ώ@ P,��$K<xߏIUUUa������ݻwߵbŊ�����i�I48���[��n��8�n�_b�l�2���
!��#G�����F��|��'.�i�E���������&���|�ʕ+�=��}z��+jjj��ӷ��i�}��W*|>�����g�,Yr�֭['�|�c�A{�駟�)�[+ߎ$�?�744�穨��|>a������<�{�|>�7'N��[D�d)����'O�����Ti��������<%ܬ��� �ZUU��/�\���������O������ i������>�Oc��W���W+Ջ�i?�� 5�_�u������馛Ng�QRR��u�]׍_�k��6���u��U�c�l쉃ֈ�P޴i����@ �������������gPUs�СYz�Y���qE�SU�`���O=�ToQ?'DEE%/]��ꖖ�e øy�:�hѢ1$I��|��|��HC��>���=��O~��{�­�q۷o����*�qxD<>�y��A�{8���^�6�-�/Cl̉�������Ojkk[�q)�U�Ν;��UUU[Ŀϝ;�~��]�������,˶E�����/�1�&HA�E����s��~!OMM͜���nB[ ����~�(��������Z0�l>�omG��s�Ω�}�ٍEU577��������{��s�ԩ�eu��裏vE�An�dɒ�?��]�]J7 �������~�b[KK�K�qmmm�g͚�-������C��L�t����2u��4��z��wp����
�bF�12��z�UJ�ikk�0@?-A�t4���v�?��Y�N�3𩩩��e���۷_���N��T�D_�n���!ADz����?���pŪ5+++��i�LO>��۷o���/ڰaÝ/���`��� ��=���ޔ�)**zi͚5��,K}����]T�ݿ���I��^�w�ĉ��~�� ����}��w׉ ���=��|=�#^���ӧ��]\\�"�/����ף�����X���$///_��Դ���y��`苠��'�^�z��r��ӻ\��QQQ)|�
4M��տ����8}ee�F��n@
B� ����!�a�n�Z ��G]B㦦�P�a�e�|��U"�H���G^^���@@���8�� �ϷMP��!���� ��8�kjjZ��o&���[�k ��#G��N��h��Aj3�ج���y�� �?�M4MK<: �x������i[�l�8����]t���������l�~��`�����[�s��_q����� ����S�[��u�O�>W ��;v<{�ĉ7�N�z�L�$O����[[[?u���~�Ġ�����e �333sd�L����zk��ѣ{�ݻ���؅ ��� y�ƍ71 ��iii�Vi|TTT|(~ߩS�f�刍a� ��>��z��I����_RR�RYY٫^�� �q�޽{� ���x�����u9h��"��W^�U\\�TMM���@�������A�Y�Z� ����(�f���S�]vY_�����ر�)Y����!ʱ���\��k��p:�{�uY�~��$I֟8q�o<�w��� �F|���z�Qɕ��<˷5@\]]� �ё���q,˲˗/��G}t����'���������!2$����r�644�=**J9�,~&O�����m�x<�Y�u���?�pW5Zz�+@���#�����!2t:�BɄ�U��!v
�p��6��������=ϊ���WѮ �'�B.@�u��="��J>_��}q����;v��i��cǎ�GQT�… oCp` ������W__/q�1 ��i�����M]��@o��Я��M�H!���ٴ@��U��\\>��ӻt-�BP�����?���a������޽{���F0Dz h�]�v�+��2  I�1jԨ�|�>��@��+WN��Ѯ]�D�2�0��`���:-N����3� �$�Q�c�z�_�����/�Coܸ�qY���6
i��~���? ��K/�t߮n�;�!@Vii�; øo���+�n<$V���r(<��8%�㏃��uq|���-,,���a hطo�k<_3®|��l۶MraMmm�|�_8$(~{ZZZ™3g�$r�2eee�{�a�Z����}*�W__���ѣ������g���~Pss���w���q�����)���q�^� w���C�^�1�������ϟ?4�q�G}4B�����oaY�'.����\���1mڴkŮk��j�����},x�����g���r�������]������d������سg�d�{�ĉ�y�D��)�=���W�������n0� @��3�PU+N���?����� @NRR���_)JJ���[CD��� ��|0Y^��{���a3_~6��+��@����{�8���;�v�:��G��`���޽{����VXX�D��3g��`�3��nh �!nРA�4MW�cW_}�0f�������B�3�<�+k׮͇�����x�ߊ �u���/�( J�㸦���Lz#��v;Tl����V��vA� .�8��U�X�u����Sp�����=eee�d9rd���\�y����>��2��7޸M\w�e�?���Ѯ��%�t>O����0�DQT[qq�'^�� R�/��w�q��a�|���������A��ӦM���i�n����D����3����e�5�o� �\�K8_}��=h�Y|�<W���H\��q�/���>��]PP0Z����u3�B!AE�����p8N��E�`������> ��ѣӜN��M�6�W��;��s��Ɓ���D�������!C�\ϲ,%N�{��9|?tG�^��� �M�tSii��D4n�Tr�w���h<�䓷����8���֡�HC��v����o���</MӞ>}� ��֍�s�Oz�����|�8���+F�±�:th����N������o��� ���u���o��q���^&�w��ӧߨ�|v���x�p��酁@�jժU�� 6��ѣ/RUo2��d�ƞ^��H\EQ�^?�b ��������-[v Ow�Ch�i��p8B
�eY��矿N4&z��;|��\��Ww���r;s��Z��Yh�(-��MߣG��[����J0����Դ\�~���7��˂�?~\��8r��K<����ӣ�^����(����>��Q���h�H��!�~�_�ω�ӟ�4�O'���:]�hѢ���8z���������Ϸ=i����q�UVV���1��v#@��L����'M����^�I.��L�G�ъ��������FD��).O�CV׳gO�O?��[^^~ǩS��8v�����›�;vۙ3g�����sEE�C�]QQ1��t������`0\���B�D<ω��ثh���{O��ō1b����Oͱc�<�����;��ț}������m��t�W_}u��&޽��V�Z娫��%��p8���� }!��G|��LJ���Zm��_~9�^ ����^��l����z���G^vh|SS�q������Z������>����G�YT_�q���KQ�C��j�^n4�e�l�eYI$@�e�]������{<..�k�~����tq��/D��'O��ea���{��]!��}���.!䪀���롼)�[�`�h�V?s��O����i/))�(}�����F�ݻw7���ݻ����"��yab׮]m�<&���M7���1��+fZ��녴^����k��
�fUͶm�|���;�tV���[o��0��U��\@����6�$)i���oz��wk�r�v{I�MN��\�pό��/744|���u �g��3�ͽ�ex��*����귖����ҥKO({}饗�DGG�ҵ��������!\���~�R�ӧ�(�$I�������EV�n7��c���bcc%dzY�%�-[֌r����R��n�gCz�>T'����/ �U__�gʔ)����'��$�2�;v� (\����O�f��e^M&�u�v3$''�5f̘Q��e!�����R�F���_��t|���L s����dDJ�o�RF�#{������<y��СC�eff~֣G�Orss��߿�g��� �t�򷔔��]�v}377�����F�qpSS�?���F�<yR`b׮]+�v� K�.�P^^>���i�F��R��p8Ž�dff���i�}�)//���)**����?o����� �w��*��t:k!~��đ 55U82F�=F������� A6 ����gϞ����/��+Q$I��8�� !�G�4���tR�G���>���� �����h�(q����v���y���Y^^�Nss�^��B�C��Ng�{����
@�e˖o�i���sf̘� #�gϞ����}�r��(����;�cEN����g%a(9j��?H 1�as���R#Un�p4��޽{�B���}�ـ���i�t����H�����(,,�)N۽{������������Vq����Rq��˗����x��eYYY���������~Y��k�-oKCCC��^H)�4-��=z\�p�8iҤ��%��u����-wliii���l��bI�U'̸��p8”!o����x����Fr���r���Չ�Bv�$II[���G �b�(/|>��۷o���(�<%~b�,���h��T����ȑ# �6��E~,S|�Pg2�z�^��X�bł)S����'�w���c����˗WCy|�&G;�6�X, ��Ǔ��V^V�8s�̸�/�|+MӍ�֭w���\�`��JesG �� ��&�鮤���mmm���[n9�cǎ���ӯMMM�oӦM�"ܺ#֭[�$֬�lNB��5�ѣG� �m۶�B����>fI���t��GD���Ȃ�$&&^&ODz��ǀB�X��d�����*66V��9Q���Kf���>���\L�t:��u���[��B` ~6��dJ��W$���k�ڵ�ь��kSSS����>7n|\!-�|��V�$%�b�$��&Ԏ���8Y����~�Q� DFF�&***���a;��~A�?8E@��
�r# &$$Hd���k\�re��ݲ:s555^�@ 6�7n�,������• ������eYq ͝w���=U!e�{Cp��-��N�:���l;~��+-�-ݻw���E�"iSRR�<�,ˊ���c�4>� �``��ȸE\��5k*De�y��͛���t��MK��0����A2>���
�R$K�ݺu�B���8�8
k+Q&���3�<��ʟ�j�ZI��իWG�<��2 ���a%�=����+$���h4ZD��DŽ���Lk�ۯ�;w���ǏO����.x5$�g��ɧl6�c˖-������3��0�������r���������)))��|��'V�^MM�2��ay0��@�Y�
v���L&� 111��t�M!U(��h�Z��:�ΪPvH�)Y��V�*A��_��X,�8_ �N.�̆ �9Y$8����h46y��~��L�,�^/i�V��̜9��, ���|7�F����z%R"r�>��ǧB� @���O�Z���y����l6�&�������cǎ=�s��^��BJ_!��s��憆��KJJ����$aYH �X�hQ� ��-Z����6�߯| �>��ʌ6l�D���h� kyNv���a!�Y��G�3X��0�s���e�ahll�ZZZN�������*(F�)����&+�@}��7͐*����w���#D+�Ng���t���~: �%�ј)��(�m���͐��Q�����755���-��0 ...������_J��t�0Y@��ʲ���h�������C:
��C!���� ��26 ��n� ƋP�P>%���h�l!I[[[�8�V���������~K]]���ׯi2���r�<g�����b�-ǐ �!�!��5B9��-Z��\�C;nܸ�Q�F%^y�� Z��"/�eY ����8������э=ںp�¾�v��}ݺu7!��λ�SUU%q�?�WR������#��t:�* 1���gy�*^yIB���0k�����
`0�|�>}�E�����r�i�MQ���a�8� ���)�����(�@�^���ǀ|0
�K���8���?��k׮;֯_#A����L�@?~\��6 ���Q���|��F�>� � �@ ������g������_Y�%���e���H�&p:�D�����tH|||��aF�1�ј:lذ(��Y=gR��5"7�9��6>jkk��7�� F�1L����?C��{��'Y�Ӆ����,�]���j�Zɘ� OC���QQQB �J @k2��i��,�
��F����4Q: O�4-�z<q�V%����l/,� IDAT�����a�%P�_&��+V�X"�'�599��o�� �ñ�ȑ#�O�0!ҠV��50$I*nLBB>��d���Skkk��ڵ�+��#�͖_ZZ���^X�T���kFd�Ϣ]��G}4aҤI�u��g�Z�m6��N�*h�0 ��g����[ˡ�Hp�f�Ytb�$(���t:�����em��8�" c?�����ưA����g۶m�'''�9�sX,��lN�iZ���ظ����<111rA�ࢢ�$�W��G�V��v��-[[[��HQ����of$r#����<q�ĉ���󢢢2�v��V�$�1��h$���X����f̘��СCO��" :�6ۄ��l�+�o�xDBCy�/ &�'�� ]�����-33SWQQ�,$�����{��j�yiht:��eYZ~}s\\��V�'�P��$�mnnVj���Bccc5��]W���%,w�-Yv��=w���w$%%�9�sDEEٍFc"�0Z��KGGG��牉���}�_3~��\������ 8�N4�a��r�#� �D�pɗg������7o�5555J�Ѹ a�Z��4� \||���<�%Q�8�>���R��^O�t:�Q�oޖ������0��r5+�G��vڴi'nj��W�^�(u��̼���-Y����_��o�����ł P\v�_��!#���a6�;\��@dff.***Ҥ���|�ԩ/'N�����n SNPUUu��v�?@�q��aC�}�j�� �w�ݻ����[�hѶ��{� ><(MӛĖ���ܗ�F�\���C����a
]���h4��E��\\\\�&���V 1��4M� C�8]FFF��j5k4���h�PX���l��@ �B�4��z C��fˬ����
�o
�adB
�������� @���p^��%N��h�����Ç�����ټy����?-�ι���N�8�·~�c�ܹNf�N6�����beC#xU[kk뉸��~B���䑣G�NزeK��h��l�����CQ�>� ��� (}�0����=_.//O��5�!77��b�/����Hl6�"��z�DKKˑ���2@׮]O�Ⲅ��E9e�$<%�  �3l�?��ʠi�'�(v��u��f��t���`03 ��8����>�͖���)��y<���m�Z�Μ9�(j��j�ʗWb �'��B4#�ײC����"�kq_X,��Y��f�,��Q�� }���|AxL&��eY�q ˲��bgY6�v�+�~��˟Rr�������b���1������t����T��*|�%%%��G@莐Hr'�����{��O>9>a„�������jc����=|���K�.}⡇*�ː����R@g1�ܮ�ɓ'NMM���d2% 4(j���N(a�ӧ�g����O�6������]� khO�:�`���g!(un����
6�]@����㩳��Y��---��5%����B`Y�jmm.�Q2B���R��C�]��߿��0�W,��Z�؅�@(-�466edd������6t�����z��� �P]t:��|^ + �P���D�r�����C��ů}�)~ڒ��G����LD��~���ѣGoB������^o��j Y��*q=�r��8t�А@����^�e˖O
�4�����PT���Dh�|>�ٟ�� U����۹sg�����fJ�Nl8��j�\�'N�h��۸q��I�&I �����-����GIH����܂�B����y`�Z�W��GD0�� �������� �W�F�,�^OQ%�� hl6�D��4-�[�h"�򊶽3�3ꈓ%�^V��d��q,ܜ'���oMNN�3���������B[5|[Y 7f9\ h5�L�� �hG�NX�ְ68�N���P�|>�� P��� ��(����۾f͚�'�|��!C��f0���fsބ �z衇��#���\��g����/ޥ��+��'���֟�N8�f����[�n�� �Dy�3 �g�}�۽{��'R�hhh�XPP�Y��N����FZ���d2)�M���4-a���x��#����WϜ9S+/[~�l6[2d�-��2O>�d�[o��3-- Tpw�|g-�І��J��t�5���F�� >�/l֒��n�?����/�н{�D�uuuF��U�Ǝh앥� �~��W��=6}��@?eʔ+�K�,9
麵�A��G�a���jl����������-_� }&$$������d��~��]uuu����Z�y���áp�C���n�w��������/A�w�w���m`E�)�i`Fi|�@��6>�O�����o�HJJ�(���h�� �]�h"���>�E>�(K��t��@ƴ|Y E���l6�%''
^��8�M�-��b�;wn߁�xY ^���A>�NKK�k���Q�F�-���z��$WUU�f($���=!�ʕ+�
������O>�����'QQQC����(��-Й @6�>���ꖖ��H�����0��ސ�޽{_�r[[[�k���֚�f�ĉ?�[��6mZ�����z<��3I�J��C�ڵ����`RBH�Z��4�� ����� Z�I�De��x���z����w�y��������_˞{����;v�F�Q,8�<�(Jb�t�V �LacSqqq���Z�ann~g��Л�f�w��!D��`Æ _C�Ԇ"���@c� mX۴iSSUU�$pSLLL�>� ?33����>��� � ��466*[~�_�[#�m�6��XOOOv�#�'� g D3C����Sw�}��[ZZ~����k�h0$w�[�V��={&�f������X��ʛ�/����nOB8���xH��|>��!Fa�ɓ'���׿>gΜ/gΜ����j��Ç' ��E]]���:��C�1p�@KJJ��{��h� ���Duuu�~��*W��\����KNNV\o��� ���f�Y�f�����w�GU5��g�� IHH�J��D��TDEETP|+��D^ �(«�Ҥ
R����IH�Tғ��v�=�?���ٻw}}�����g��{�̙33gΙ9'~q���m��œ{�쩆�x4����JL���B ��y���0�s8<�b|��aÆZ1�2��)|�6x΄8��YXXhz�������O[�pῥLЪU����J����?����]999���ڵ� H܃M�"�O��z�ꥋ��� �= e|�?���Z�nI����O?���9>+>O#X,�`@H���.�����uE���R��>w����K`]�p���������� 9$�o޼y�DEE�^�b������yyyߦ��O>v��PHx24�8dP���Y�h4�}B��Q������'��T4���aZ��G}��V������O>��ӂ+��{�$������^�z��_�=�؋�ڵn0.������O�8I�6����*������^TTT�yMJx�Ƞ�'O
^��-Z�������v.))��f͚n�z�
���OS+**��ҥ��`0�Ϙ1c�����@�/"��#_! �6`�U�xq������Ÿ6������3g����������MKK�YPP�*##��={��M�������Q�Tb�z=�'ONJ�=M� �z���U�N'�=${��9(~���n)��]�z�����Q�ӪU�����;�E�#6n�8�5�w"0��V��C}d�۔>����i~j��Z�����»��J���:�@��h,]����ӧ���_�1bD'˲�_|�h�nݞ-..��Z�\.�w���-��������2e�~��bbbzΟ?�Ψ'�T��w�}w��>_o���1�`FFFG����ŧ].��B�r�
��f���^�7���bh>�����G)��#���Dm���ӥ�B�I�`?���=|x���L6cƌv������daa�7cƌ�-77�ҩS��8�K���} ��8>�R�B� :�> �xϭ�����f��� ���B�Sc�U�N�:��+**: �F2,�O�����Ky��o���9��������Z�6�СC{�g� �Nh��V����,�~�u�\D<���lb����R�a���A�� 6�Z�bŊ��������jŊ�Ο?���f+����oԨQk���OO�0a)˲����/>���1m۶7{�신Vj%�ڵZ�^���Zm3���cڨ�-Z�[�m%���ӦMk-z��ڵ��E�������?>'77ג�����t����%�rsskEu*G�)������,��?9*@PP�����@��f�L�r�j������J�
��ڵ�����;����ͅ��ֻ��k{CCÞ������i"�I�M%�2$e㓟 88X2�H���n�£���jQ����ټys�ԩS���1����7nܚN�:=ۿ� �ׯ_�w��{�>��8s�L}�6m���W�T������@>j�%''�~���H%l���zj2�sUK��Ǝ۬_�~�u&111�~�� �9I[SS#��� ���������:h4���c����A�P�����zR+z�0��,���z_��˲>�xǎ����>^�Ї�8\MM KqDFF��;6L���j��������=AO'e2%�/�����ʃ���V�_��z�q���v��*��~Ƹ��Zc)�۾}{UFF����`<4���q�Е��9s�Q�[���6lX��K*��v����������(��y,���!!!A0�d{���>|����ʃ��� ���'��߱c�E�������7nܝ�z����h���=۾}�œ&M:SUUe�[����h<�'�f0�V�|�}��x�Z������71>���˔��90���mG��u:���j-�nٲe����R>d�!��\�(z�쩋�������+��TΞ=�����ey�l6�Μ9�M�~���}p�۶�j������^ �^F���q���� >3���YEE�?�� �1ܪ����J��+�����Ssrr��z~Μ9�6lh @�p�¤���/^����ޫY�fGy۶m;�}���t:��;w~�d2� ����P�n:��xB �+�g�}v��_=_"����=�o�>��Y��u�&Gjj�棏>�M��TTT䖖�6^Β��ҋj��d
~��!!!�a������z�T*��������V��yT�F��s���e��L�a�!'^OUU�NAAA�;���ڗ_~�J�n|||{q�v;{���W���������i4������՝��S�T� �u����쭷�j�R�=% ����+�o�<�u����{ӬY3D@CC��1��]" ,�+v!+�J��
�{��駟��Y[[{677WX��y돂$H���8�������v�}��͛��� �� �9��o�ϝ;7��;��@&�):���nrss�_�u�ѣG����S#dˤ��c�ed��?������>�����W��IHH�5����r;v�հ��>K�.�,��t�+++/��`�\.&''g]g۶mS�}p��Y�l�����s���g�2���F|E�BCC���N�h���}���6R ����������MȆ f*�ʐ)S���ի� oo�X��/ F�ы�BCCSp~�����'�ZMr���cǎymg�n�Z8�����{�Blǎ{�d2m2d����5������8S߾}W�ܹ��+W�|��h��v{%<� ������{����A&�I8k�_S��� �3(�@��m�>��ޯ���)#`����{�� �@{财�={�L����-��v�ک���Yݻw���� ��ر���������!�����Q�j/����
�ׯ߄u��ͮ��:"�INN��ޗ���qT����>�W�^�p���Yddd4��"�bcc}���h%�p͟?��ŋ�.������dɒ�M�~���mӦM�������w�T�� 6���9�C�-����_�~�
��~��'����#B�"""|V��y��q�6mn��F?��sOP߾}�]�r�����Fw_˖-�V�?���p8��)�Y�xq��f�Z�������⿕ʿ���N��������a���q%ŷ�aX/�(~��ႇ��%/Vފ��x�ܹsۯY���ԩS[��� �L��M�=�F�h4����tjf���^�§O�~6??]O||���>�,]T��~�����^���T*#V�\y�&f�̙;�i������w^(����Nmڴy���~Z/���'����w���h0ʨ�^�����������}�V�s��a��5x��'�BBB��������,\��ehhh�ŋ� ?���)_��d�����Zm (�Cd�|��9 �4f��ܹsW���������v�����G-Z�@�V����9�N!�IHH�����h4Q���+ �(��?v��#����sqk���9������;;��]�Ǐ�P[[[ �ù��l����j�KKK�e�^��kTT�PC�7z��1�1�r�ȑ�|��p�����֙gΜ�V���M�ހ������� K6 �KKK�}߾}
��[�n�wR��ꫯzB�3ft���\XX�U�Fnn�
��D����q ��>��2�fs].??-O�Vp�W���@��W��(n+;;{�L������G�֭����߷X,��v[W���N���ķ�r�ȑ������3��1��G�
@ǣG�.�c���/�tJ�ߍ��m[WWwPx���`#��<�����[��uuu������y<�x\;�~��ٕ�w׭[��x�cbbZ��������<x��իW?�י�nݺ� !̖-[Z��-��%]�T�n�Z����Ν�ߟd�� xr*��Ճ ����`��&O�1//�1�����pI�Ru�i���̃���x�����/�e+++�}�z
_6��������}��O?�4@/�544x���d*,//?TXX��ڵk�Fc��n��������~�ѣG��ҥK{~���[6���jݲe��G���իW�7�����m}j�{8�<�@����A���'E������ 7��̏'NL&������<ۂ'���.˗/�� uΛ7o(�{���'vv8E555{�ٳg�b����'���Tx�`s�:dgg$��ڵkt�i�̷�����… �2.����_����˗/ʲ��h4��j�-�~4�[v���:�={v9]/�0�����<���='��� �/[��_bJKK�g��|،�#@ƩS��ޯ��;���W�\Y�r��^y����v�GᲲ��Μ93�Brrrf�-��4i��ن� �Ξ=��B�����#Ϣy>���V��/A�$6<�9�L� @O�J��U�V��`0�}�����*�ܓ5�K�.qW�^}�b��F ����g��N��~;v��A!6������{�c��ܫ��� �6˲�������?�9t�����™v�=�f��4h���$&&��X,ń�m۶W���Ƿ1�� �O-�S�T]-K����1?������H1<}B�f�8��'O".g2�.�T��pO�4>�Ǐ���t��e�Ng�?�𯈈�����SSS� �gXX؀|���S(c4�����}�f�$Io���m���߲,k)((���j�6V��G0D:n߾}��!�=y��{QQQm�$ Z�X�b����`�ЪU��pO��|�q�nmV�^=��8V�gQQ�6^��h�V�;�ֿ����h���Ν�hǎc:�TQQ�l�Ñg�Z��u�]=tiٲe_��ZF!?���K�%$$�X���V�u܊S�F���@�ݻw7��� n!��� (����JX-
J+4!!!~ѢEw:th�0V1m0��y+KJJf;vlPbb"�w��v�ҥ���em�}��c�|�ɠ�������Vp �X-SRR�VUU�w���=�Ѓz����ׯ��a�
����?�o?���GFF��z��j��v��bÆ O�w�}��嗾p �x��+�<�l��� IDAT��s��Ç�����`8���/���= @ҬY�n���^ɲ�977w*<�ks�3n��@��Ǐ*�WRR���-yʔ)�-� ��za�С�޿��8���[�F<�VӦM��f�]��r���?��`�Z����?��+�p2��)�ʾ�֭��t: ݊�.]����?���իpg���\���Ԓ�C4?��
�sMM�1q:���/�|DZcǞZ�lYW�\"��'O��L\�b�M�>�>^���s)���di`��*�"ܿ���1p>:��ӨQ�z�l�˥���í��***ֹ\��iӦe���Sxڴ��h�r�ʱ.���j�^�ׯ_��-�>����{��e�!�� @o�����9s�[����x.���b��1��,�.��UL3�^�?��'�<�p� n��6�{7�-���Ng)!�TWW7����,�t�����-++; %4!�eY}UUղ�ӧ���t����_�t:k�Ng��`8�t:��\�������8z����5��*++W444��m۶^<}��޽{��^0 ����3 ?���~ZTTT|n2�1 ���-B�8�Na8��P�d���}ʔ)�UVV�#�ʄ�8��d�_SS��7�����m�-�����ߨ tؿ��v��.;;�3���6�-�ԩS�.^����'O��p8JY��,�֭[o�����x-y䑔���?p���ת��� �)hhh8^RR��h4������s۠A�(++˾��WVV~���o�����7�x��t�9��j��p��r�3 S��O�í,t�#xnZ�t��wf u_�zu3ܫ�6<��������n0��֮]۲��z����$��0����:����tnn�/�Z���%.\Xe�X
X�5 c���� �w��N�:��������B�f��|������X�5Ӭ&�;׿��� ���_x�zo�Ng��ݻ���Ьo߾ &�i���(�qi7X,�%pPBV; �=���Vp+�nzΜ9� ���8�n4���Ԭ�Z�� !.�^����?� ��V��x���������,�:!D���6�{Y�5�����ju{�o?y���t�].�1;;{��j�p������ӧ�/��2����~�K�q,�0��r�ܹ��1�S�6��9bĈ!����9�se�f�o���kL&ӯ��l6g�ر�!�Q�<��������͍Ƃeٚv�����9sf��I0��������6�����i�q�ҥ�#�f��_�|y��f,eF�t:+�{��~��i�A���'n���ɓ�/Y�d�رc;��'��?���`���w��_�Ϸ���-��?b���'Z���� &Z�h่��T*��w�M����;�lٲ�Z���d�8�j�۫l6[�^����ξ0q�D:���l<嚒��-[��c0�{��u��S-���?���^蓘��2888�`0�����:u��3g�9��� ����C�O�>0666��r5�ٳg�F�Q>|�V�M����V����t�Y�e�j���dƤV��:�. ��رc�����pVV�vǎe2���t����^����jhh���z}���o����[&��srr^�뮻�^�|y�B��,..>}��՚s��՗��9�j�\�ӑ��h�R�����h#""T-Z�h�����m�65&��{��A&Lhӱc� �V"��\f��t�����~��+�>�!�/��ui;vlB���'
c��k�Z��)S�4{衇:���� hN��l�ڵo=�����諑����w����;�Ϋf���������������p8daaaڠ� E``��M�6������������:tX�
O9r��f'N읔��2(((����B^^ޑ�_�Dnn�Sj��2cƌ�bbb�8��;z��֑#G�����" �Y,�c�+V����O�;����6��)������8eYYY�L&���l�����_�n�os�̩��l�k[8D��{/��6p�@����[Ϟ=���������_��v�mo�t�^���a��l���� ���g\.W���� �0 0��ƍ{����8p�@޺u�j�=�HKKӥ�� :�Mhhh�/��rqɒ%�V�XqoVV�3����ʐeY֮T*�r�Z|��.����^�wɒ%u=z�����O��L&��hd, �]�f����8WQQQ��f3>��� mڴ�i֬Y�Z��� ��<xz s"n~��'Çy��g�v��!# H&��L&S�޽{�?�*|CD����C @>}�����zj�N��T(�#G��1bD���O�����RSS��dkhh8βl�}����ڵkG%''�e�ZO����RTTԠP(B***,���戈��bi���`�v��,""B�ꫯ�޼y�EgWt��E��k���޽{Fppp�n�W�?��!C��@:Z
�q���zjFHH� �\�0���p��f�������l�*�ajX�����Vw��e٤I�b^|��1'O���iӦ�͛7�RRR���4#F�hѲe�`BHeϞ=��=�<�O�)�aÆE��G��T*UX�ּ���Տ=�؏�.]��{!88X�q��>;v�#((��V��,��y^+�X,�Ν;�e̘1�����+�o�����-�O4_#@ � �}]/}:�V0B]R��ę�G#��ޞ����w���rR}�:E�hѢ�>��� .��~���ŋ��9�((8{ZZ����l߾����4(x߾}p8��$r����ߎ���;�|��_��@��.,��)�N{]{J�A0��c@�j� �M�K�� ��ə�����0&��4$$� ���M�Ѹ���sW``�nܸq;N�<���x�U�V����/t�…Vx��� �=!N+f�.za�-�#c|�&�;�Z��� ӕ����h4�bbb744�������,�̥���|�A��-[8x����4�ba���/++�qOMM�ɵk��:u����%��0�a(�z�5�C�MOUTTT��]��eff>�RRRrl�ʕ���ۂ��|!�<@�TbҤII���oݩS�����Y�APTT�Y˖-?�E����Qi�a>� Yz�B�%%�n4?�Ea��u�u
�>�����o��G��۷�"::ZUVVְu��*xxI�����)��r4�Rs���4�-���N�:կ}��3�F��cǎ>|�q��%�Xa�  A�ҲLC�����<z"�r�?����nw̞=���t�xH�?�t��Q9eʔ��K���9sƩ�{�����CR�+���+�f�O������zd���cP�'E�N���L/�O >⓫B;����&�p�)<��!6���J�.V J�=� E+:��)񊗦���� ��:A�����$�n��i���Q��mlb� MwB�� ૜i#G���
��c�2ti���6��� C^||�t_Ah� ��)c�s��>���Eщn��U��xH0>�dž>L���
�W���7j�ƍ�EEE����0���۳>���K�^=y�����/��B��������t"$$�Q
�.��Ex�
8He��||i�{�����=N�����ޥ�� ^���3�b��-����B�%�0)Ð^ �!$�|�1���bA�h Z�H�Pq��8��~���
������tȄ0)i�LO0��$P�@�%�\��#=�&��n���?���—��J*�Y��R���>i��BN�-�Ŗ���__���W���Q�App�W����H�g$����t�� ��?ϑ ܤ<G�cF�� �n��ٳg��t�N�.]Z����i�GA�������/}Ÿ��2,�����C��n[�N&N��0o޼�u:]"�,k�?��?��"<<+�)�_@��矗����fee� :�.-""B]__o��X� =֍i��vď�n4^b�Ѝ��x�I���I�mp��.6^9���̡���6�Y���<�gвU�?79&�U? 8�u
u8\OnҟBY)��؀z���<����@�5�'��u( -�!M+���HO6�B�@qy:>XxW��i�c��� ��ĊU�@��S�@t���X�� ��)W�C���LJ�ѫ�F�X,^� ���b%MO|�E���򦅓�b��[�_o��2^t;v�.>>����A�>p�>���g̘��� ��EH�B�O � %��š��ؠp���9-V��jT6w�������~���w�y'ޫRz%E��T��l���O�����>��R1�R���1p=e-~_J)�i-~�ߜ@���#�/� |+�-7�cK��8ʨ�bc�⧍'��#���R�Z/�e�� m���c�w��QZ~�sHJ��u�Y���?�@Z4��%V�b[y�&�� ��Hq�� ��?�����O��'�T��:������')�/�����m�m ���ȴZ�W
c>��X��ݾ/�� (鱒�#D����������b�ر�ŋ��h4�����ڂ;��sީS�����/�GGG����۰u�V#|WjTX��x��挔���O�)-�ov�'�C�͇�������NB'�fs��?� W�x?�{ڝ�����
>�KlMM�^��#�B��&�RxHц��^Q����7���?^�ۺ�wN��T���\� ���J�)Ə~��c��K)czE�t{R�-;IJ���� a���R���)��|�E������兿�������$�7��A�e%�J�q�I$�<���xK s����s�߄2b7��6�t��o���s�R��)va��b�q=�
��ǛcZ
���f�z@�Vw-))y��t�RRR>ٶm�%..� �=��Y��ЬY�f�ǿ��O��߻R���&6X����R�
x�O�P���ٝNg�Z���^��_���P��jTÆ ���t)�ײe˖¿WI
w)�!5�</%���+nGj��>��hex#e,.#���_(��v#�x����~�Yx=IJ��%7c�H��f��������� �X��:���Ⲑ����h`����w��%��~ߨΛQ���fOJ����Q�R�$���_{*\�C[��\��vn�67/��Fe�d2�,��8CRR�ʯ��*%))�488���p�������-,,�>iҤ�������2���3���i�V���7� �xغ�:Wyy�/���O��n��;=����ZA� 0k֬,�L��x��gS�N�o#K|�S
w)<������������[
nF)�,܌��#���J�)���h/�O�k[��nSj�\�=�͛���� �+g��G�
��mK=7*'���0�����>7�����)+h!m4��S2�Fc�8IHH�mp'�I�'.w,e�� ?�:\7�����f͚ބ�… �d��œ8q�%-O�:5�����~�gY��� �'���L*����f����UO>�P����j�BH}}�q�P��w"<!�B ~�[4�7n�q����EDD���oB*Y!������<�����^��=��V��_���ԭ��7����"���г ��/�JF�^}�m��p�Cʞ={ޒ��UTT������{���%%%�����Dx�9�'�D����j��V�q��r����{xڴiwn޼�񪪪ՄN��oi۶m2<Y�|��d<�[��d��!p� @� &�m4�BȩS�� iO^!��? jٲe���nhhؕ���w��x� �+���e���VJM�M��j/�ʕ+�������<�,˺���,k��_QQ�4<�3���;� ��$Ap�8m����g����ǹ!��rU���o?x������dx.g��[��_WL4��B�#�����������Bȵk׾9rd[x_죃�^:A ,H,--o��v�,[___����J�;��p�L��C'�i�&��
��� �N ��!CB6m�t�����؟���w�������7�ٳ�����6~�����z��Z��h�ZG���W�����w�}5��S�?�'z�v�I�T �ӧOĻ��{ ��xsq����}C� �dv�k׮������PWW��n����r�q���������Z���J��Dz�5���}׮]�F�]ķA��/�T�g��L��>~M�?M@�]@����Q��h%Rxg���J�b����W��3n�V�t�5:�� �S�b�>��{ ��uxC�('ζ)�h4�u��u�ի�aaa�
Es��* !F�a��\�����3[�l�7q��H���#InU��?��V�M�� �&��@|ȇ�BYq>q!��S�H%��'X}\�.�k>�q���3Q�[�hņ}��8߽��+})��]q�t�+�&�D�Ւ��,1��>RF��OR���,}} �3g�DDEE������H���9h��� �&�;@ꔯ��ѣ]SRR�o֬���>� x��hw��%NO|=�*(]9˲�X�=�V���ڡ?o��ʹ�J�%8��}�_WRF��=���9BX�l���V*/^s83�Jeo�B�姏ty�S M��&��@~�W�� ��W�r�ӧOw�ѣ��ٜ��Cx��.\���_��n�_��������_��g�,�@0�#�����X�`A��by���_WK��G#E�WNQK)�F���+WF�X�" �ˆW����̊��r�<f6���i 3R��U>'''��� ކb�)�&h�&��z?\��5�ԩS�9�������i�H����p�Ox��}"^8�M߳N{ ����m��l�[���|������z���ޟ��O����=�yyy� !���z<[#��W����:�gp�X��Q(7kL��@oh��Ќ��h��7�>� w$@$<�
�� \s+�N�� ��)^�-�Y�fqWy���^�Ν;w;�qu��-=�R<�4��pW^__?P�_���� �44y���/%���/�:v����h\Ҽy�p���<���X|!��r��(�I�;��t
��n��?��/A��խ�*T.��B@&���#��
^@~�ر1�6m�(�Mj���$z�\n5����֭�,K��G�2D��u���ĸ�ބ8^u̘1�9v�؀��� ;w�dw�uW�M�' �[SS�\XX��^�(�'&j�&�%�d4�_R
S1gΜ9�ˀ>�ߣ�r��[�� �����>��l6=!��*������牸���R�
�\����{�������={��{��G7��?�H)�����(��U�7c���@���S}������^�$O
t����J9yϞ=ˮ^�*��5k���x��'c��]Ϙ��=�/_~844t��ӧ�D嚠 n)4M�W��p;u�T7�N7vǎ���o!.��TN���ka��އ�bT����a /1 s���摘�������p8!b�~=�~FF��l6�Ų셫W��VWW?o!��hѢ��ʕ+7n�%�-==]y�…�?�0ԉw��B�d2�(���Z�Ҙ��9����T999� �[T���~��f[ضm[a�D@5v�ؠ�����������wܡ��r�20֬Y�l�֭q"�݌��
^<�>cF�� ����c
�[�n] �_�JUԆ��p�{�̙VmU͚5S��� r:�[�V�����:B�R�k�^RR2����J��$'��c��I���sӦM��ټ8--�C�ߛ�M�M��A�
�~�B�V�z���<�����_��jժVV�u%�qu.����}�z�x�� By������ ;y��]�5pW�t:BHAA����[�hQ����׊����L��F��x�����ogݣWy*���u&�i.!�-))y�f��a�$�C ��|:���=��������K�P�ݾ���YRR�����/]��"!�����C�� ����sB���}@Tyy����"W�\ّB:ԋ�)l˖-�,�Vpgr8!������t�\]II�p�˕CqB8��ud���mཇ�����?*�C��j���t999����.[�� ����o޼�B�Z��].W�M1�ܹsCA�����l�].��Ͷ��ŋwP�@Dzlq}}���X�5*��t"�0N�3��8��f[ ��'B�v����Ӿ�����{��x�b�������N��t:�N�>�(;(�+eIDAT���P��_D����^SSsoFF�п`��.\�Bqlܸ1���J4A4�W��4�֭[�Na�����[ �@0���_���0WX�����_B!yyy�Ĭ[��vB9y��0�o��f�aJ�)�7o^����ڏ�v�axF���L�8��0L��`��q��`0l�� ��w_*%,m�h�>���$����a ��˗/?�q\܂[�#���^j�q��`0|���;��p�p��(���������z��ӧw8v��5 @b~~�;��`��>p���[\\�:!�����Z�h�@����O8��h>`��$B�r��$1}��Mp8gX��߰aC1����0 S��� �j0��,{���`�<��0L!�\�ti��`H�&� %%��by�eك�d��Д�����l��������;v�X���Y�-u�\9,˖NܰaÀ���9�c!�f�],**��lٲ�p_$H�uuu�B��l^��姍F�7��ҥK��� �r�N����y>l���� !���� f�ƍ� !� 6d�<����&����,�3 s�e�⺺�)<E�l��6��0?n 6��X~~��prQ�����q�\�X���0�q�e�nٲ�%σ!|{"�����q�� ��Kj�&h�&���EEŋ Ô�-��@��{���<�0L�� z.Z����� q̘1���)***>#����y��$?~�)B7lذ�7m�t'!�e�X�����l4w �-p+���� �F<����!���+W����b���O�������) l����石��g�_�t���q��sRnn�T��t@�˗/@!���5�G�}�¸\����~;�������K9���}qN˲�����poBș3g�ŷ�b�ƍ !dÆ =AE]TWW�p�\�s��� !//�M��BRTT�*E#��<�*T�� 0��sWO�~]EE�(B����c�ĉ��� Â{9߷hͯ\�2�7�B��ŋ��@2܊�9��#G�<�������̤������������4�Z���v�o��/_~�U�V�!�,����^��5r�֭�X��2��˞{��x��~��X��v�b���#�l6g_�re:�����Լϲlu^^��"� �Px �H���������� A{�� �441R�j�:�& l�r���y_@�bŊ�U*U�ݻwOz���k���s�d�p?������t���F9���a����ς����4��7.���;�|�eY�رc'^�x���������*�_փa�ˏ=�X ��b�%&&��*8""���b9n�Z������j�:�U�V�QQQ}�z}�P����*�V� �J&�B؃2T+W���ѣ��YW�Z�̜9s�B �B�ףf�^�ն����f������c'����ٳ&h߾}&O/����DFF���wߍ{���{���֭[�y����V�[�㾗r?K���t�2�,4<<�>��r�\:����P���;1���? �5���sw������LII�V�T�9p��r��V�2666 33s����{���V���=��o��S��m~�������7��~p8z�R��f���9��N�6m!ծ�eن����T�{�� <�G��z &&f�W_}���(<��B��
���r�<�����EEE��o߾'۵k��*G� � p:�uJ�2��6y��OC��x)�Z���pBZ�)V�\��lUU�w�>յkא�mێ�F @�p8� ��$}���*�*a�Ν�@����7@\\\됐��N׻��t��u���;*�*B&�I�����x�L�V�X,��~�i�� ̴�l�����fS�d2e��t:]��d�~s�\J�B
@%�˃8��9�NŪU�z�5�;��l����'�|��jGβ,Ga�+-��Y��hǍ�\���v���e���O?������S����5�:uz�����g�y� ���>x�b�����/@|�]j�i�t:9�x ��~!$ *++�ԏ?�� �L�:t��(i��yYY�BBB�Dm)�����F�IW��)�}�١����5kּ4��{�9/�Ke�X�
�"b����111C����ꫯ 4m��k4�Vp���P(����[�-��y%�y8�_��`Y���d�III#�z�Ɓ��x�V�22�Rɲ����ݛ� �04M�W�ϩlB�P(t��(� �:˲�1c�,�޸q�r�<����Hpppk�B��t�$�q���Vkޘ1c΂Z=?~\j�:��W^IV(�k֬�^�FDD(�����d2n���Y�*��x��xI
�f͚)gΜ @�T*�\.^9������f��T���!(nexxx N�R)�Je�\.�lٲe�#�<���U���;v�%q�\.���[@i���j�:a„ Y �ԏ5j7��ɓ']�Ycc׮](�f��w�J�+Vt����~��EgΜ��t�O�ӧ�}����l�@׮]#A�S*�qPYY���j�I.��Zpp�vԨQ;v츽���u�����h\��w�u ���7 И;����Ym۶��׹~�رw6k���1c����ݹs��۶m� ������o�h4�V�^�F����r��ry0?> ��TUU��{� ݼys�����F��[�ټf�Ν}(Y�u�CB����&���U�VӦM�?}��z��#�ݾ�h4~<q��P1}:Y��J��Kо ��A��  �#�&���V��o4 �???��]�vٶo�~Wbb��M�6����ި��Z�T*%��n��h4-�����z��V�� P1�۶m3BX�Z����q�eΜ9���d+W���P(�y�w�L& ���xǙ��N�>�쫯���L& �8�q������r�j���g���Z�e������V����r�
�N&��� ���+W�dff>:u��Rx#�.��
w����j��)
]�v�.//�������$�e��JeE�֭�TUUm�x�"׿���z��555��y��sgΜqBj�:��)��� � �7o~�����N�S@��/������۶m��f͚3�����T*C �%�Z�|ԨQ��Ç�����h|:���c�����w��E��?~�����5)))����������j�{��W.��D�Ng�B� _�j�!B�k�ڵg�m�v!++k�Z��6���ry�]wݵ8""B�r�l�P� �B� /**Z������+W�gϞ��e˖ÜN��l6_
9s��IT9٦M�R�ju����#�a�&h�?M@��@��k�nT*��N�8�"�駟D�?��c�Ν�:++kNaa��Q�F޻w�e�R:lذH2��V'��4M�7�|� DI�L&˲l�\.W����X�5[,���jy�޽��l� ����aJ�Zm�����`ll�K�!��?D'ڍ���������咹\�zwyhh�266�oee�q�= ��q��ԩS'�\����o���9��l6��N�k�����z��`F�z�u���+MMM ؼy�B��C������+��(j�ī�Q���� 22R0���222�ȟy時���~_|��=�F��8�y���eee-t85���:u�Fqj�Z-��?��� �;���8��C��� �w��>]�v�L��o�ѣ��䕕�uخ��T��W�F��Y'�s��-�`���O>��mZ�vxll���ݻj��ʜNgE}}=a�O�A��r5o�m۶_����,XpoJJJ��������ۺu�J�h4��� 8�_ ���=�� ��.j�[M@� ��F^z�������:u����o��M��t:�^x��֯���R�ٜ7hР�+V�B�nݺ� ��l6ەO>����2 S�P(�6�ͥT*#�w�ǏT�R�9r�S�L�������~Gtt��֭[+��˖,Y�ŪU���1 cP*�Z���9+00�Ͳe˾�[ 5�ٹs�p�Z3o޼�R���� ����� 2�l6�(//��ѣ������Sx��X ,˚'O�|J�6.��N.�+�L&ӹ����.\ة���}���/8p�$��r��
Exbb�`,�D���o��v5˲�͛7O�X�xqZFF�t��Y����|=2���M�8��ڵk d .ls����gϞ=n�̰,۠�ju��I�����mh5*r�FÝ?�������ڵk��l��U��� W�^���o߾���<��:��Z�H����M�<�
�a�͞=;1??������ ,x��eY!+#@�ju�R��߷m�f�<y�墢"V��(Ξ=;r̘1[�z��:�?��������G
ޥ�*�l�d4A4�?|b��o�����1��?�\��M�6��; /~�Ν�Iq�^�?���� @��h�يV�Z5@�'N�#�����U��*�w�U I&��pii�73f�La�z������Vk޴i��ܴi�#V���!d�p�` !n^{�p���p�bE�?����<o�Xv���o#O�>�x}}�2�a����?������MN�����r˲�C�M�@Ǻ��}6��Jee�V�e�;v�� �3��&�)���h=�.2f̘1�ҥK��X,�!,˲����$?~�e�e-�tܾ}�K< �Q�r �hQWW�V����f����KKK�-..�z�ȑ=���4iF��7B�2eJW�c���GSA�g��.�p�1��� l6۹�/��0��j����_��o�Z�JKK�H���V�=�X�k׮}�qc0�=���=�wR��������%�x�ƻE���v������۶m{�… ӬV�q��~f˖-C��yz�6�!�0 c nǷ�@�).//o2�0�p����I����(**Z�q��d2��W�h�}ii�������2 S����;l1�Z�X�b��b9�q��ʕ+s�Zm"�n,�躺�F������(�� �K���4A4�?����p+�Ƞ��������f�����%�&MJ�;�}ž={�5o޼=�� ��=x��K�=�\?i�}��h�^�o�����Qp�p+�X��W��g„ =�ٷoߤk׮�������ҥK'�7m����f������1��C����;TVV��j��3 ������1"��K"���|��]z�~Wqq��ŋ�$����/�����z�ʕ/�ϟ?�t���N6��������m,��4h ��W_͸t��+'O� aǎ#�v{.�N�Y�f jhhؿ}��'E�����e˖����{�u��xRy��5�L�BȤI�2��| �pѣG�nW[[���t�\�zuQ�Ν;hWVV���t�k4��l҉'&�,kr:��999��� �AKI�%���j�ʲ9��H�����VTT,�X,G�����߿��VK?���h4�T�^��ŋg�c@6�������z+m���YB����3�a�z��Uy�…wBBB��c�����Ω�����1eӦMnٲ�!�d�uuu!�`0����o��> � b4���{�R�!<Mx�7Mpˠ�����z-�K].zG����v�o��� U�8�T9�iӦ�{��w�F���[]��9���U�Tn|�h��s�{�q���{����=�� � ��^�$Ν/���6�7.Ri��O�g
V�t�nݻwO9q���75� i:I�����%��<�L�_|Q+�4r�Ƞ�C�ƽ��k����½���F��S�Tܷ�~k�7H����\����@+��O��U�����>�l�7�x�Jqq1�񤷿ėYaѢEI׮]�ϝ;��� ޗ`�o;dE�b��� �4M�W�؍N ^��O��,���&(s�ক���W7���O�^}��.�;w� �U�RJ����ފ�F{�R!�~���݌(E;1m8H��T��ce��6+���Ju<�� ��_�+�@*�]�Zd��b#�V�bH�����+�5�[(�����w��JQ?�z ���*+M��`Eee�KX��Ɗ7���ބ�&!�Қ@h��%u-�\�|��a��������̙e��� ��`�έ��<2����$�`h�sayĺFť���_�����tZa�g��F�O�ac�hX�ʉ�-�9��2e���~Ѹ���|f�Y�v�?����Z��I���_b+L+Z��m�i���@���~��B�;��1@��e�V9C{+_lc4B�9���B����i������Ȯ�C�Iwֿ�Ëlw�ZI��`���|C��]���}��P6:����܍^/�H��j�)
�á�N� ��{���:����.Bֱ�S�x#�UݶV�1�_��Y��K�;!�97VR�"v'���Z������<,KY���è�Q�C)��B�å������T*�N�ӯ�b�e�Z}�X,� ��&����!hT��m�?ū��f�sd�m)p$�f�ȁe�X�!'�rn���9v�x��u_:����#ճ� �9�ʴ�:�>�E��;���[2��w�J�}����X,��i�{;9�c�>��EL��s��e���1�5F�HI9&���B+�� C��4�{��=�`�e�ob��<��,ȕ�y�e��A��n���f_�,�&��g�L�{*멜�dw
�ON)��"��Hi�Pz_� ���m�è,!$���8�=b
���ϵ�{��r߈��`0x�\.��V�Y�-W��p4}���
�d���c�]+�_�(���<�s�SԑB9�-@D��F���t^�z���z�-�\Dj�^���p!BrȄ\�7
��l��멒�c!r]��;ߴ<m�fJB.��xBH��A�=5��'$G0@���� �DG� @�u����94�^��� ���'$�� �� �T��B!�䉿��Ox���KIEND�B`�

2
LocalPackages/net.peeweek.gameplay-ingredients/Documentation~/Images/bg-source.txt


Photo by Todd Quackenbush on Unsplash
https://unsplash.com/photos/x5SRhkFajrA

8
LocalPackages/net.peeweek.gameplay-ingredients/Editor/CallTree.meta


fileFormatVersion: 2
guid: 37d3d697167f89145a81aa7bb6c0acc4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
LocalPackages/net.peeweek.gameplay-ingredients/Editor/CustomInspectors.meta


fileFormatVersion: 2
guid: b3467fc18385f3f41a4050759dc020e7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
LocalPackages/net.peeweek.gameplay-ingredients/Editor/GlobalsDebugWindow.meta


fileFormatVersion: 2
guid: e3cfe5bb18bcf554b83a3f0646547273
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

29
LocalPackages/net.peeweek.gameplay-ingredients/Editor/PropertyDrawers/BehaviourTogglePropertyDrawer.cs


using UnityEngine;
using UnityEditor;
namespace GameplayIngredients.Editor
{
[CustomPropertyDrawer(typeof(Actions.ToggleBehaviourAction.BehaviourToggle))]
public class BehaviourTogglePropertyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var toggle = property.FindPropertyRelative("State");
var bhv = property.FindPropertyRelative("Behaviour");
var toggleRect = new Rect(position);
toggleRect.xMin = toggleRect.xMax - 80;
var objRect = new Rect(position);
objRect.xMax -= 80;
toggle.intValue = EditorGUI.IntPopup(toggleRect, toggle.intValue, labels, values);
bhv.objectReferenceValue = EditorGUI.ObjectField(objRect, bhv.objectReferenceValue, typeof(Behaviour), true);
}
static GUIContent[] labels = { new GUIContent("Disable"), new GUIContent("Enable"), new GUIContent("Toggle") };
static int[] values = { 0, 1, 2 };
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Editor/PropertyDrawers/BehaviourTogglePropertyDrawer.cs.meta


fileFormatVersion: 2
guid: f9cc2708038acf742980191ecb1fa105
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

5
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Actions/ic-action-generic.png

之前 之后
宽度: 16  |  高度: 16  |  大小: 669 B

110
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Actions/ic-action-generic.png.meta


fileFormatVersion: 2
guid: 68fdae855e346504b8884bfb6d7756cd
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 9
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
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 0
aniso: 1
mipBias: -100
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
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: 2
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- serializedVersion: 2
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
vertices: []
indices:
edges: []
weights: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

7
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Actions/ic-action-rigidbody.png

之前 之后
宽度: 16  |  高度: 16  |  大小: 814 B

103
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Actions/ic-action-rigidbody.png.meta


fileFormatVersion: 2
guid: 156c6b396de456546beacc0bd53b6e07
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 10
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
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -100
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
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: 2
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

4
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Events/ic-event-generic.png

之前 之后
宽度: 16  |  高度: 16  |  大小: 766 B

115
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Events/ic-event-generic.png.meta


fileFormatVersion: 2
guid: 5beb76c73e9d9f34aa9f1092912301db
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 10
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
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -100
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
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: 2
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

47
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Misc/ic-callable.png

之前 之后
宽度: 16  |  高度: 16  |  大小: 2.0 KiB

115
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Misc/ic-callable.png.meta


fileFormatVersion: 2
guid: 322030000d8e32240a902f51e3971ef3
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 10
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
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: 1
mipBias: -100
wrapU: 1
wrapV: 1
wrapW: -1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
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: 2
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

8
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Misc/ic-timer.png

之前 之后
宽度: 16  |  高度: 16  |  大小: 853 B

91
LocalPackages/net.peeweek.gameplay-ingredients/Icons/Misc/ic-timer.png.meta


fileFormatVersion: 2
guid: 4ad9148371bb28f44a21256b05f6ecae
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 10
mipmaps:
mipMapMode: 0
enableMipMap: 1
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
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: -1
mipBias: -100
wrapU: -1
wrapV: -1
wrapW: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
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: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

18
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/DrawerAttributes/LabelAttribute.cs


using System;
namespace NaughtyAttributes
{
/// <summary>
/// Override default label
/// </summary>
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
public class LabelAttribute : DrawerAttribute
{
public string Label { get; private set; }
public LabelAttribute(string label)
{
this.Label = label;
}
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/DrawerAttributes/LabelAttribute.cs.meta


fileFormatVersion: 2
guid: e58df0ada05db63488ddd96c571d7bc1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

12
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs


using System;
namespace NaughtyAttributes
{
/// <summary>
/// Make tags appear as tag popup fields
/// </summary>
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
public class TagAttribute : DrawerAttribute
{
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs.meta


fileFormatVersion: 2
guid: ad140cd5debdba44aa6db74894a5e913
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

12
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef


{
"name": "NaughtyAttributes.Core",
"references": [],
"optionalUnityReferences": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": []
}

7
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef.meta


fileFormatVersion: 2
guid: 776d03a35f1b52c4a9aed9f56d7b4229
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

16
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef


{
"name": "NaughtyAttributes.Editor",
"references": [
"NaughtyAttributes.Core"
],
"optionalUnityReferences": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": []
}

7
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef.meta


fileFormatVersion: 2
guid: f88fb04354076c646a4107a491394033
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

16
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/LabelPropertyDrawer.cs


using UnityEngine;
using UnityEditor;
namespace NaughtyAttributes.Editor
{
[PropertyDrawer(typeof(LabelAttribute))]
public class LabelPropertyDrawer : PropertyDrawer
{
public override void DrawProperty(SerializedProperty property)
{
var labelAttribute = PropertyUtility.GetAttribute<LabelAttribute>(property);
var guiContent = new GUIContent(labelAttribute.Label);
EditorGUILayout.PropertyField(property, guiContent, true);
}
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/LabelPropertyDrawer.cs.meta


fileFormatVersion: 2
guid: efcf74639df2db34c8302355c0d29454
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

56
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs


using UnityEditor;
using System.Collections.Generic;
namespace NaughtyAttributes.Editor
{
// Original by Dylan Engelman
// http://jupiterlighthousestudio.com/custom-inspectors-unity/
// Altered by Brecht Lecluyse http://www.brechtos.com
// and Sichen Liu https://sichenn.github.io
[PropertyDrawer(typeof(TagAttribute))]
public class TagPropertyDrawer : PropertyDrawer
{
public override void DrawProperty(SerializedProperty property)
{
if (property.propertyType == SerializedPropertyType.String)
{
// generate the taglist + custom tags
List<string> tagList = new List<string>();
tagList.Add("(None)");
tagList.Add("Untagged");
tagList.AddRange(UnityEditorInternal.InternalEditorUtility.tags);
string propertyString = property.stringValue;
int index = 0;
// check if there is an entry that matches the entry and get the index
// we skip index 0 as that is a special custom case
for (int i = 1; i < tagList.Count; i++)
{
if (tagList[i] == propertyString)
{
index = i;
break;
}
}
// Draw the popup box with the current selected index
index = EditorGUILayout.Popup(property.displayName, index, tagList.ToArray());
// Adjust the actual string value of the property based on the selection
if (index > 0)
{
property.stringValue = tagList[index];
}
else
{
property.stringValue = string.Empty;
}
}
else
{
EditorGUILayout.HelpBox(property.type + " is not supported by TagAttribute\n" +
"Use string instead", MessageType.Warning);
}
}
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta


fileFormatVersion: 2
guid: f915ac324502a0e48990bfe775312665
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

50
LocalPackages/net.peeweek.gameplay-ingredients/Resources/Default_ScreenshotManager.prefab


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &3458548586705312115
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4274681909587443583}
- component: {fileID: 4200313255308878045}
m_Layer: 0
m_Name: Default_ScreenshotManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4274681909587443583
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3458548586705312115}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &4200313255308878045
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3458548586705312115}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 82e5ad90f67f2ab4f8c09dedbb3beda3, type: 3}
m_Name:
m_EditorClassIdentifier:
ScreenshotKeyCode: 292
SuperSize: 1
Prefix: Screenshot
OnBeforeScreenshot: []
OnAfterScreenshot: []

7
LocalPackages/net.peeweek.gameplay-ingredients/Resources/Default_ScreenshotManager.prefab.meta


fileFormatVersion: 2
guid: d5d0f799eba3c5247b17338b1be98808
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

31
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/GameObjectExtensions.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class GameObjectExtensions
{
public static IEnumerable<Transform> GetAllChildren(this Transform transform)
{
var stack = new Stack<Transform>();
stack.Push(transform);
while(stack.Count != 0)
{
var t = stack.Pop();
yield return t;
for (int i = 0; i < t.childCount; i++)
{
stack.Push(t.GetChild(i));
}
}
}
public static IEnumerable<GameObject> GetAllChildren(this GameObject gameObject)
{
var all = gameObject.transform.GetAllChildren();
foreach(Transform t in all)
{
yield return t.gameObject;
}
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/GameObjectExtensions.cs.meta


fileFormatVersion: 2
guid: 043df10a698bef24f85a021cc54479c2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

27
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Folder.cs


using UnityEngine;
namespace GameplayIngredients
{
[ExecuteAlways]
public class Folder : MonoBehaviour
{
public Color Color = Color.yellow;
#if UNITY_EDITOR
private void Awake()
{
Reset();
}
private void Reset()
{
gameObject.isStatic = true;
if(Application.isPlaying)
{
Destroy(this);
}
}
#endif
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Folder.cs.meta


fileFormatVersion: 2
guid: 40ebf4fc729b9924e85bf13fdbf9a6c3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {fileID: -1463847995985908582, guid: 0000000000000000d000000000000000, type: 0}
userData:
assetBundleName:
assetBundleVariant:

128
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Rigs/RigidBodyForceRig.cs


using NaughtyAttributes;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameplayIngredients.Rigs
{
[RequireComponent(typeof(Rigidbody))]
public class RigidBodyForceRig : MonoBehaviour
{
private Rigidbody m_RigidBody;
public enum EffectorType
{
Force,
ForceAtPosition,
RelativeForce,
Torque,
RelativeTorque,
Explosion
}
[BoxGroup("Configuration"), Tooltip("The kind of force to apply")]
public EffectorType type;
[BoxGroup("Configuration"), Tooltip("How to compute the force applied every frame")]
public ForceMode forceMode;
[BoxGroup("Force Properties"),Tooltip("The force or torque vector"), ShowIf("isNotExplosion")]
public Vector3 vector;
[BoxGroup("Force Properties"), Tooltip("The force or explosion position"), ShowIf("needPosition")]
public Vector3 position;
[BoxGroup("Force Properties"), Tooltip("The force scale over time")]
public AnimationCurve ForceOverTime = new AnimationCurve(new Keyframe(0, 1), new Keyframe(1, 1));
[BoxGroup("Force Properties"), ShowIf("isExplosion")]
public float explosionForce;
[BoxGroup("Force Properties"), ShowIf("isExplosion")]
public float explosionRadius;
[BoxGroup("Force Properties"), ShowIf("isExplosion")]
public float upwardsModifier;
[BoxGroup("Noise")]
public bool AddNoise = false;
[BoxGroup("Noise")]
public Vector3 NoiseScale = Vector3.one;
private float m_Time;
[SerializeField]
private float m_RandomSeed;
private void Start()
{
m_RandomSeed = Random.Range(-100, +100);
}
bool needPosition()
{
return type == EffectorType.ForceAtPosition || type == EffectorType.Explosion;
}
bool isExplosion()
{
return type == EffectorType.Explosion;
}
bool isNotExplosion()
{
return !isExplosion();
}
private void OnEnable()
{
m_RigidBody = GetComponent<Rigidbody>();
m_Time = 0.0f;
}
Vector3 GetNoise()
{
var noise = new Vector3(
Mathf.PerlinNoise(m_RandomSeed - 11.42f, m_Time + m_RandomSeed + 24.71f),
Mathf.PerlinNoise(m_RandomSeed + 17.3f, m_Time + m_RandomSeed - 1.08f),
Mathf.PerlinNoise(m_RandomSeed - 0.07f, m_Time + m_RandomSeed + 43.12f)
) * 2.0f-Vector3.one;
noise.Scale(NoiseScale);
return noise;
}
public void Update()
{
if (m_RigidBody == null)
return;
m_Time += Time.deltaTime;
Vector3 force = vector;
float attenuation = ForceOverTime.Evaluate(m_Time);
if(AddNoise)
{
force += GetNoise();
}
force *= attenuation;
switch (type)
{
default:
case EffectorType.Force:
m_RigidBody.AddForce(force, forceMode);
break;
case EffectorType.ForceAtPosition:
m_RigidBody.AddForceAtPosition(force, position, forceMode);
break;
case EffectorType.RelativeForce:
m_RigidBody.AddRelativeForce(force, forceMode);
break;
case EffectorType.Torque:
m_RigidBody.AddTorque(force, forceMode);
break;
case EffectorType.RelativeTorque:
m_RigidBody.AddRelativeTorque(force, forceMode);
break;
case EffectorType.Explosion:
m_RigidBody.AddExplosionForce(explosionForce * attenuation, position, explosionRadius, upwardsModifier, forceMode);
break;
}
}
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Rigs/RigidBodyForceRig.cs.meta


fileFormatVersion: 2
guid: 416292aabe867894e8dc3ecfbbf234a8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {fileID: 2800000, guid: 156c6b396de456546beacc0bd53b6e07, type: 3}
userData:
assetBundleName:
assetBundleVariant:

8
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/Ingredients/Timer.meta


fileFormatVersion: 2
guid: 1ebdbde62aaa7554e927640949440236
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

20
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/AudioMixSnapshotAction.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GameplayIngredients;
using GameplayIngredients.Actions;
using UnityEngine.Audio;
public class AudioMixSnapshotAction : ActionBase
{
[NonNullCheck]
public AudioMixer Mixer;
[Min(0.0f)]
public float TimeToReach = 1.0f;
public string SnapshotName = "master";
public override void Execute(GameObject instigator = null)
{
Mixer.TransitionToSnapshots(new AudioMixerSnapshot[]{ Mixer.FindSnapshot(SnapshotName)}, new float[]{ 1.0f}, TimeToReach);
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/AudioMixSnapshotAction.cs.meta


fileFormatVersion: 2
guid: 0b9f0f69fcd64a844806009285029727
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {fileID: 2800000, guid: bdcc63f36a8ac6643bbfb90bb398716a, type: 3}
userData:
assetBundleName:
assetBundleVariant:

84
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/RigidbodyAction.cs


using NaughtyAttributes;
using UnityEngine;
namespace GameplayIngredients.Actions
{
public enum RigidbodyActionType { Force, Torque, ExplosionForce, Sleep };
public enum ActionSpace { Local, World };
[ExecuteAlways]
public class RigidbodyAction : ActionBase
{
public bool ApplyOnInstigator = false;
[HideIf("ApplyOnInstigator")]
public Rigidbody m_Rigidbody;
[OnValueChanged("OnParameterTypeChanged")]
public RigidbodyActionType actionType;
bool force = true;
bool explosion;
[ShowIf("force")]
public ActionSpace actionSpace;
[ShowIf("force")]
public ForceMode forceMode;
[ShowIf("force")]
public Vector3 direction;
[ShowIf("explosion")]
public float explosionForce;
[ShowIf("explosion")]
public Vector3 explositonPosition;
[ShowIf("explosion")]
public float explosionRadius;
public override void Execute(GameObject instigator = null)
{
Rigidbody target = m_Rigidbody;
if (ApplyOnInstigator)
target = instigator.GetComponent<Rigidbody>();
if (target == null)
{
Debug.LogWarning("Could not apply RigidbodyAction to null Rigidbody");
return;
}
switch (actionType)
{
case RigidbodyActionType.Force:
if(actionSpace == ActionSpace.World)
{
target.AddForce(direction, forceMode);
}
if(actionSpace == ActionSpace.Local)
{
target.AddRelativeForce(direction, forceMode);
}
break;
case RigidbodyActionType.Torque:
if (actionSpace == ActionSpace.World)
{
target.AddTorque(direction, forceMode);
}
if (actionSpace == ActionSpace.Local)
{
target.AddRelativeTorque(direction, forceMode);
}
break;
case RigidbodyActionType.ExplosionForce:
target.AddExplosionForce(explosionForce, explositonPosition, explosionRadius, 0, forceMode);
break;
case RigidbodyActionType.Sleep:
target.Sleep();
break;
}
}
private void OnParameterTypeChanged()
{
force = (actionType == RigidbodyActionType.Force || actionType == RigidbodyActionType.Torque);
explosion = (actionType == RigidbodyActionType.ExplosionForce);
}
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/RigidbodyAction.cs.meta


fileFormatVersion: 2
guid: d3490d67f14565045b8de2af2380b379
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {fileID: 2800000, guid: 156c6b396de456546beacc0bd53b6e07, type: 3}
userData:
assetBundleName:
assetBundleVariant:

55
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/SetAnimatorParameterAction.cs


using UnityEngine;
using NaughtyAttributes;
namespace GameplayIngredients.Actions
{
public enum AnimatorParameterType { Bool, Float, Int, Trigger };
public class SetAnimatorParameterAction : ActionBase
{
public Animator animator;
public string parameterName;
[OnValueChanged("OnParameterTypeChanged")]
public AnimatorParameterType parameterType = AnimatorParameterType.Bool;
bool showFloat;
bool showInt;
bool showBool = true;
[ShowIf("showFloat")]
public float floatValue;
[ShowIf("showInt")]
public int intValue;
[ShowIf("showBool")]
public bool boolValue;
public override void Execute(GameObject instigator = null)
{
if (animator == null)
return;
switch (parameterType)
{
case AnimatorParameterType.Bool:
animator.SetBool(parameterName, boolValue);
break;
case AnimatorParameterType.Float:
animator.SetFloat(parameterName, floatValue);
break;
case AnimatorParameterType.Int:
animator.SetInteger(parameterName, intValue);
break;
case AnimatorParameterType.Trigger:
animator.SetTrigger(parameterName);
break;
}
}
private void OnParameterTypeChanged()
{
showBool = (parameterType == AnimatorParameterType.Bool);
showFloat = (parameterType == AnimatorParameterType.Float);
showInt = (parameterType == AnimatorParameterType.Int);
}
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/SetAnimatorParameterAction.cs.meta


fileFormatVersion: 2
guid: e5f9a6ca2faa0514095c2a061d47807e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

52
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/ToggleBehaviourAction.cs


using NaughtyAttributes;
using UnityEngine;
namespace GameplayIngredients.Actions
{
public class ToggleBehaviourAction : ActionBase
{
[ReorderableList]
public BehaviourToggle[] Targets;
public override void Execute(GameObject instigator = null)
{
foreach (var target in Targets)
{
if (target.Behaviour == null)
{
Debug.Log("Target is null, ignoring");
}
else
{
switch (target.State)
{
case BehaviourToggle.BehaviourToggleState.Disable:
target.Behaviour.enabled = false;
break;
case BehaviourToggle.BehaviourToggleState.Enable:
target.Behaviour.enabled = true;
break;
case BehaviourToggle.BehaviourToggleState.Toggle:
target.Behaviour.enabled = !target.Behaviour.enabled;
break;
}
}
}
}
[System.Serializable]
public struct BehaviourToggle
{
[System.Serializable]
public enum BehaviourToggleState
{
Disable = 0,
Enable = 1,
Toggle = 2
}
public Behaviour Behaviour;
public BehaviourToggleState State;
}
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/ToggleBehaviourAction.cs.meta


fileFormatVersion: 2
guid: 756d008da58a19e4dbc02fa1e3c84852
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {fileID: 2800000, guid: 225c53326635b1748868c470ea1bccce, type: 3}
userData:
assetBundleName:
assetBundleVariant:

17
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/VFXSendEventAction.cs


using GameplayIngredients.Actions;
using UnityEngine;
using UnityEngine.VFX;
public class VFXSendEventAction : ActionBase
{
public VisualEffect visualEffect;
public string eventName = "Event";
public override void Execute(GameObject instigator = null)
{
int id = Shader.PropertyToID(eventName);
var attrib = visualEffect.CreateVFXEventAttribute();
visualEffect.SendEvent(eventName, attrib);
}
}

11
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/VFXSendEventAction.cs.meta


fileFormatVersion: 2
guid: 4845d67d1445f99478775602bba410c6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

126
LocalPackages/net.peeweek.gameplay-ingredients/Runtime/LevelScripting/Actions/VFXSetPropertyAction.cs


using GameplayIngredients.Actions;
using UnityEngine;
using UnityEngine.VFX;
using NaughtyAttributes;
using UnityEngine.Serialization;
public class VFXSetPropertyAction : ActionBase
{
public enum DataType
{
Bool,
Float,
Vector2,
Vector3,
Vector4,
Texture2D,
Texture3D,
UInt,
Int
}
public VisualEffect visualEffect;
[FormerlySerializedAs("parameter")]
public string property = "Property";
public bool Override = true;
[SerializeField]
protected DataType dataType = DataType.Float;
[ShowIf("isBool")]
public bool BoolValue = false;
[ShowIf("isFloat")]
public float FloatValue = 0.0f;
[ShowIf("isVector2")]
public Vector2 Vector2Value = Vector2.zero;
[ShowIf("isVector3")]
public Vector3 Vector3Value = Vector3.zero;
[ShowIf("isVector4")]
public Vector4 Vector4Value = Vector4.zero;
[ShowIf("isTexture2D")]
public Texture2D Texture2DValue;
[ShowIf("isTexture3D")]
public Texture3D Texture3DValue;
[ShowIf("isUInt")]
public uint UIntValue = 0;
[ShowIf("isInt")]
public int IntValue = 0;
public override void Execute(GameObject instigator = null)
{
int id = Shader.PropertyToID(property);
if(HasParameter(id))
{
if (!Override)
visualEffect.ResetOverride(id);
else
{
switch (dataType)
{
case DataType.Bool: visualEffect.SetBool(id, BoolValue); break;
case DataType.Float: visualEffect.SetFloat(id, FloatValue); break;
case DataType.Vector2: visualEffect.SetVector2(id, Vector2Value); break;
case DataType.Vector3: visualEffect.SetVector3(id, Vector3Value); break;
case DataType.Vector4: visualEffect.SetVector4(id, Vector4Value); break;
case DataType.Texture2D: visualEffect.SetTexture(id, Texture2DValue); break;
case DataType.Texture3D: visualEffect.SetTexture(id, Texture3DValue); break;
case DataType.UInt: visualEffect.SetUInt(id, UIntValue); break;
case DataType.Int: visualEffect.SetInt(id, IntValue); break;
}
}
}
}
bool HasParameter(int id)
{
switch(dataType)
{
case DataType.Bool: return visualEffect.HasBool(id);
case DataType.Float: return visualEffect.HasFloat(id);
case DataType.Vector2: return visualEffect.HasVector2(id);
case DataType.Vector3: return visualEffect.HasVector3(id);
case DataType.Vector4: return visualEffect.HasVector4(id);
case DataType.Texture2D: return visualEffect.HasTexture(id);
case DataType.Texture3D: return visualEffect.HasTexture(id);
case DataType.UInt: return visualEffect.HasUInt(id);
case DataType.Int: return visualEffect.HasInt(id);
}
return false;
}
public override string GetDefaultName()
{
if (!Override)
return $"Reset VFX override for parameter :'{property}' ({dataType})";
else
{
switch (dataType)
{
case DataType.Bool: return $"{visualEffect.name} {property} {BoolValue} ";
case DataType.Float: return $"{visualEffect.name} {property} {FloatValue} ";
case DataType.Vector2: return $"{visualEffect.name} {property} {Vector2Value} ";
case DataType.Vector3: return $"{visualEffect.name} {property} {Vector3Value} ";
case DataType.Vector4: return $"{visualEffect.name} {property} {Vector4Value} ";
case DataType.Texture2D: return $"{visualEffect.name} {property} {Texture2DValue} ";
case DataType.Texture3D: return $"{visualEffect.name} {property} {Texture3DValue} ";
case DataType.UInt: return $"{visualEffect.name} {property} {UIntValue} ";
case DataType.Int: return $"{visualEffect.name} {property} {IntValue} ";
default:
return $"Set VFX <UNKNOWN> parameter :'{property}'";
}
}
}
bool isBool() { return dataType == DataType.Bool; }
bool isFloat() { return dataType == DataType.Float; }
bool isVector2() { return dataType == DataType.Vector2; }
bool isVector3() { return dataType == DataType.Vector3; }
bool isVector4() { return dataType == DataType.Vector4; }
bool isTexture2D() { return dataType == DataType.Texture2D; }
bool isTexture3D() { return dataType == DataType.Texture3D; }
bool isUInt() { return dataType == DataType.UInt; }
bool isInt() { return dataType == DataType.Int; }
}

部分文件因为文件数量过多而无法显示

正在加载...
取消
保存