动态地将字符串绑定到另一个字符串('变异'C#字符串)

时间:2016-05-28 03:13:52

标签: c# string dynamic unity3d

我正在努力在Unity中创建unidirectional flow framework

目前我仍然坚持让文本更新以我想要的方式工作。以下是我希望它的工作方式:

  1. 我在脚本上存储了一个字符串:myString
  2. 我可以将任意数量的其他字符串绑定到它: string1 = myStringstring2 = myString
  3. 当我更改myString时,所有其他绑定字符串也会更改
  4. 这是我的(当然不能正常工作)代码:

    public class Binder : MonoBehaviour
    {
      public Button button;
    
      public string buttonText = "Hi";
    
      void Start ()
      {
        buttonText = button.GetComponentInChildren<Text>().text;
      }
    
        // Update is called once per frame
        void Update ()
      {
        buttonText = Time.time.ToString();
      }
    }
    

    很明显,更新buttonText不会更新button.GetComponentInChildren<Text>().text(保持“嗨”),因为它只是将buttonText指向另一个字符串。

    如果string是一个对象,我可以改变对象,它会更新所有引用。那将是真棒。

    我的问题是:你知道我怎么能改变一个字符串所以所有其他指向同一个字符串的指针当然会显示相同的值吗?例如,假设我存储字符串“Hello”并且有两个UnityButtons。我将这两个UnityButtons.text设置为“Hello”字符串。当我将“Hello”更改为“Bye”时,这两个按钮文本也会变为“Bye”?

1 个答案:

答案 0 :(得分:1)

我认为你不能用指针做。虽然你可以用另一种方法来做到这一点。这可以通过C#中的auto属性来实现。看下面的代码。每次更改buttonText时,Button的文本都会自动更改。您可以在其中添加更多Texts

如果仔细观察,你会发现我在Start函数中缓存了按钮的文本。如果您要多次使用该变量,则应始终缓存变量并避免重复使用GetComponentInChildren

void Start()
{
    buttonText1 = button1.GetComponentInChildren<Text>();
    buttonText2 = button2.GetComponentInChildren<Text>();
}

void Update()
{
    buttonText = Time.time.ToString();
}

public Button button1;
public Button button2;

Text buttonText1;
Text buttonText2;

string _buttonText = "HI";
public string buttonText
{
    set
    {

        _buttonText = value;

        //Change Text 1
        if (buttonText1 != null)
        {
            buttonText1.text = _buttonText;
        }

        //Change Text 2
        if (buttonText2 != null)
        {
            buttonText2.text = _buttonText;
        }
    }

    get
    {
        return _buttonText;
    }
}

请注意,实际上,您可以将 UnityEvent放在属性中。这创造了任何可以遵循的“商店”。只需设置商店的“指针”。

如果您之前没有使用带有参数的UnityEvent,那么稍微烦人的语法是......

[System.Serializable] public class ExplosionEvent:UnityEvent<int> {}
public ExplosionEvent:UnityEvent followExplosions;
// and then ...
if (followExplosions!=null) followExplosions.invoke(42);

所以,要

属性

中的UnityEvent

只是..

public class HappyClass:MonoBehaviour
    {

    [System.Serializable] public class StoreEvent:UnityEvent<string> {}
    public StoreEvent followStore;
    string _store;
    public string store
        {
        set {
            _store = value;
            if (followStore!=null) followStore.Invoke(_store);
            }
        get { return _store; }
        }
    ...