如何将onGUI方法固定到面板

时间:2019-07-05 07:40:26

标签: c# unity3d

我想将脚本中的OnGUI方法修复到面板中。特别是我想做的是,在自由方面,当我更改游戏屏幕的大小时,用onGUI编写的文本也会根据游戏屏幕的大小而改变。

    public HumanBodyVisualizer bodyVisualizer;

    public GameObject text;

    Vector2 scrollPosition = Vector2.zero;

    float scrollPosition_y = 30;


 private void OnGUI()
    {

        //Debug.Log(text.transform.position.y);

        int subPartsSpacing = 0;
        float spacing = 30;
        float x = 7 + spacing;
        float y = text.transform.position.y;

        HumanBodyPart mainBodyPart = bodyVisualizer.BodyData.Body.SubParts[0];
        List<HumanBodyPart> nextPartsToRender = new List<HumanBodyPart>(new HumanBodyPart[] { mainBodyPart });
        List<HumanBodyPart> allPartsToRender = new List<HumanBodyPart>(new HumanBodyPart[] { mainBodyPart });

        scrollPosition = GUI.BeginScrollView(new Rect(7, 68, 236, 426), scrollPosition, new Rect(7, 68, 500, scrollPosition_y));

        GUI.backgroundColor = Color.clear;

        while (nextPartsToRender.Count > 0)
        {

            HumanBodyPart currentPart = nextPartsToRender[0];
            nextPartsToRender.RemoveAt(0);

            if(GUI.Button(new Rect(currentPart.DrawDepth * spacing + x + subPartsSpacing, y, 200, 20), currentPart.EnglishTitle))
            {

                    HumanBodyVisualizer.ShowMode showModeFullBody = HumanBodyVisualizer.ShowMode.Invisible;
                    bodyVisualizer.ShowBody(showModeFullBody);

                    List<HumanBodyPart> AllSubPartsAndRoot = new List<HumanBodyPart>();
                    AllSubPartsAndRoot.Insert(0, currentPart);
                    allSubPartsOfClickButton(currentPart, AllSubPartsAndRoot, 1);
                    HumanBodyVisualizer.ShowMode showModeCurrentPart = HumanBodyVisualizer.ShowMode.LowTransparent;
                    //bodyVisualizer.ShowBodyPart(showModeCurrentPart, currentPart);
                    for (int i = 0; i < AllSubPartsAndRoot.Count; i++)
                    {
                        bodyVisualizer.ShowBodyPart(showModeCurrentPart,AllSubPartsAndRoot[i]);
                    }
                    /*
                    List<String> modelList = currentPart.ModelList;
                    for(int i = 0; i < modelList.Count; i++)
                    {
                        Debug.Log(modelList[i]);   
                    }
                    */

            }

            if (currentPart.SubParts.Count != 0)
            {

                if (GUI.Button(new Rect(x - spacing + currentPart.DrawDepth * spacing + subPartsSpacing, y, 20, 20), "+"))
                {
                    if (!currentPart.IsExpanded)
                    {
                        currentPart.IsExpanded = true;
                        subPartsSpacing += 20;
                    }
                    else
                        currentPart.IsExpanded = false;
                }
                if (currentPart.IsExpanded)
                {
                    nextPartsToRender.InsertRange(0, currentPart.SubParts);
                    allPartsToRender.InsertRange(allPartsToRender.Count - 1, currentPart.SubParts);
                    scrollPosition_y = allPartsToRender.Count * spacing ;
                }
            }
            y += spacing;
        }
        // End the scroll view that we began above.
        GUI.EndScrollView();

    }

private void allSubPartsOfClickButton(HumanBodyPart root, List<HumanBodyPart> AllSubparts,int a)
    {
        AllSubparts.Insert(a, root);
        a++;
        for(int i = 0; i < root.SubParts.Count; i++)
        {
            allSubPartsOfClickButton(root.SubParts[i], AllSubparts, a);
        }

    }

这样运行时,即使更改游戏屏幕的大小,OnGUI文本(按钮,标签和滚动视图)也将在屏幕上保持不变。

我无法使用Unity UI。我必须使用onGUI处理此问题。

0 个答案:

没有答案