Skip to content

Commit 1475fa2

Browse files
committed
Add Triggers
1 parent c69d89d commit 1475fa2

File tree

81 files changed

+3146
-247
lines changed

Some content is hidden

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

81 files changed

+3146
-247
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,7 @@ You open tracker window in `Window -> Observable Tracker`. It enables watch `Obs
10081008

10091009
Observable Tracker is intended for debugging use only as enabling tracking and capturing stacktraces is useful but has a heavy performance impact. Recommended usage is to enable both tracking and stacktraces to find subscription leaks and to disable them both when done.
10101010

1011-
### `SerializableReactiveProperty<T>`
1011+
#### `SerializableReactiveProperty<T>`
10121012

10131013
`ReactiveProperty<T>` can not use on `[SerializeField]`. However you can use `SerializableReactiveProperty<T>` instead.
10141014

@@ -1040,6 +1040,12 @@ public class NewBehaviourScript : MonoBehaviour
10401040

10411041
![image](https://github.com/Cysharp/R3/assets/46207/31be9378-846e-4635-8cc6-0b6e3954e918)
10421042

1043+
#### Triggers
1044+
1045+
R3 can handle [MonoBehaviour messages](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html) with R3.Triggers:
1046+
1047+
These can also be handled more easily by directly subscribing to observables returned by extension methods on Component/GameObject. These methods inject ObservableTrigger automaticaly.
1048+
10431049
### Godot
10441050

10451051
Godot support is for Godot 4.x.

src/R3.Unity/Assets/R3.Unity/Runtime/R3.Unity.asmdef

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,21 @@
1818
"name": "com.unity.ugui",
1919
"expression": "",
2020
"define": "R3_UGUI_SUPPORT"
21+
},
22+
{
23+
"name": "com.unity.modules.physics",
24+
"expression": "",
25+
"define": "R3_PHYSICS_SUPPORT"
26+
},
27+
{
28+
"name": "com.unity.modules.physics2d",
29+
"expression": "",
30+
"define": "R3_PHYSICS2D_SUPPORT"
31+
},
32+
{
33+
"name": "com.unity.modules.particlesystem",
34+
"expression": "",
35+
"define": "R3_PARTICLESYSTEM_SUPPORT"
2136
}
2237
],
2338
"noEngineReferences": false

src/R3.Unity/Assets/R3.Unity/Runtime/Triggers.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using UnityEngine;
2+
3+
namespace R3.Triggers
4+
{
5+
[DisallowMultipleComponent]
6+
public class ObservableAnimatorTrigger : ObservableTriggerBase
7+
{
8+
Subject<int> onAnimatorIK;
9+
10+
/// <summary>Callback for setting up animation IK (inverse kinematics).</summary>
11+
void OnAnimatorIK(int layerIndex)
12+
{
13+
if (onAnimatorIK != null) onAnimatorIK.OnNext(layerIndex);
14+
}
15+
16+
/// <summary>Callback for setting up animation IK (inverse kinematics).</summary>
17+
public Observable<int> OnAnimatorIKAsObservable()
18+
{
19+
return onAnimatorIK ?? (onAnimatorIK = new Subject<int>());
20+
}
21+
22+
Subject<Unit> onAnimatorMove;
23+
24+
/// <summary>Callback for processing animation movements for modifying root motion.</summary>
25+
void OnAnimatorMove()
26+
{
27+
if (onAnimatorMove != null) onAnimatorMove.OnNext(Unit.Default);
28+
}
29+
30+
/// <summary>Callback for processing animation movements for modifying root motion.</summary>
31+
public Observable<Unit> OnAnimatorMoveAsObservable()
32+
{
33+
return onAnimatorMove ?? (onAnimatorMove = new Subject<Unit>());
34+
}
35+
36+
protected override void RaiseOnCompletedOnDestroy()
37+
{
38+
if (onAnimatorIK != null)
39+
{
40+
onAnimatorIK.OnCompleted();
41+
}
42+
if (onAnimatorMove != null)
43+
{
44+
onAnimatorMove.OnCompleted();
45+
}
46+
}
47+
}
48+
}

src/R3.Unity/Assets/R3.Unity/Runtime/Triggers/ObservableAnimatorTrigger.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.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#if R3_UGUI_SUPPORT
2+
3+
using UnityEngine;
4+
using UnityEngine.EventSystems;
5+
6+
namespace R3.Triggers
7+
{
8+
[DisallowMultipleComponent]
9+
public class ObservableBeginDragTrigger : ObservableTriggerBase, IEventSystemHandler, IBeginDragHandler
10+
{
11+
Subject<PointerEventData> onBeginDrag;
12+
13+
void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
14+
{
15+
if (onBeginDrag != null) onBeginDrag.OnNext(eventData);
16+
}
17+
18+
public Observable<PointerEventData> OnBeginDragAsObservable()
19+
{
20+
return onBeginDrag ?? (onBeginDrag = new Subject<PointerEventData>());
21+
}
22+
23+
protected override void RaiseOnCompletedOnDestroy()
24+
{
25+
if (onBeginDrag != null)
26+
{
27+
onBeginDrag.OnCompleted();
28+
}
29+
}
30+
}
31+
}
32+
33+
#endif

src/R3.Unity/Assets/R3.Unity/Runtime/Triggers/ObservableBeginDragTrigger.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.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#if R3_UGUI_SUPPORT
2+
3+
using UnityEngine;
4+
using UnityEngine.EventSystems;
5+
6+
namespace R3.Triggers
7+
{
8+
[DisallowMultipleComponent]
9+
public class ObservableCancelTrigger : ObservableTriggerBase, IEventSystemHandler, ICancelHandler
10+
{
11+
Subject<BaseEventData> onCancel;
12+
13+
void ICancelHandler.OnCancel(BaseEventData eventData)
14+
{
15+
if (onCancel != null) onCancel.OnNext(eventData);
16+
}
17+
18+
public Observable<BaseEventData> OnCancelAsObservable()
19+
{
20+
return onCancel ?? (onCancel = new Subject<BaseEventData>());
21+
}
22+
23+
protected override void RaiseOnCompletedOnDestroy()
24+
{
25+
if (onCancel != null)
26+
{
27+
onCancel.OnCompleted();
28+
}
29+
}
30+
}
31+
}
32+
33+
#endif

src/R3.Unity/Assets/R3.Unity/Runtime/Triggers/ObservableCancelTrigger.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.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using UnityEngine;
2+
3+
namespace R3.Triggers
4+
{
5+
[DisallowMultipleComponent]
6+
public class ObservableCanvasGroupChangedTrigger : ObservableTriggerBase
7+
{
8+
Subject<Unit> onCanvasGroupChanged;
9+
10+
// Callback that is sent if the canvas group is changed
11+
void OnCanvasGroupChanged()
12+
{
13+
if (onCanvasGroupChanged != null) onCanvasGroupChanged.OnNext(Unit.Default);
14+
}
15+
16+
/// <summary>Callback that is sent if the canvas group is changed.</summary>
17+
public Observable<Unit> OnCanvasGroupChangedAsObservable()
18+
{
19+
return onCanvasGroupChanged ?? (onCanvasGroupChanged = new Subject<Unit>());
20+
}
21+
22+
protected override void RaiseOnCompletedOnDestroy()
23+
{
24+
if (onCanvasGroupChanged != null)
25+
{
26+
onCanvasGroupChanged.OnCompleted();
27+
}
28+
}
29+
}
30+
}

src/R3.Unity/Assets/R3.Unity/Runtime/Triggers/ObservableCanvasGroupChangedTrigger.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.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#if R3_PHYSICS2D_SUPPORT
2+
using UnityEngine;
3+
4+
namespace R3.Triggers
5+
{
6+
[DisallowMultipleComponent]
7+
public class ObservableCollision2DTrigger : ObservableTriggerBase
8+
{
9+
Subject<Collision2D> onCollisionEnter2D;
10+
11+
/// <summary>Sent when an incoming collider makes contact with this object's collider (2D physics only).</summary>
12+
void OnCollisionEnter2D(Collision2D coll)
13+
{
14+
if (onCollisionEnter2D != null) onCollisionEnter2D.OnNext(coll);
15+
}
16+
17+
/// <summary>Sent when an incoming collider makes contact with this object's collider (2D physics only).</summary>
18+
public Observable<Collision2D> OnCollisionEnter2DAsObservable()
19+
{
20+
return onCollisionEnter2D ?? (onCollisionEnter2D = new Subject<Collision2D>());
21+
}
22+
23+
Subject<Collision2D> onCollisionExit2D;
24+
25+
/// <summary>Sent when a collider on another object stops touching this object's collider (2D physics only).</summary>
26+
void OnCollisionExit2D(Collision2D coll)
27+
{
28+
if (onCollisionExit2D != null) onCollisionExit2D.OnNext(coll);
29+
}
30+
31+
/// <summary>Sent when a collider on another object stops touching this object's collider (2D physics only).</summary>
32+
public Observable<Collision2D> OnCollisionExit2DAsObservable()
33+
{
34+
return onCollisionExit2D ?? (onCollisionExit2D = new Subject<Collision2D>());
35+
}
36+
37+
Subject<Collision2D> onCollisionStay2D;
38+
39+
/// <summary>Sent each frame where a collider on another object is touching this object's collider (2D physics only).</summary>
40+
void OnCollisionStay2D(Collision2D coll)
41+
{
42+
if (onCollisionStay2D != null) onCollisionStay2D.OnNext(coll);
43+
}
44+
45+
/// <summary>Sent each frame where a collider on another object is touching this object's collider (2D physics only).</summary>
46+
public Observable<Collision2D> OnCollisionStay2DAsObservable()
47+
{
48+
return onCollisionStay2D ?? (onCollisionStay2D = new Subject<Collision2D>());
49+
}
50+
51+
protected override void RaiseOnCompletedOnDestroy()
52+
{
53+
if (onCollisionEnter2D != null)
54+
{
55+
onCollisionEnter2D.OnCompleted();
56+
}
57+
if (onCollisionExit2D != null)
58+
{
59+
onCollisionExit2D.OnCompleted();
60+
}
61+
if (onCollisionStay2D != null)
62+
{
63+
onCollisionStay2D.OnCompleted();
64+
}
65+
}
66+
}
67+
}
68+
#endif

src/R3.Unity/Assets/R3.Unity/Runtime/Triggers/ObservableCollision2DTrigger.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.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#if R3_PHYSICS_SUPPORT
2+
using UnityEngine;
3+
4+
namespace R3.Triggers
5+
{
6+
[DisallowMultipleComponent]
7+
public class ObservableCollisionTrigger : ObservableTriggerBase
8+
{
9+
Subject<Collision> onCollisionEnter;
10+
11+
/// <summary>OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.</summary>
12+
void OnCollisionEnter(Collision collision)
13+
{
14+
if (onCollisionEnter != null) onCollisionEnter.OnNext(collision);
15+
}
16+
17+
/// <summary>OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.</summary>
18+
public Observable<Collision> OnCollisionEnterAsObservable()
19+
{
20+
return onCollisionEnter ?? (onCollisionEnter = new Subject<Collision>());
21+
}
22+
23+
Subject<Collision> onCollisionExit;
24+
25+
/// <summary>OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider.</summary>
26+
void OnCollisionExit(Collision collisionInfo)
27+
{
28+
if (onCollisionExit != null) onCollisionExit.OnNext(collisionInfo);
29+
}
30+
31+
/// <summary>OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider.</summary>
32+
public Observable<Collision> OnCollisionExitAsObservable()
33+
{
34+
return onCollisionExit ?? (onCollisionExit = new Subject<Collision>());
35+
}
36+
37+
Subject<Collision> onCollisionStay;
38+
39+
/// <summary>OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider.</summary>
40+
void OnCollisionStay(Collision collisionInfo)
41+
{
42+
if (onCollisionStay != null) onCollisionStay.OnNext(collisionInfo);
43+
}
44+
45+
/// <summary>OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider.</summary>
46+
public Observable<Collision> OnCollisionStayAsObservable()
47+
{
48+
return onCollisionStay ?? (onCollisionStay = new Subject<Collision>());
49+
}
50+
51+
protected override void RaiseOnCompletedOnDestroy()
52+
{
53+
if (onCollisionEnter != null)
54+
{
55+
onCollisionEnter.OnCompleted();
56+
}
57+
if (onCollisionExit != null)
58+
{
59+
onCollisionExit.OnCompleted();
60+
}
61+
if (onCollisionStay != null)
62+
{
63+
onCollisionStay.OnCompleted();
64+
}
65+
}
66+
}
67+
}
68+
#endif

0 commit comments

Comments
 (0)