├── images └── inscpector.png ├── SteamVRInputObservables.unitypackage ├── Assets └── SteamVRInputObservables │ ├── Resources │ └── SteamVREventTrigger.prefab │ ├── Triggers │ ├── GripInputEventTrigger.cs │ ├── SystemInputEventTrigger.cs │ ├── ApplicationMenuInputEventTrigger.cs │ ├── TouchpadInputEventTrigger.cs │ ├── TriggerInputEventTrigger.cs │ └── InputEventsBase.cs │ ├── SteamVREventTrigger.cs │ ├── Exampple │ └── InputTest.cs │ ├── SteamVREventTriggerExtensions.cs │ └── ObservableSteamInput.cs ├── LICENSE └── README.md /images/inscpector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TORISOUP/SteamVRInputObservables/HEAD/images/inscpector.png -------------------------------------------------------------------------------- /SteamVRInputObservables.unitypackage: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TORISOUP/SteamVRInputObservables/HEAD/SteamVRInputObservables.unitypackage -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/Resources/SteamVREventTrigger.prefab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TORISOUP/SteamVRInputObservables/HEAD/Assets/SteamVRInputObservables/Resources/SteamVREventTrigger.prefab -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/Triggers/GripInputEventTrigger.cs: -------------------------------------------------------------------------------- 1 | namespace SteamVRInputObservables 2 | { 3 | public class GripInputEventTrigger : InputEventsBase 4 | { 5 | protected override ulong ButtonMask 6 | { 7 | get { return SteamVR_Controller.ButtonMask.Grip; } 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/Triggers/SystemInputEventTrigger.cs: -------------------------------------------------------------------------------- 1 | namespace SteamVRInputObservables 2 | { 3 | public class SystemInputEventTrigger : InputEventsBase 4 | { 5 | protected override ulong ButtonMask 6 | { 7 | get { return SteamVR_Controller.ButtonMask.System; } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/Triggers/ApplicationMenuInputEventTrigger.cs: -------------------------------------------------------------------------------- 1 | namespace SteamVRInputObservables 2 | { 3 | public class ApplicationMenuInputEventTrigger : InputEventsBase 4 | { 5 | protected override ulong ButtonMask 6 | { 7 | get { return SteamVR_Controller.ButtonMask.ApplicationMenu; } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/Triggers/TouchpadInputEventTrigger.cs: -------------------------------------------------------------------------------- 1 | using UniRx; 2 | using UnityEngine; 3 | 4 | namespace SteamVRInputObservables 5 | { 6 | public class TouchpadInputEventTrigger : InputEventsBase 7 | { 8 | protected override ulong ButtonMask 9 | { 10 | get { return SteamVR_Controller.ButtonMask.Touchpad; } 11 | } 12 | 13 | private ReactiveProperty _axis; 14 | 15 | public IReactiveProperty Axis 16 | { 17 | get 18 | { 19 | if (_axis != null) return _axis; 20 | var defaultValue = Device != null ? Device.GetAxis() : Vector2.zero; 21 | return _axis = new ReactiveProperty(defaultValue); 22 | } 23 | } 24 | 25 | 26 | new void Update() 27 | { 28 | base.Update(); 29 | if (Device != null) 30 | { 31 | _axis.Value = Device.GetAxis(); 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 TORISOUP 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/Triggers/TriggerInputEventTrigger.cs: -------------------------------------------------------------------------------- 1 | using UniRx; 2 | 3 | namespace SteamVRInputObservables 4 | { 5 | public class TriggerInputEventTrigger : InputEventsBase 6 | { 7 | 8 | protected override ulong ButtonMask 9 | { 10 | get { return SteamVR_Controller.ButtonMask.Trigger; } 11 | } 12 | 13 | private ReactiveProperty _axisX; 14 | 15 | public IReactiveProperty AxisX 16 | { 17 | get 18 | { 19 | if (_axisX != null) return _axisX; 20 | var defaultValue = Device != null ? Device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger).x : 0; 21 | return _axisX = new FloatReactiveProperty(defaultValue); 22 | } 23 | } 24 | 25 | new void Update() 26 | { 27 | base.Update(); 28 | if (_axisX != null) 29 | { 30 | _axisX.Value = Device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger).x; 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/SteamVREventTrigger.cs: -------------------------------------------------------------------------------- 1 | using UniRx; 2 | using UnityEngine; 3 | 4 | namespace SteamVRInputObservables 5 | { 6 | public class SteamVREventTrigger : MonoBehaviour 7 | { 8 | public static SteamVREventTrigger Instance; 9 | 10 | private void Awake() 11 | { 12 | if (Instance == null) 13 | { 14 | Instance = this; 15 | return; 16 | } 17 | else if (Instance == this) 18 | { 19 | return; 20 | } 21 | 22 | Destroy(this); 23 | } 24 | 25 | [SerializeField] 26 | private GameObject _leftController; 27 | [SerializeField] 28 | private GameObject _rightController; 29 | 30 | public GameObject LeftController 31 | { 32 | get { return _leftController ?? (_leftController = GameObject.Find("Controller (left)")); } 33 | } 34 | 35 | public GameObject RightController 36 | { 37 | get { return _rightController ?? (_rightController = GameObject.Find("Controller (right)")); } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/Triggers/InputEventsBase.cs: -------------------------------------------------------------------------------- 1 | using UniRx; 2 | using UniRx.Triggers; 3 | 4 | namespace SteamVRInputObservables 5 | { 6 | public abstract class InputEventsBase : ObservableTriggerBase 7 | { 8 | protected SteamVR_Controller.Device Device; 9 | 10 | protected abstract ulong ButtonMask { get; } 11 | 12 | private Subject _onTouchDown; 13 | private Subject _onTouchUp; 14 | private Subject _onPressDown; 15 | private Subject _onPressUp; 16 | private ReactiveProperty _onPress; 17 | private ReactiveProperty _onTouch; 18 | 19 | public IObservable OnTouchDown 20 | { 21 | get { return _onTouchDown ?? (_onTouchDown = new Subject()); } 22 | } 23 | 24 | public IObservable OnTouchUp 25 | { 26 | get { return _onTouchUp ?? (_onTouchUp = new Subject()); } 27 | } 28 | 29 | public IObservable OnPressDown 30 | { 31 | get { return _onPressDown ?? (_onPressDown = new Subject()); } 32 | } 33 | 34 | public IObservable OnPressUp 35 | { 36 | get { return _onPressUp ?? (_onPressUp = new Subject()); } 37 | } 38 | 39 | public IReadOnlyReactiveProperty OnPress 40 | { 41 | get { return _onPress ?? (_onPress = new BoolReactiveProperty(false)); } 42 | } 43 | 44 | public IReadOnlyReactiveProperty OnTouch 45 | { 46 | get { return _onTouch ?? (_onTouch = new BoolReactiveProperty(false)); } 47 | } 48 | 49 | void Start() 50 | { 51 | var trackedObject = GetComponent(); 52 | Device = SteamVR_Controller.Input((int)trackedObject.index); 53 | } 54 | 55 | protected void Update() 56 | { 57 | if (_onPress != null) 58 | { 59 | _onPress.Value = Device.GetPress(ButtonMask); 60 | } 61 | if (_onTouch != null && Device.GetTouch(ButtonMask)) 62 | { 63 | _onTouch.Value = Device.GetTouch(ButtonMask); 64 | } 65 | 66 | 67 | if (_onTouchDown != null && Device.GetTouchDown(ButtonMask)) 68 | { 69 | _onTouchDown.OnNext(Unit.Default); 70 | } 71 | 72 | if (_onTouchUp != null && Device.GetTouchUp(ButtonMask)) 73 | { 74 | _onTouchUp.OnNext(Unit.Default); 75 | } 76 | 77 | if (_onPressDown != null && Device.GetPressDown(ButtonMask)) 78 | { 79 | _onPressDown.OnNext(Unit.Default); 80 | } 81 | 82 | if (_onPressUp != null && Device.GetPressUp(ButtonMask)) 83 | { 84 | _onPressUp.OnNext(Unit.Default); 85 | } 86 | 87 | } 88 | 89 | protected override void RaiseOnCompletedOnDestroy() 90 | { 91 | if (_onTouchDown != null) _onTouchDown.OnCompleted(); 92 | if (_onTouchUp != null) _onTouchUp.OnCompleted(); 93 | if (_onPressUp != null) _onPressUp.OnCompleted(); 94 | if (_onPressDown != null) _onPressDown.OnCompleted(); 95 | if (_onPress != null) _onPress.Dispose(); 96 | if (_onTouch != null) _onTouch.Dispose(); 97 | } 98 | 99 | 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #SteamVRInputObservables 2 | 3 | SteamVRInputObservablesは「[SteamVR Plugin](https://www.assetstore.unity3d.com/en/#!/content/32647)」におけるControllerのInputEventをObservableとして扱えるようにするAssetです 4 | 5 | ## 導入方法 6 | 7 | SteamVRInputObservables.unitypackageをプロジェクトにインポートしてください。 8 | [UniRx](https://github.com/neuecc/UniRx)が別途必要となるため、こちらもインポートしてください。 9 | 10 | ## 使い方 11 | 12 | 1. 管理用のPrefab `SteamVRInputObservables/Resouces/SteamVREventTrigger` をシーンに配置して下さい 13 | 2. `SteamVREventTrigger`のInspectorViewより、`Left Controller`と`Right Controller`を設定して下さい 14 | ![InspectorView](https://raw.githubusercontent.com/TORISOUP/SteamVRInputObservables/master/images/inscpector.png) 15 | 3. `ObservableSteamInput.XXXXX` または `this.XXXXAsObservable()` の形式でストリームを取得できるようになります 16 | `ObservableSteamInput.XXX`の方はControllerが破棄されない限りOnCompletedは発行されません 17 | `this.XXXXAsObservable()`の方はthisが指すコンポーネントが破棄されると自動でOnCompletedを発行します 18 | 19 | ```csharp 20 | using SteamVRInputObservables; 21 | using UniRx; 22 | using UnityEngine; 23 | 24 | namespace SteamVRInputObservablesSample 25 | { 26 | public class InputTest : MonoBehaviour 27 | { 28 | void Start() 29 | { 30 | ObservableSteamInput.OnRightTouchPadTouchDown() 31 | .Subscribe(_ => Debug.Log("OnRightTouchPadTouchDown")) 32 | .AddTo(this); 33 | 34 | this.OnRightTouchPadTouchDownAsObservable() 35 | .Subscribe(_ => Debug.Log("OnRightTouchPadTouchDown")); 36 | } 37 | 38 | } 39 | } 40 | ``` 41 | 42 | ```csharp 43 | using SteamVRInputObservables; 44 | using UniRx; 45 | using UnityEngine; 46 | 47 | namespace SteamVRInputObservablesSample 48 | { 49 | public class InputTest2 : MonoBehaviour 50 | { 51 | void Start() 52 | { 53 | #region Right 54 | #region Trigger 55 | this.OnRightTriggerPressDownAsObservable() 56 | .Subscribe(_ => Debug.Log("Right Trigger PressDown")); 57 | this.OnRightTriggerPressUpAsObservable() 58 | .Subscribe(_ => Debug.Log("Right Trigger PressUp")); 59 | this.RightTriggerPress() 60 | .Subscribe(x => Debug.Log("Right Trigger Press:" + x)); 61 | 62 | this.OnRightTriggerTouchDownAsObservable() 63 | .Subscribe(_ => Debug.Log("Right Trigger TouchDown")); 64 | this.OnRightTriggerTouchUpAsObservable() 65 | .Subscribe(_ => Debug.Log("Right Trigger TouchUp")); 66 | 67 | this.RightTriggerValue() 68 | .Subscribe(x => Debug.Log("Right Trigger Value:" + x)); 69 | #endregion 70 | 71 | #region TopuchPad 72 | this.OnRightTouchPadPressDownAsObservable() 73 | .Subscribe(_ => Debug.Log("Right TouchPad PressDown")); 74 | this.OnRightTouchPadPressUpAsObservable() 75 | .Subscribe(_ => Debug.Log("Right TouchPad PressUp")); 76 | this.RightTouchPadPress() 77 | .Subscribe(x => Debug.Log("Right TouchPad Press:" + x)); 78 | 79 | this.OnRightTouchPadTouchDownAsObservable() 80 | .Subscribe(_ => Debug.Log("Right TouchPad TouchDown")); 81 | this.OnRightTouchPadTouchUpAsObservable() 82 | .Subscribe(_ => Debug.Log("Right TouchPad TouchUp")); 83 | 84 | this.RightTouchPosition() 85 | .Subscribe(x => Debug.Log("Right TouchPad Position:" + x)); 86 | #endregion 87 | 88 | #region Application Menu 89 | this.OnRightApplicationMenuPressDownAsObservable() 90 | .Subscribe(_ => Debug.Log("Right Application PressDown")); 91 | this.OnRightApplicationMenuPressUpAsObservable() 92 | .Subscribe(_ => Debug.Log("Right Application PressUp")); 93 | this.RightApplicationMenuPress() 94 | .Subscribe(x => Debug.Log("RightApplicationMenu:" + x)); 95 | #endregion 96 | 97 | #region Grip 98 | this.OnRightGripPressDownAsObservable() 99 | .Subscribe(_ => Debug.Log("Right Application PressDown")); 100 | this.OnRightGripPressUpAsObservable() 101 | .Subscribe(_ => Debug.Log("Right Application PressUp")); 102 | this.RightGripPress() 103 | .Subscribe(x => Debug.Log("RightGrip:" + x)); 104 | 105 | #endregion 106 | #endregion 107 | } 108 | } 109 | } 110 | ``` 111 | 112 | ## 配布ライセンス 113 | 114 | MIT Licenseで公開します 115 | 116 | 117 | ## 使用ライセンス 118 | 119 | SteamVRInputObservablesはUniRxをベースに作成しています 120 | Copyright (c) 2014 Yoshifumi Kawai https://github.com/neuecc/UniRx/blob/master/LICENSE 121 | -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/Exampple/InputTest.cs: -------------------------------------------------------------------------------- 1 | using SteamVRInputObservables; 2 | using UniRx; 3 | using UnityEngine; 4 | 5 | namespace SteamVRInputObservablesSample 6 | { 7 | public class InputTest : MonoBehaviour 8 | { 9 | void Start() 10 | { 11 | #region Right 12 | #region Trigger 13 | this.OnRightTriggerPressDownAsObservable() 14 | .Subscribe(_ => Debug.Log("Right Trigger PressDown")); 15 | this.OnRightTriggerPressUpAsObservable() 16 | .Subscribe(_ => Debug.Log("Right Trigger PressUp")); 17 | this.RightTriggerPress() 18 | .Subscribe(x => Debug.Log("Right Trigger Press:" + x)); 19 | 20 | this.OnRightTriggerTouchDownAsObservable() 21 | .Subscribe(_ => Debug.Log("Right Trigger TouchDown")); 22 | this.OnRightTriggerTouchUpAsObservable() 23 | .Subscribe(_ => Debug.Log("Right Trigger TouchUp")); 24 | 25 | this.RightTriggerValue() 26 | .Subscribe(x => Debug.Log("Right Trigger Value:" + x)); 27 | #endregion 28 | 29 | #region TopuchPad 30 | this.OnRightTouchPadPressDownAsObservable() 31 | .Subscribe(_ => Debug.Log("Right TouchPad PressDown")); 32 | this.OnRightTouchPadPressUpAsObservable() 33 | .Subscribe(_ => Debug.Log("Right TouchPad PressUp")); 34 | this.RightTouchPadPress() 35 | .Subscribe(x => Debug.Log("Right TouchPad Press:" + x)); 36 | 37 | this.OnRightTouchPadTouchDownAsObservable() 38 | .Subscribe(_ => Debug.Log("Right TouchPad TouchDown")); 39 | this.OnRightTouchPadTouchUpAsObservable() 40 | .Subscribe(_ => Debug.Log("Right TouchPad TouchUp")); 41 | 42 | this.RightTouchPosition() 43 | .Subscribe(x => Debug.Log("Right TouchPad Position:" + x)); 44 | #endregion 45 | 46 | #region Application Menu 47 | this.OnRightApplicationMenuPressDownAsObservable() 48 | .Subscribe(_ => Debug.Log("Right Application PressDown")); 49 | this.OnRightApplicationMenuPressUpAsObservable() 50 | .Subscribe(_ => Debug.Log("Right Application PressUp")); 51 | this.RightApplicationMenuPress() 52 | .Subscribe(x => Debug.Log("RightApplicationMenu:" + x)); 53 | #endregion 54 | 55 | #region Grip 56 | this.OnRightGripPressDownAsObservable() 57 | .Subscribe(_ => Debug.Log("Right Application PressDown")); 58 | this.OnRightGripPressUpAsObservable() 59 | .Subscribe(_ => Debug.Log("Right Application PressUp")); 60 | this.RightGripPress() 61 | .Subscribe(x => Debug.Log("RightGrip:" + x)); 62 | 63 | #endregion 64 | #endregion 65 | 66 | #region Left 67 | #region Trigger 68 | this.OnLeftTriggerPressDownAsObservable() 69 | .Subscribe(_ => Debug.Log("Left Trigger PressDown")); 70 | this.OnLeftTriggerPressUpAsObservable() 71 | .Subscribe(_ => Debug.Log("Left Trigger PressUp")); 72 | this.LeftTriggerPress() 73 | .Subscribe(x => Debug.Log("Left Trigger Press:" + x)); 74 | 75 | this.OnLeftTriggerTouchDownAsObservable() 76 | .Subscribe(_ => Debug.Log("Left Trigger TouchDown")); 77 | this.OnLeftTriggerTouchUpAsObservable() 78 | .Subscribe(_ => Debug.Log("Left Trigger TouchUp")); 79 | 80 | this.LeftTriggerValue() 81 | .Subscribe(x => Debug.Log("Left Trigger Value:" + x)); 82 | #endregion 83 | 84 | #region TopuchPad 85 | this.OnLeftTouchPadPressDownAsObservable() 86 | .Subscribe(_ => Debug.Log("Left TouchPad PressDown")); 87 | this.OnLeftTouchPadPressUpAsObservable() 88 | .Subscribe(_ => Debug.Log("Left TouchPad PressUp")); 89 | this.LeftTouchPadPress() 90 | .Subscribe(x => Debug.Log("Left TouchPad Press:" + x)); 91 | 92 | this.OnLeftTouchPadTouchDownAsObservable() 93 | .Subscribe(_ => Debug.Log("Left TouchPad TouchDown")); 94 | this.OnLeftTouchPadTouchUpAsObservable() 95 | .Subscribe(_ => Debug.Log("Left TouchPad TouchUp")); 96 | 97 | this.LeftTouchPosition() 98 | .Subscribe(x => Debug.Log("Left TouchPad Position:" + x)); 99 | #endregion 100 | 101 | #region Application Menu 102 | this.OnLeftApplicationMenuPressDownAsObservable() 103 | .Subscribe(_ => Debug.Log("Left Application PressDown")); 104 | this.OnLeftApplicationMenuPressUpAsObservable() 105 | .Subscribe(_ => Debug.Log("Left Application PressUp")); 106 | this.LeftApplicationMenuPress() 107 | .Subscribe(x => Debug.Log("LeftApplicationMenu:" + x)); 108 | #endregion 109 | 110 | #region Grip 111 | this.OnLeftGripPressDownAsObservable() 112 | .Subscribe(_ => Debug.Log("Left Application PressDown")); 113 | this.OnLeftGripPressUpAsObservable() 114 | .Subscribe(_ => Debug.Log("Left Application PressUp")); 115 | this.LeftGripPress() 116 | .Subscribe(x => Debug.Log("LeftGrip:" + x)); 117 | 118 | #endregion 119 | #endregion 120 | } 121 | 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/SteamVREventTriggerExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UniRx; 4 | using UnityEngine; 5 | 6 | namespace SteamVRInputObservables 7 | { 8 | public static class SteamVREventTriggerExtensions 9 | { 10 | #region Right 11 | #region Trigger 12 | #region Touch 13 | public static IObservable OnRightTriggerTouchDownAsObservable(this Component component) 14 | { 15 | if (component == null) return Observable.Empty(); 16 | return ObservableSteamInput.OnRightTriggerTouchDown().TakeUntilDestroy(component); 17 | } 18 | public static IObservable OnRightTriggerTouchUpAsObservable(this Component component) 19 | { 20 | if (component == null) return Observable.Empty(); 21 | return ObservableSteamInput.OnRightTriggerTouchUp().TakeUntilDestroy(component); 22 | } 23 | 24 | public static IReadOnlyReactiveProperty RightTriggerValue(this Component component) 25 | { 26 | return ObservableSteamInput.RightTriggerValue(); 27 | } 28 | 29 | #endregion 30 | #region Press 31 | public static IObservable OnRightTriggerPressDownAsObservable(this Component component) 32 | { 33 | if (component == null) return Observable.Empty(); 34 | return ObservableSteamInput.OnRightTriggerPressDown().TakeUntilDestroy(component); 35 | } 36 | public static IObservable OnRightTriggerPressUpAsObservable(this Component component) 37 | { 38 | if (component == null) return Observable.Empty(); 39 | return ObservableSteamInput.OnRightTriggerPressUp().TakeUntilDestroy(component); 40 | } 41 | 42 | public static IReadOnlyReactiveProperty RightTriggerPress(this Component component) 43 | { 44 | if (component == null) return null; 45 | return ObservableSteamInput.RightTriggerPress(); 46 | } 47 | 48 | #endregion 49 | #endregion 50 | #region TouchPad 51 | #region Touch 52 | public static IObservable OnRightTouchPadTouchDownAsObservable(this Component component) 53 | { 54 | if (component == null) return Observable.Empty(); 55 | return ObservableSteamInput.OnRightTouchPadTouchDown().TakeUntilDestroy(component); 56 | } 57 | public static IObservable OnRightTouchPadTouchUpAsObservable(this Component component) 58 | { 59 | if (component == null) return Observable.Empty(); 60 | return ObservableSteamInput.OnRightTouchPadTouchUp().TakeUntilDestroy(component); 61 | } 62 | 63 | public static IReadOnlyReactiveProperty RightTouchPosition(this Component component) 64 | { 65 | if (component == null) return null; 66 | return ObservableSteamInput.RightTouchPosition(); 67 | } 68 | 69 | #endregion 70 | #region Press 71 | public static IObservable OnRightTouchPadPressDownAsObservable(this Component component) 72 | { 73 | if (component == null) return Observable.Empty(); 74 | return ObservableSteamInput.OnRightTouchPadPressDown().TakeUntilDestroy(component); 75 | } 76 | public static IObservable OnRightTouchPadPressUpAsObservable(this Component component) 77 | { 78 | if (component == null) return Observable.Empty(); 79 | return ObservableSteamInput.OnRightTouchPadPressUp().TakeUntilDestroy(component); 80 | } 81 | 82 | public static IReadOnlyReactiveProperty RightTouchPadPress(this Component component) 83 | { 84 | if (component == null) return null; 85 | return ObservableSteamInput.RightTouchPadPress(); 86 | } 87 | 88 | #endregion 89 | #endregion TouchPad 90 | #region Grip 91 | #region Press 92 | public static IObservable OnRightGripPressDownAsObservable(this Component component) 93 | { 94 | if (component == null) return Observable.Empty(); 95 | return ObservableSteamInput.OnRightGripPressDown().TakeUntilDestroy(component); 96 | } 97 | public static IObservable OnRightGripPressUpAsObservable(this Component component) 98 | { 99 | if (component == null) return Observable.Empty(); 100 | return ObservableSteamInput.OnRightGripPressUp().TakeUntilDestroy(component); 101 | } 102 | 103 | public static IReadOnlyReactiveProperty RightGripPress(this Component component) 104 | { 105 | if (component == null) return null; 106 | return ObservableSteamInput.RightGripPress(); 107 | } 108 | 109 | #endregion 110 | 111 | #endregion 112 | #region ApplicationMenu 113 | #region Press 114 | public static IObservable OnRightApplicationMenuPressDownAsObservable(this Component component) 115 | { 116 | if (component == null) return Observable.Empty(); 117 | return ObservableSteamInput.OnRightApplicationMenuPressDown().TakeUntilDestroy(component); 118 | } 119 | public static IObservable OnRightApplicationMenuPressUpAsObservable(this Component component) 120 | { 121 | if (component == null) return Observable.Empty(); 122 | return ObservableSteamInput.OnRightApplicationMenuPressUp().TakeUntilDestroy(component); 123 | } 124 | 125 | public static IReadOnlyReactiveProperty RightApplicationMenuPress(this Component component) 126 | { 127 | if (component == null) return null; 128 | return ObservableSteamInput.RightApplicationMenuPress(); 129 | 130 | } 131 | 132 | #endregion 133 | 134 | #endregion 135 | #region SystemMenu 136 | #region Press 137 | public static IObservable OnRightSystemPressDownAsObservable(this Component component) 138 | { 139 | if (component == null) return Observable.Empty(); 140 | return ObservableSteamInput.OnRightSystemPressDown().TakeUntilDestroy(component); 141 | } 142 | public static IObservable OnRightSystemPressUpAsObservable(this Component component) 143 | { 144 | if (component == null) return Observable.Empty(); 145 | return ObservableSteamInput.OnRightSystemPressUp().TakeUntilDestroy(component); 146 | } 147 | 148 | public static IReadOnlyReactiveProperty RightSystemPress(this Component component) 149 | { 150 | if (component == null) return null; 151 | return ObservableSteamInput.RightSystemPress(); 152 | } 153 | 154 | #endregion 155 | 156 | #endregion 157 | #endregion 158 | 159 | #region Left 160 | #region Trigger 161 | #region Touch 162 | public static IObservable OnLeftTriggerTouchDownAsObservable(this Component component) 163 | { 164 | if (component == null) return Observable.Empty(); 165 | return ObservableSteamInput.OnLeftTriggerTouchDown().TakeUntilDestroy(component); 166 | } 167 | public static IObservable OnLeftTriggerTouchUpAsObservable(this Component component) 168 | { 169 | if (component == null) return Observable.Empty(); 170 | return ObservableSteamInput.OnLeftTriggerTouchUp().TakeUntilDestroy(component); 171 | } 172 | 173 | public static IReadOnlyReactiveProperty LeftTriggerValue(this Component component) 174 | { 175 | return ObservableSteamInput.LeftTriggerValue(); 176 | } 177 | 178 | #endregion 179 | #region Press 180 | public static IObservable OnLeftTriggerPressDownAsObservable(this Component component) 181 | { 182 | if (component == null) return Observable.Empty(); 183 | return ObservableSteamInput.OnLeftTriggerPressDown().TakeUntilDestroy(component); 184 | } 185 | public static IObservable OnLeftTriggerPressUpAsObservable(this Component component) 186 | { 187 | if (component == null) return Observable.Empty(); 188 | return ObservableSteamInput.OnLeftTriggerPressUp().TakeUntilDestroy(component); 189 | } 190 | 191 | public static IReadOnlyReactiveProperty LeftTriggerPress(this Component component) 192 | { 193 | if (component == null) return null; 194 | return ObservableSteamInput.LeftTriggerPress(); 195 | } 196 | 197 | #endregion 198 | #endregion 199 | #region TouchPad 200 | #region Touch 201 | public static IObservable OnLeftTouchPadTouchDownAsObservable(this Component component) 202 | { 203 | if (component == null) return Observable.Empty(); 204 | return ObservableSteamInput.OnLeftTouchPadTouchDown().TakeUntilDestroy(component); 205 | } 206 | public static IObservable OnLeftTouchPadTouchUpAsObservable(this Component component) 207 | { 208 | if (component == null) return Observable.Empty(); 209 | return ObservableSteamInput.OnLeftTouchPadTouchUp().TakeUntilDestroy(component); 210 | } 211 | 212 | public static IReadOnlyReactiveProperty LeftTouchPosition(this Component component) 213 | { 214 | if (component == null) return null; 215 | return ObservableSteamInput.LeftTouchPosition(); 216 | } 217 | 218 | #endregion 219 | #region Press 220 | public static IObservable OnLeftTouchPadPressDownAsObservable(this Component component) 221 | { 222 | if (component == null) return Observable.Empty(); 223 | return ObservableSteamInput.OnLeftTouchPadPressDown().TakeUntilDestroy(component); 224 | } 225 | public static IObservable OnLeftTouchPadPressUpAsObservable(this Component component) 226 | { 227 | if (component == null) return Observable.Empty(); 228 | return ObservableSteamInput.OnLeftTouchPadPressUp().TakeUntilDestroy(component); 229 | } 230 | 231 | public static IReadOnlyReactiveProperty LeftTouchPadPress(this Component component) 232 | { 233 | if (component == null) return null; 234 | return ObservableSteamInput.LeftTouchPadPress(); 235 | } 236 | 237 | #endregion 238 | #endregion TouchPad 239 | #region Grip 240 | #region Press 241 | public static IObservable OnLeftGripPressDownAsObservable(this Component component) 242 | { 243 | if (component == null) return Observable.Empty(); 244 | return ObservableSteamInput.OnLeftGripPressDown().TakeUntilDestroy(component); 245 | } 246 | public static IObservable OnLeftGripPressUpAsObservable(this Component component) 247 | { 248 | if (component == null) return Observable.Empty(); 249 | return ObservableSteamInput.OnLeftGripPressUp().TakeUntilDestroy(component); 250 | } 251 | 252 | public static IReadOnlyReactiveProperty LeftGripPress(this Component component) 253 | { 254 | if (component == null) return null; 255 | return ObservableSteamInput.LeftGripPress(); 256 | } 257 | 258 | #endregion 259 | 260 | #endregion 261 | #region ApplicationMenu 262 | #region Press 263 | public static IObservable OnLeftApplicationMenuPressDownAsObservable(this Component component) 264 | { 265 | if (component == null) return Observable.Empty(); 266 | return ObservableSteamInput.OnLeftApplicationMenuPressDown().TakeUntilDestroy(component); 267 | } 268 | public static IObservable OnLeftApplicationMenuPressUpAsObservable(this Component component) 269 | { 270 | if (component == null) return Observable.Empty(); 271 | return ObservableSteamInput.OnLeftApplicationMenuPressUp().TakeUntilDestroy(component); 272 | } 273 | 274 | public static IReadOnlyReactiveProperty LeftApplicationMenuPress(this Component component) 275 | { 276 | if (component == null) return null; 277 | return ObservableSteamInput.LeftApplicationMenuPress(); 278 | 279 | } 280 | 281 | #endregion 282 | 283 | #endregion 284 | #region SystemMenu 285 | #region Press 286 | public static IObservable OnLeftSystemPressDownAsObservable(this Component component) 287 | { 288 | if (component == null) return Observable.Empty(); 289 | return ObservableSteamInput.OnLeftSystemPressDown().TakeUntilDestroy(component); 290 | } 291 | public static IObservable OnLeftSystemPressUpAsObservable(this Component component) 292 | { 293 | if (component == null) return Observable.Empty(); 294 | return ObservableSteamInput.OnLeftSystemPressUp().TakeUntilDestroy(component); 295 | } 296 | 297 | public static IReadOnlyReactiveProperty LeftSystemPress(this Component component) 298 | { 299 | if (component == null) return null; 300 | return ObservableSteamInput.LeftSystemPress(); 301 | } 302 | 303 | #endregion 304 | 305 | #endregion 306 | #endregion 307 | 308 | } 309 | } -------------------------------------------------------------------------------- /Assets/SteamVRInputObservables/ObservableSteamInput.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UniRx; 4 | using UnityEngine; 5 | 6 | namespace SteamVRInputObservables 7 | { 8 | public static class ObservableSteamInput 9 | { 10 | private static readonly string PrefabPath = "SteamVREventTrigger"; 11 | 12 | private static SteamVREventTrigger _trigger; 13 | 14 | private static SteamVREventTrigger EventTrigger 15 | { 16 | get 17 | { 18 | if (_trigger != null) return _trigger; 19 | if (SteamVREventTrigger.Instance != null) 20 | { 21 | _trigger = SteamVREventTrigger.Instance; 22 | return _trigger; 23 | } 24 | var resource = Resources.Load(PrefabPath); 25 | var o = Object.Instantiate(resource); 26 | _trigger = o.GetComponent(); 27 | return _trigger; 28 | } 29 | } 30 | 31 | 32 | #region Right 33 | #region Trigger 34 | #region Touch 35 | public static IObservable OnRightTriggerTouchDown() 36 | { 37 | if (EventTrigger.RightController == null) return Observable.Empty(); 38 | return GetOrAddComponent(EventTrigger.RightController).OnTouchDown; 39 | } 40 | public static IObservable OnRightTriggerTouchUp() 41 | { 42 | if (EventTrigger.RightController == null) return Observable.Empty(); 43 | return GetOrAddComponent(EventTrigger.RightController).OnTouchUp; 44 | } 45 | 46 | public static IReadOnlyReactiveProperty RightTriggerValue() 47 | { 48 | if (EventTrigger.RightController == null) return null; 49 | return GetOrAddComponent(EventTrigger.RightController).AxisX; 50 | } 51 | 52 | #endregion 53 | #region Press 54 | public static IObservable OnRightTriggerPressDown() 55 | { 56 | if (EventTrigger.RightController == null) return Observable.Empty(); 57 | return GetOrAddComponent(EventTrigger.RightController).OnPressDown; 58 | } 59 | public static IObservable OnRightTriggerPressUp() 60 | { 61 | if (EventTrigger.RightController == null) return Observable.Empty(); 62 | return GetOrAddComponent(EventTrigger.RightController).OnPressUp; 63 | } 64 | 65 | public static IReadOnlyReactiveProperty RightTriggerPress() 66 | { 67 | if (EventTrigger.RightController == null) return null; 68 | return GetOrAddComponent(EventTrigger.RightController).OnPress; 69 | } 70 | 71 | #endregion 72 | #endregion 73 | #region TouchPad 74 | #region Touch 75 | public static IObservable OnRightTouchPadTouchDown() 76 | { 77 | if (EventTrigger.RightController == null) return Observable.Empty(); 78 | return GetOrAddComponent(EventTrigger.RightController).OnTouchDown; 79 | } 80 | public static IObservable OnRightTouchPadTouchUp() 81 | { 82 | if (EventTrigger.RightController == null) return Observable.Empty(); 83 | return GetOrAddComponent(EventTrigger.RightController).OnTouchUp; 84 | } 85 | 86 | public static IReadOnlyReactiveProperty RightTouchPosition() 87 | { 88 | if (EventTrigger.RightController == null) return null; 89 | return GetOrAddComponent(EventTrigger.RightController).Axis; 90 | } 91 | 92 | #endregion 93 | #region Press 94 | public static IObservable OnRightTouchPadPressDown() 95 | { 96 | if (EventTrigger.RightController == null) return Observable.Empty(); 97 | return GetOrAddComponent(EventTrigger.RightController).OnPressDown; 98 | } 99 | public static IObservable OnRightTouchPadPressUp() 100 | { 101 | if (EventTrigger.RightController == null) return Observable.Empty(); 102 | return GetOrAddComponent(EventTrigger.RightController).OnPressUp; 103 | } 104 | 105 | public static IReadOnlyReactiveProperty RightTouchPadPress() 106 | { 107 | if (EventTrigger.RightController == null) return null; 108 | return GetOrAddComponent(EventTrigger.RightController).OnPress; 109 | } 110 | 111 | #endregion 112 | #endregion TouchPad 113 | #region Grip 114 | #region Press 115 | public static IObservable OnRightGripPressDown() 116 | { 117 | if (EventTrigger.RightController == null) return Observable.Empty(); 118 | return GetOrAddComponent(EventTrigger.RightController).OnPressDown; 119 | } 120 | public static IObservable OnRightGripPressUp() 121 | { 122 | if (EventTrigger.RightController == null) return Observable.Empty(); 123 | return GetOrAddComponent(EventTrigger.RightController).OnPressUp; 124 | } 125 | 126 | public static IReadOnlyReactiveProperty RightGripPress() 127 | { 128 | if (EventTrigger.RightController == null) return null; 129 | return GetOrAddComponent(EventTrigger.RightController).OnPress; 130 | } 131 | 132 | #endregion 133 | 134 | #endregion 135 | #region ApplicationMenu 136 | #region Press 137 | public static IObservable OnRightApplicationMenuPressDown() 138 | { 139 | if (EventTrigger.RightController == null) return Observable.Empty(); 140 | return GetOrAddComponent(EventTrigger.RightController).OnPressDown; 141 | } 142 | public static IObservable OnRightApplicationMenuPressUp() 143 | { 144 | if (EventTrigger.RightController == null) return Observable.Empty(); 145 | return GetOrAddComponent(EventTrigger.RightController).OnPressUp; 146 | } 147 | 148 | public static IReadOnlyReactiveProperty RightApplicationMenuPress() 149 | { 150 | if (EventTrigger.RightController == null) return null; 151 | return GetOrAddComponent(EventTrigger.RightController).OnPress; 152 | } 153 | 154 | #endregion 155 | 156 | #endregion 157 | #region SystemMenu 158 | #region Press 159 | public static IObservable OnRightSystemPressDown() 160 | { 161 | if (EventTrigger.RightController == null) return Observable.Empty(); 162 | return GetOrAddComponent(EventTrigger.RightController).OnPressDown; 163 | } 164 | public static IObservable OnRightSystemPressUp() 165 | { 166 | if (EventTrigger.RightController == null) return Observable.Empty(); 167 | return GetOrAddComponent(EventTrigger.RightController).OnPressUp; 168 | } 169 | 170 | public static IReadOnlyReactiveProperty RightSystemPress() 171 | { 172 | if (EventTrigger.RightController == null) return null; 173 | return GetOrAddComponent(EventTrigger.RightController).OnPress; 174 | } 175 | 176 | #endregion 177 | 178 | #endregion 179 | #endregion 180 | #region Left 181 | #region Trigger 182 | #region Touch 183 | public static IObservable OnLeftTriggerTouchDown() 184 | { 185 | if (EventTrigger.LeftController == null) return Observable.Empty(); 186 | return GetOrAddComponent(EventTrigger.LeftController).OnTouchDown; 187 | } 188 | public static IObservable OnLeftTriggerTouchUp() 189 | { 190 | if (EventTrigger.LeftController == null) return Observable.Empty(); 191 | return GetOrAddComponent(EventTrigger.LeftController).OnTouchUp; 192 | } 193 | 194 | public static IReadOnlyReactiveProperty LeftTriggerValue() 195 | { 196 | if (EventTrigger.LeftController == null) return null; 197 | return GetOrAddComponent(EventTrigger.LeftController).AxisX; 198 | } 199 | 200 | #endregion 201 | #region Press 202 | public static IObservable OnLeftTriggerPressDown() 203 | { 204 | if (EventTrigger.LeftController == null) return Observable.Empty(); 205 | return GetOrAddComponent(EventTrigger.LeftController).OnPressDown; 206 | } 207 | public static IObservable OnLeftTriggerPressUp() 208 | { 209 | if (EventTrigger.LeftController == null) return Observable.Empty(); 210 | return GetOrAddComponent(EventTrigger.LeftController).OnPressUp; 211 | } 212 | 213 | public static IReadOnlyReactiveProperty LeftTriggerPress() 214 | { 215 | if (EventTrigger.LeftController == null) return null; 216 | return GetOrAddComponent(EventTrigger.LeftController).OnPress; 217 | } 218 | 219 | #endregion 220 | #endregion 221 | #region TouchPad 222 | #region Touch 223 | public static IObservable OnLeftTouchPadTouchDown() 224 | { 225 | if (EventTrigger.LeftController == null) return Observable.Empty(); 226 | return GetOrAddComponent(EventTrigger.LeftController).OnTouchDown; 227 | } 228 | public static IObservable OnLeftTouchPadTouchUp() 229 | { 230 | if (EventTrigger.LeftController == null) return Observable.Empty(); 231 | return GetOrAddComponent(EventTrigger.LeftController).OnTouchUp; 232 | } 233 | 234 | public static IReadOnlyReactiveProperty LeftTouchPosition() 235 | { 236 | if (EventTrigger.LeftController == null) return null; 237 | return GetOrAddComponent(EventTrigger.LeftController).Axis; 238 | } 239 | 240 | #endregion 241 | #region Press 242 | public static IObservable OnLeftTouchPadPressDown() 243 | { 244 | if (EventTrigger.LeftController == null) return Observable.Empty(); 245 | return GetOrAddComponent(EventTrigger.LeftController).OnPressDown; 246 | } 247 | public static IObservable OnLeftTouchPadPressUp() 248 | { 249 | if (EventTrigger.LeftController == null) return Observable.Empty(); 250 | return GetOrAddComponent(EventTrigger.LeftController).OnPressUp; 251 | } 252 | 253 | public static IReadOnlyReactiveProperty LeftTouchPadPress() 254 | { 255 | if (EventTrigger.LeftController == null) return null; 256 | return GetOrAddComponent(EventTrigger.LeftController).OnPress; 257 | } 258 | 259 | #endregion 260 | #endregion TouchPad 261 | #region Grip 262 | #region Press 263 | public static IObservable OnLeftGripPressDown() 264 | { 265 | if (EventTrigger.LeftController == null) return Observable.Empty(); 266 | return GetOrAddComponent(EventTrigger.LeftController).OnPressDown; 267 | } 268 | public static IObservable OnLeftGripPressUp() 269 | { 270 | if (EventTrigger.LeftController == null) return Observable.Empty(); 271 | return GetOrAddComponent(EventTrigger.LeftController).OnPressUp; 272 | } 273 | 274 | public static IReadOnlyReactiveProperty LeftGripPress() 275 | { 276 | if (EventTrigger.LeftController == null) return null; 277 | return GetOrAddComponent(EventTrigger.LeftController).OnPress; 278 | } 279 | 280 | #endregion 281 | 282 | #endregion 283 | #region ApplicationMenu 284 | #region Press 285 | public static IObservable OnLeftApplicationMenuPressDown() 286 | { 287 | if (EventTrigger.LeftController == null) return Observable.Empty(); 288 | return GetOrAddComponent(EventTrigger.LeftController).OnPressDown; 289 | } 290 | public static IObservable OnLeftApplicationMenuPressUp() 291 | { 292 | if (EventTrigger.LeftController == null) return Observable.Empty(); 293 | return GetOrAddComponent(EventTrigger.LeftController).OnPressUp; 294 | } 295 | 296 | public static IReadOnlyReactiveProperty LeftApplicationMenuPress() 297 | { 298 | if (EventTrigger.LeftController == null) return null; 299 | return GetOrAddComponent(EventTrigger.LeftController).OnPress; 300 | } 301 | 302 | #endregion 303 | 304 | #endregion 305 | #region SystemMenu 306 | #region Press 307 | public static IObservable OnLeftSystemPressDown() 308 | { 309 | if (EventTrigger.LeftController == null) return Observable.Empty(); 310 | return GetOrAddComponent(EventTrigger.LeftController).OnPressDown; 311 | } 312 | public static IObservable OnLeftSystemPressUp() 313 | { 314 | if (EventTrigger.LeftController == null) return Observable.Empty(); 315 | return GetOrAddComponent(EventTrigger.LeftController).OnPressUp; 316 | } 317 | 318 | public static IReadOnlyReactiveProperty LeftSystemPress() 319 | { 320 | if (EventTrigger.LeftController == null) return null; 321 | return GetOrAddComponent(EventTrigger.LeftController).OnPress; 322 | } 323 | 324 | #endregion 325 | 326 | #endregion 327 | #endregion 328 | 329 | private static T GetOrAddComponent(GameObject gameObject) where T : Component 330 | { 331 | var component = gameObject.GetComponent(); 332 | if (component == null) 333 | { 334 | component = gameObject.AddComponent(); 335 | } 336 | 337 | return component; 338 | } 339 | } 340 | } --------------------------------------------------------------------------------