Можно ли заставить RactiveProperty publi c получить приватный набор в UniRx? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть два класса. У одного из них есть BoolReactiveProperty. Я хочу, чтобы второй класс мог подписаться только без возможности изменить значение. Это мой текущий код

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));
    }
}

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Благодаря @Hellium я нашел решение

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);
    }
}
0 голосов
/ 27 марта 2020

Я не совсем понимаю, что вы хотите предотвратить. Я полагаю, вы хотите запретить вашему SubscribedToggle вызову SetValueAndForceNotify в вашем ReactiveProperty?

Затем объявите publi c IReadOnlyReactiveProperty и управляйте личным BoolReactiveProperty в вашем SourceToggle классе.

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
    }
}
...