Skip to content

Commit 0ff5644

Browse files
authored
Merge pull request #3 from Casey-Hofland/develop
Develop
2 parents 65621fd + f5e4e0a commit 0ff5644

135 files changed

Lines changed: 4350 additions & 939 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,41 @@ All notable changes to this package will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

7+
## [1.1.0] - 2022-10-06
8+
### Added
9+
- Add a Reset item to the contextual property menu. This allows you to reset properties by right-clicking and selecting "Reset".
10+
- Add an Object Picker to the Object Drawer. Object Drawers now contain a button that, when selected, allow you to click an object in the scene in order to select is for the object field.
11+
- Add null checks to the FirstPersonCharacter and ThirdPersonCharacter2D.
12+
- Add null check in DestroySafe.
13+
- Add DestroyImmediateSafe to ExtraObject methods.
14+
- Add Layer struct. Layer can be used in much the same way you would use LayerMask. The difference is that Layer only allows the selection of a single layer, and its value represents an index. This means that Layer.value might be 8 where LayerMask.value would be 256 (1 << 8).
15+
- Add a RequiredComponent.GetComponent(GameObject, HideFlags) override. This allows to assign HideFlags on object creation. Useful for setting the HideFlags to HideFlags.HideInInspector on creation, a common use case.
16+
- Add low hanging fruit MethodImpl(MethodImplOptions.AggressiveInlining) attribute to ExtraMath operations.
17+
- Add IAuthor, an interface that, together with RequiredComponent<T>, provides an effective way to Author components from your custom scripts. CharacterController2D and SliderJoint implement this to cleanly Author a CapsuleCollider2D and ConfigurableJoint respectively. It is crucial that IAuthor be implemented properly, thus a code example has been provided in the comments of IAuthor (that is, the box you see when hovering over it in your favorite compiler). Use this as a starting point when in doubt about its proper implementation.
18+
- Add InputReaction, a format in which you may assign an Input, Processors and a ReactionMethod in order to work with input safely and efficiently.
19+
- Add utility script for finding missing scripts in a scene. Can be found under "Window/Find Missing Scripts".
20+
- Add a LocalPositionSwitch. Switch is an abstract class that will trigger UnityEvents when the switch is turned on or off based on a condition. LocalPositionSwitch is a switch that triggers when an object reaches a target local position. This format allows for quickly setting up gameplay through UnityEvent, and to easily add more switches by inheriting from Switch.
21+
- Add UnityMember and ValueRef<>. Unity Member is a serializable MemberInfo. It is modelled after UnityEvent and amazingly powerful for linking values in-editor. ValueRef<> is a wrapper for UnityMember to allow for links between value references, meaning fields and read-writeable properties. This can be used in an inspector that needs to manipulate some kind of value, but doesn't know up front what value that is going to be.
22+
- Add UnityListDefaultsAttribute. Serialized lists in Unity don't reset new classes to their defaults, which causes issues for UnityMember. By decorating a serialized list with the UnityListDefaultsAttribute, this behavior is fixed.
23+
- Add Picker2D and PickUp2D for picking up objects in 2D.
24+
- Add ValueStore<>, a wrapper that allows for a value to be stored and replaced temporarily. This is useful in PickUp as you want a rigidbody to have different settings during its PickUp state (e.g. gravity = false) but reset this value once you get out of this state.
25+
26+
### Changed
27+
- Update minimum Unity version to 2021.3.
28+
- UnityExtras.OnEvent has been renamed to UnityExtras.Events.MonoEvent. It functions the same.
29+
30+
### Removed
31+
- Remove ExtraMath.InverseSafe. Use `math.select(math.rcp(myFloat), 0f, myFloat == 0f);` instead.
32+
33+
### Fixed
34+
- Fix Line Endings in ContinuousInteraction.
35+
- The rigidbody context menu "Use 2D Drag" didn't correctly change the angular drag. This has been fixed. Additionally, the operation is recorded on the Undo stack.
36+
- Fix for DestroySafe failing inside the editor when the application is quitting.
37+
- SliderJointEditor had an incorrect handle size gizmo.
38+
- SliderJoint would log forward being zero upon conversion: now a check is in place to make sure forward is not zero.
39+
- Add Vector3.zero check before calling Quaternion.LookRotation in CharacterController2D.
40+
- Fix PickUp gyroTarget edge case. When the Pickers forward rotation was equal to Vector3.up and the PickUp.followUpwards was set to 0, the gyro target would incorrectly be set to Quaternion.identity. This has been fixed and now the PickUp will follow the same y rotation as the Picker.
41+
742
## [1.0.0] - 2022-05-20
843
### Added
944
- InputSystem 1.3.0 as a dependancy.

Editor/ContextualMenus.cs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#nullable enable
2+
using UnityEditor;
3+
using UnityEngine;
4+
5+
namespace UnityExtras.Editor
6+
{
7+
public class ContextualMenus
8+
{
9+
[InitializeOnLoadMethod]
10+
private static void InitializeContextualMenus()
11+
{
12+
EditorApplication.contextualPropertyMenu += ContextResetMenu;
13+
}
14+
15+
private static void ContextResetMenu(GenericMenu menu, SerializedProperty property)
16+
{
17+
var propertyCopy = property.Copy();
18+
19+
menu.AddItem(new GUIContent("Reset"), false, () =>
20+
{
21+
switch (propertyCopy.propertyType)
22+
{
23+
case SerializedPropertyType.AnimationCurve:
24+
propertyCopy.animationCurveValue = default;
25+
break;
26+
case SerializedPropertyType.ArraySize:
27+
propertyCopy.arraySize = default;
28+
break;
29+
case SerializedPropertyType.Boolean:
30+
propertyCopy.boolValue = default;
31+
break;
32+
case SerializedPropertyType.Bounds:
33+
propertyCopy.boundsValue = default;
34+
break;
35+
case SerializedPropertyType.BoundsInt:
36+
propertyCopy.boundsIntValue = default;
37+
break;
38+
case SerializedPropertyType.Character:
39+
break;
40+
case SerializedPropertyType.Color:
41+
propertyCopy.colorValue = default;
42+
break;
43+
case SerializedPropertyType.Enum:
44+
propertyCopy.enumValueIndex = propertyCopy.enumValueFlag = default;
45+
break;
46+
case SerializedPropertyType.ExposedReference:
47+
propertyCopy.exposedReferenceValue = default;
48+
break;
49+
case SerializedPropertyType.FixedBufferSize:
50+
break;
51+
case SerializedPropertyType.Float:
52+
propertyCopy.floatValue = default;
53+
propertyCopy.doubleValue = default;
54+
break;
55+
case SerializedPropertyType.Generic:
56+
break;
57+
case SerializedPropertyType.Gradient:
58+
break;
59+
case SerializedPropertyType.Hash128:
60+
propertyCopy.hash128Value = default;
61+
break;
62+
case SerializedPropertyType.Integer:
63+
case SerializedPropertyType.LayerMask:
64+
propertyCopy.intValue = default;
65+
propertyCopy.longValue = default;
66+
break;
67+
case SerializedPropertyType.ManagedReference:
68+
propertyCopy.managedReferenceValue = default;
69+
break;
70+
case SerializedPropertyType.ObjectReference:
71+
propertyCopy.objectReferenceValue = default;
72+
break;
73+
case SerializedPropertyType.Quaternion:
74+
propertyCopy.quaternionValue = Quaternion.identity;
75+
break;
76+
case SerializedPropertyType.Rect:
77+
propertyCopy.rectValue = default;
78+
break;
79+
case SerializedPropertyType.RectInt:
80+
propertyCopy.rectIntValue = default;
81+
break;
82+
case SerializedPropertyType.String:
83+
propertyCopy.stringValue = default;
84+
break;
85+
case SerializedPropertyType.Vector2:
86+
propertyCopy.vector2Value = default;
87+
break;
88+
case SerializedPropertyType.Vector2Int:
89+
propertyCopy.vector2IntValue = default;
90+
break;
91+
case SerializedPropertyType.Vector3:
92+
propertyCopy.vector3Value = default;
93+
break;
94+
case SerializedPropertyType.Vector3Int:
95+
propertyCopy.vector3IntValue = default;
96+
break;
97+
case SerializedPropertyType.Vector4:
98+
propertyCopy.vector4Value = default;
99+
break;
100+
}
101+
102+
propertyCopy.serializedObject.ApplyModifiedProperties();
103+
});
104+
}
105+
}
106+
}

Runtime/Input/Interactions/ContinuousInteraction.cs.meta renamed to Editor/ContextualMenus.cs.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "CaseyDeCoder.UnityExtras.Events.Editor",
3+
"rootNamespace": "UnityExtras.Events.Editor",
4+
"references": [
5+
"GUID:806b0a144ac65a74899d99f880ae9914",
6+
"GUID:746b902508456b94ea26d549837fd019",
7+
"GUID:c4879cbc2f71c10408bbd8bb857bc1f7"
8+
],
9+
"includePlatforms": [
10+
"Editor"
11+
],
12+
"excludePlatforms": [],
13+
"allowUnsafeCode": false,
14+
"overrideReferences": false,
15+
"precompiledReferences": [],
16+
"autoReferenced": true,
17+
"defineConstraints": [],
18+
"versionDefines": [],
19+
"noEngineReferences": false
20+
}

Editor/Events/CaseyDeCoder.UnityExtras.Events.Editor.asmdef.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#nullable disable
22
using UnityEditor;
3+
using UnityExtras.Editor;
34

4-
namespace UnityExtras.Editor
5+
namespace UnityExtras.Events.Editor
56
{
6-
[CustomEditor(typeof(OnEvent))]
7+
[CustomEditor(typeof(MonoEvent))]
78
[CanEditMultipleObjects]
8-
public class OnEventEditor : UnityEditor.Editor
9+
public class MonoEventEditor : UnityEditor.Editor
910
{
1011
private SerializedProperty _eventTrigger;
1112
private SerializedProperty _checkTag;
@@ -28,20 +29,21 @@ public class OnEventEditor : UnityEditor.Editor
2829

2930
private void OnEnable()
3031
{
31-
var onEvent = target as OnEvent;
32-
_eventTrigger = serializedObject.FindAutoProperty(nameof(onEvent.eventTrigger));
33-
_checkTag = serializedObject.FindAutoProperty(nameof(onEvent.checkTag));
34-
_collisionTag = serializedObject.FindAutoProperty(nameof(onEvent.collisionTag));
35-
_collisionForce = serializedObject.FindAutoProperty(nameof(onEvent.collisionForce));
36-
_triggerOnce = serializedObject.FindAutoProperty(nameof(onEvent.triggerOnce));
32+
var monoEvent = target as MonoEvent;
3733

38-
_unityEvent = serializedObject.FindAutoProperty(nameof(onEvent.unityEvent));
39-
_colliderEvent = serializedObject.FindAutoProperty(nameof(onEvent.colliderEvent));
40-
_collider2DEvent = serializedObject.FindAutoProperty(nameof(onEvent.collider2DEvent));
41-
_collisionEvent = serializedObject.FindAutoProperty(nameof(onEvent.collisionEvent));
42-
_collision2DEvent = serializedObject.FindAutoProperty(nameof(onEvent.collision2DEvent));
34+
_eventTrigger = serializedObject.FindAutoProperty(nameof(monoEvent.eventTrigger));
35+
_checkTag = serializedObject.FindAutoProperty(nameof(monoEvent.checkTag));
36+
_collisionTag = serializedObject.FindAutoProperty(nameof(monoEvent.collisionTag));
37+
_collisionForce = serializedObject.FindAutoProperty(nameof(monoEvent.collisionForce));
38+
_triggerOnce = serializedObject.FindAutoProperty(nameof(monoEvent.triggerOnce));
4339

44-
_sendDebugMessage = serializedObject.FindAutoProperty(nameof(onEvent.sendDebugMessage));
40+
_unityEvent = serializedObject.FindAutoProperty(nameof(monoEvent.unityEvent));
41+
_colliderEvent = serializedObject.FindAutoProperty(nameof(monoEvent.colliderEvent));
42+
_collider2DEvent = serializedObject.FindAutoProperty(nameof(monoEvent.collider2DEvent));
43+
_collisionEvent = serializedObject.FindAutoProperty(nameof(monoEvent.collisionEvent));
44+
_collision2DEvent = serializedObject.FindAutoProperty(nameof(monoEvent.collision2DEvent));
45+
46+
_sendDebugMessage = serializedObject.FindAutoProperty(nameof(monoEvent.sendDebugMessage));
4547

4648
UpdateVisibility();
4749
}
@@ -85,35 +87,35 @@ private void UpdateVisibility()
8587
{
8688
switch (_eventTrigger.enumValueIndex)
8789
{
88-
case (int)OnEvent.EventTrigger.OnTriggerEnter:
89-
case (int)OnEvent.EventTrigger.OnTriggerStay:
90-
case (int)OnEvent.EventTrigger.OnTriggerExit:
90+
case (int)MonoEvent.MonoEventTrigger.OnTriggerEnter:
91+
case (int)MonoEvent.MonoEventTrigger.OnTriggerStay:
92+
case (int)MonoEvent.MonoEventTrigger.OnTriggerExit:
9193
showTagFields = true;
9294
showCollisionFields = false;
9395
currentEvent = _colliderEvent;
9496
break;
95-
case (int)OnEvent.EventTrigger.OnTriggerEnter2D:
96-
case (int)OnEvent.EventTrigger.OnTriggerStay2D:
97-
case (int)OnEvent.EventTrigger.OnTriggerExit2D:
97+
case (int)MonoEvent.MonoEventTrigger.OnTriggerEnter2D:
98+
case (int)MonoEvent.MonoEventTrigger.OnTriggerStay2D:
99+
case (int)MonoEvent.MonoEventTrigger.OnTriggerExit2D:
98100
showTagFields = true;
99101
showCollisionFields = false;
100102
currentEvent = _collider2DEvent;
101103
break;
102-
case (int)OnEvent.EventTrigger.OnCollisionEnter:
103-
case (int)OnEvent.EventTrigger.OnCollisionStay:
104-
case (int)OnEvent.EventTrigger.OnCollisionExit:
104+
case (int)MonoEvent.MonoEventTrigger.OnCollisionEnter:
105+
case (int)MonoEvent.MonoEventTrigger.OnCollisionStay:
106+
case (int)MonoEvent.MonoEventTrigger.OnCollisionExit:
105107
showTagFields = true;
106108
showCollisionFields = true;
107109
currentEvent = _collisionEvent;
108110
break;
109-
case (int)OnEvent.EventTrigger.OnCollisionEnter2D:
110-
case (int)OnEvent.EventTrigger.OnCollisionStay2D:
111-
case (int)OnEvent.EventTrigger.OnCollisionExit2D:
111+
case (int)MonoEvent.MonoEventTrigger.OnCollisionEnter2D:
112+
case (int)MonoEvent.MonoEventTrigger.OnCollisionStay2D:
113+
case (int)MonoEvent.MonoEventTrigger.OnCollisionExit2D:
112114
showTagFields = true;
113115
showCollisionFields = true;
114116
currentEvent = _collision2DEvent;
115117
break;
116-
case (int)OnEvent.EventTrigger.None:
118+
case (int)MonoEvent.MonoEventTrigger.None:
117119
showTagFields = false;
118120
showCollisionFields = false;
119121
currentEvent = null;

Editor/ExtraEditorGUILayout.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#nullable enable
2+
using UnityEditor;
3+
using UnityEngine;
4+
5+
namespace UnityExtras.Editor
6+
{
7+
public sealed class ExtraEditorGUILayout
8+
{
9+
public static Object ScriptField(Object target)
10+
{
11+
using (new EditorGUI.DisabledScope(true))
12+
{
13+
var monoScript = target is MonoBehaviour monoBehaviour
14+
? MonoScript.FromMonoBehaviour(monoBehaviour)
15+
: target is ScriptableObject scriptableObject
16+
? MonoScript.FromScriptableObject(scriptableObject)
17+
: throw new System.ArgumentException($"{target} needs to be either a {nameof(MonoBehaviour)} or {nameof(ScriptableObject)}.");
18+
return EditorGUILayout.ObjectField("Script", monoScript, target.GetType(), false);
19+
}
20+
}
21+
22+
public static SerializedProperty DrawInspectorGUI(SerializedProperty from) => DrawInspectorGUI(from, from);
23+
public static SerializedProperty DrawInspectorGUI(SerializedProperty from, SerializedProperty until)
24+
{
25+
from = from.Copy();
26+
while (from.NextVisible(false) && !Same(from, until))
27+
{
28+
EditorGUILayout.PropertyField(from, from.hasVisibleChildren);
29+
}
30+
31+
return from;
32+
33+
static bool Same(SerializedProperty lhs, SerializedProperty rhs) => lhs.propertyPath == rhs.propertyPath
34+
&& lhs.propertyType == rhs.propertyType
35+
&& lhs.serializedObject == rhs.serializedObject;
36+
//&& lhs.name == rhs.name
37+
//&& lhs.type == rhs.type
38+
}
39+
}
40+
}

Editor/ExtraEditorGUILayout.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)