Reputation: 51
I have two classes. One of them have BoolReactiveProperty. I want the second class to be able to subscribe only without being able to change the value. This is my current code
public class SourceToggle : MonoBehaviour
{
public BoolReactiveProperty boolRP { get; private set; }
= new BoolReactiveProperty();
private void Start()
{
boolRP.Subscribe(b => GetComponent<Toggle>().isOn = b);
GetComponent<Toggle>()
.OnValueChangedAsObservable()
.Subscribe(b => boolRP.SetValueAndForceNotify(b));
}
}
public class SubscribedToggle : MonoBehaviour
{
[SerializeField]
private SourceToggle sourceToggle;
private void Start()
{
sourceToggle.boolRP
.Subscribe(b => GetComponent<Toggle>().isOn = b);
GetComponent<Toggle>()
.OnValueChangedAsObservable()
.Subscribe(b => sourceToggle.boolRP.SetValueAndForceNotify(b));
}
}
Upvotes: 0
Views: 1214
Reputation: 51
Thanks to @Hellium I found a solution
public class SourceToggle : MonoBehaviour
{
public ReadOnlyReactiveProperty<bool> IsOn { get; private set; }
private void Awake()
{
Toggle toggle = GetComponent<Toggle>();
IsOn = new ReadOnlyReactiveProperty<bool>(toggle.OnValueChangedAsObservable());
}
}
public class SubscribedToggle : MonoBehaviour
{
[SerializeField]
private SourceToggle sourceToggle;
private void Start()
{
Toggle toggle = GetComponent<Toggle>();
sourceToggle.IsOn
.Subscribe(b => toggle.isOn = b);
}
}
Upvotes: 0
Reputation: 7346
I don't totally get what you want to prevent. I guess you want to prevent your SubscribedToggle
to call SetValueAndForceNotify
on your ReactiveProperty?
Then declare a public IReadOnlyReactiveProperty
and manage a private BoolReactiveProperty
in your SourceToggle
class.
public class SourceToggle : MonoBehaviour
{
private BoolReactiveProperty isOn;
private Toggle toggle;
public IReadOnlyReactiveProperty<bool> IsOn => isOn;
private void Awake()
{
toggle = GetComponent<Toggle>();
isOn = new BoolReactiveProperty(toggle.isOn);
toggle
.OnValueChangedAsObservable()
.Subscribe(b => isOn.SetValueAndForceNotify(b));
isOn.Subscribe(b => toggle.isOn = b);
}
}
public class SubscribedToggle : MonoBehaviour
{
[SerializeField]
private SourceToggle sourceToggle;
private void Start()
{
sourceToggle.IsOn
.Subscribe(b => GetComponent<Toggle>().isOn = b);
// GetComponent<Toggle>()
// .OnValueChangedAsObservable()
// .Subscribe(b => sourceToggle.IsOn.SetValueAndForceNotify(b)); // Impossible to call SetValueAndForceNotify
}
}
Upvotes: 0