当有两个同名游戏对象时,如何更改UI /图像?

时间:2018-07-06 14:51:03

标签: json user-interface unity3d

我正在为Hololens开发一个应用程序,该应用程序使用带有UI / Image元素的面板生成多个画布。我有1个JSON字符串:

{  
   "PC_Station":[  
      {  
         "PLC_0":{  
            "DB1":{  
               "test123":0
            },
            "STOP":false,
            "Frap":false,
            "START":false,
            "Start_1":false,
            "Stop_1":false,
            "Led1":true,
            "Led2":false,
            "Led3":true,
            "Counter":4002,
            "Sliderval":0
         }
      },
      {  
         "PLC_1":{  
            "DB1":{  
               "test123":55
            },
            "STOP":false,
            "START":false,
            "Start_1":false,
            "Stop_1":false,
            "Led1":true,
            "Led2":false,
            "Led3":true,
            "Counter":4002,
            "Sliderval":0
         }
      }
   ]
}

此JSON字符串在一个名为PLC_1和PLC_0的JSON数组中具有2个JSON对象。 PLC_1与PLC_0具有相同的变量。

我已经制作了以下函数,用于附加JSON并更改UI / Image对象的颜色:

IEnumerator updateTags()
    {
        string json = "{\"PC_Station\": [{\"PLC_1\": {\"DB1\": {\"test123\": 30}, \"STOP\": false, \"START\": true, \"Start_1\": false, \"Stop_1\": true, \"Led1\": false, \"Led2\": false, \"Led3\": false, \"Counter\": 3880, \"Sliderval\": 60}}]}";
        string json1 = "{\"PC_Station\": [{\"PLC_0\": {\"DB1\": {\"test123\": 0}, \"STOP\": false,\"Frap\": false, \"START\": false, \"Start_1\": false, \"Stop_1\": false, \"Led1\": true, \"Led2\": false, \"Led3\": true, \"Counter\": 4002, \"Sliderval\": 0}},{\"PLC_1\": {\"DB1\": {\"test123\": 55}, \"STOP\": false, \"START\": false, \"Start_1\": false, \"Stop_1\": false, \"Led1\": true, \"Led2\": false, \"Led3\": true, \"Counter\": 4002, \"Sliderval\": 0}}]}";
        var data = JToken.Parse(json1);
        while (true)
        {
            foreach (var value in data)
            {
                foreach(JArray arr in value)
                {
                    for (int i = 0; i < arr.Count; i++)
                    {
                        foreach (var item in arr[i])
                        {
                            var itemproperties = item.Parent;
                            foreach (JToken token in itemproperties)
                            {
                                var prop = token as JProperty;
                                var plc = (JObject)prop.Value;
                                foreach (KeyValuePair<string, JToken> val in plc)
                                {
                                    if(val.Value is JObject)
                                    {
                                        JObject nestedobj = (JObject)val.Value;
                                        foreach (JProperty nestedvariables in nestedobj.Properties())
                                        {
                                            string varkey = nestedvariables.Name;
                                            string varvalue = nestedvariables.Value.ToString();
                                            GameObject test = GameObject.Find(varkey+"value");
                                            test.GetComponent<Text>().text = varvalue;
                                        }
                                    }
                                    else
                                    {
                                        for(int v = 0; v < abc.Count; v++)
                                        {
                                            Debug.Log(v);
                                            foreach(KeyValuePair<string, string> variab in abc[v])
                                            {
                                                string varkey = val.Key;
                                                string varvalue = val.Value.ToString();
                                                GameObject test = GameObject.Find(varkey);
                                                if(varvalue == "True")
                                                {
                                                    test.GetComponent<Image>().color = Color.green;
                                                }
                                                if(varvalue == "False")
                                                {
                                                    test.GetComponent<Image>().color = Color.red;
                                                }
                                                if(varvalue != "True" && varvalue != "False")
                                                {
                                                    GameObject text = GameObject.Find(varkey + "value");
                                                    text.GetComponent<Text>().text = varvalue;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            yield return new WaitForSeconds(0.5f);
        }
    }

当我运行程序时,它看起来像这样:

enter image description here

如您所见,该功能可以为UI /图像正确添加颜色。

现在,我的问题:

如何命名,以使两个画布上的UI /图像都具有相同的颜色?

2 个答案:

答案 0 :(得分:0)

没有明显的解决方案,因为GameObject参考对象不容易序列化,您可以根据参考对象在树的当前分支中的位置(transform.GetSiblingIndex())来强制引用对象,但是如果您四处移动,这将无法正常工作。 您也可以只重命名对象。

答案 1 :(得分:0)

通过使用transform.find进行修复。我用它来查找层次结构中的项目。 现在,代码可以像我希望的那样运行。

enter image description here

首先,我创建一个新的游戏对象:

public GameObject upd4;

然后在代码中按如下方式使用它:

upd4 = transform.Find("Canvas" + i + "/Panel/" + plcvvobj.Key + "/" + plcvvobj.Key + "value").gameObject;

顺便说一句,我的等级如下:

enter image description here