Unity 从脚本创建 UI 控件 [英] Unity Create UI control from script

查看:96
本文介绍了Unity 从脚本创建 UI 控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过代码创建了一个切换,但它不会显示.此外,我无法更改文本字段的位置.我尝试了很多,但没有任何效果.这是我当前的版本,也许你看到了错误.

我是 Unity 的新手,这非常困难.

公共类游戏:MonoBehaviour{公共游戏对象画布;空开始(){GameObject newGO = new GameObject("myTextGO");newGO.transform.SetParent(this.transform);newGO.transform.position = new Vector3(0, 0, 0);Text myText = newGO.AddComponent();myText.text = "Ta-dah!";字体 ArialFont =(Font)Resources.GetBuiltinResource(typeof(Font),"Arial.ttf");myText.font = ArialFont;myText.material = ArialFont.material;myText.color = Color.black;myText.transform.position = new Vector3(0, 10, 0);GameObject secGO = new GameObject("myGO");secGO.transform.SetParent(this.transform);Toggle myToggle = secGO.AddComponent();myToggle.isOn = true;myToggle.transform.position = new Vector3(10, 10, 0);}}

解决方案

你应该让 Toggle 成为 Canvas 的子元素.你没有在你的代码中这样做.此外,您使用 newGO.GetComponent().anchoredPosition3D 而不是 newGO.transform.position.

移动 UI 组件和游戏对象

在 Unity 中有 3 种方法可以创建完整的 UI 控件:

1.使用

1.创建一个 Toggle 游戏对象,然后使其成为 Canvas 的子对象.

2.创建一个背景游戏对象,然后使其成为切换游戏对象的子对象.

3.创建一个对勾游戏对象,然后使其成为背景游戏对象的子对象.

4.创建一个 Label 游戏对象,然后使其成为 Toggle 游戏对象的子对象.

5.现在将 ImageTextToggle 等组件附加到每个游戏对象,就像它出现在编辑器.

在代码中:

公共游戏对象画布;无效开始(){makeToggle();}void makeToggle(){游戏对象 toggleObj = createToggleObj(canvas);游戏对象 bgObj = createBackgroundObj(toggleObj);游戏对象 checkMarkObj = createCheckmarkObj(bgObj);游戏对象 labelObj = createLabelObj(toggleObj);attachAllComponents(toggleObj, bgObj, checkMarkObj, labelObj);}//1.创建一个*Toggle* GameObject,然后使其成为*Canvas* 的子级.游戏对象 createToggleObj(GameObject cnvs){GameObject toggle = new GameObject("Toggle");切换.transform.SetParent(cnvs.transform);toggle.layer = LayerMask.NameToLayer(UI");返回切换;}//2.创建一个背景游戏对象,然后让它成为切换游戏对象的子对象.游戏对象 createBackgroundObj(游戏对象切换){GameObject bg = new GameObject(背景");bg.transform.SetParent(toggle.transform);bg.layer = LayerMask.NameToLayer(UI");返回 bg;}//3.创建一个Checkmark GameObject,然后让它成为Background GameObject的子代.游戏对象 createCheckmarkObj(GameObject bg){游戏对象 chmk = 新游戏对象(对勾");chmk.transform.SetParent(bg.transform);chmk.layer = LayerMask.NameToLayer(UI");返回 chmk;}//4.创建一个标签游戏对象,然后使其成为切换游戏对象的子级.游戏对象 createLabelObj(游戏对象切换){GameObject lbl = new GameObject(标签");lbl.transform.SetParent(toggle.transform);lbl.layer = LayerMask.NameToLayer(UI");返回 lbl;}//5.现在将图像、文本和切换等组件附加到每个游戏对象,就像它出现在编辑器中一样.void attachAllComponents(GameObject toggle, GameObject bg, GameObject chmk, GameObject lbl){//将文本附加到标签Text txt = lbl.AddComponent();txt.text = "切换";字体 arialFont =(Font)Resources.GetBuiltinResource(typeof(Font), "Arial.ttf");txt.font = arialFont;txt.lineSpacing = 1;txt.color = 新颜色(50/255, 50/255, 50/255, 255/255);RectTransform txtRect = txt.GetComponent();txtRect.anchorMin = new Vector2(0, 0);txtRect.anchorMax = new Vector2(1, 1);//txtRect.y//将图像组件附加到复选标记图片 chmkImage = chmk.AddComponent();chmkImage.sprite = (Sprite)AssetDatabase.GetBuiltinExtraResource(typeof(Sprite), UI/Skin/Checkmark.psd");chmkImage.type = Image.Type.Simple;//将图像组件附加到背景图片 bgImage = bg.AddComponent();bgImage.sprite = (Sprite)AssetDatabase.GetBuiltinExtraResource(typeof(Sprite), "UI/Skin/UISprite.psd");bgImage.type = Image.Type.Sliced;RectTransform bgRect = txt.GetComponent();bgRect.anchorMin = new Vector2(0, 1);bgRect.anchorMax = new Vector2(0, 1);//将 Toggle 组件附加到 ToggleToggle toggleComponent = toggle.AddComponent();toggleComponent.transition = Selectable.Transition.ColorTint;toggleComponent.targetGraphic = bgImage;toggleComponent.isOn = true;toggleComponent.toggleTransition = Toggle.ToggleTransition.Fade;切换组件.graphic = chmkImage;toggle.GetComponent().anchoredPosition3D = new Vector3(0, 0, 0);}

方法#3 是最难做到的方法,您应该避免它.方法 #1 在这种情况下应该没问题.

希望这有帮助!

I created a toggle by code but it won´t get displayed. Furthermore, I can´t change the position of my text field. I tried a lot and nothing works. This is my current version, maybe you see the mistake.

I´m new to Unity and it is very difficult.

public class Game : MonoBehaviour 
{

    public GameObject canvas;

    void Start () 
    {
        GameObject newGO = new GameObject("myTextGO");
        newGO.transform.SetParent(this.transform);
        newGO.transform.position = new Vector3(0, 0, 0);

        Text myText = newGO.AddComponent<Text>();
        myText.text = "Ta-dah!";
        Font ArialFont =  
           (Font)Resources.GetBuiltinResource(typeof(Font),"Arial.ttf");
        myText.font = ArialFont;
        myText.material = ArialFont.material;
        myText.color = Color.black;
        myText.transform.position = new Vector3(0, 10, 0);

        GameObject secGO = new GameObject("myGO");
        secGO.transform.SetParent(this.transform);
        Toggle myToggle = secGO.AddComponent<Toggle>();
        myToggle.isOn = true;
        myToggle.transform.position = new Vector3(10, 10, 0);
    }
}

解决方案

You are supposed to make the Toggle the child of the Canvas. You didn't do that in your code. Also, you move a UI component and GameObject with newGO.GetComponent<RectTransform>().anchoredPosition3D not newGO.transform.position.

There are 3 Ways to create a Complete UI Control in Unity:

1.Use the DefaultControls API to generate it (Easy and Recommended)

With the DefaultControls class, Unity will create the supplied UI then returns the parent of the UI. This is the easiest and recommended way of doing this. It takes DefaultControls.Resources as parameter so that you can provide the sprites to use when creating the default UI Control.

Button:

public GameObject canvas;
void Start()
{
    DefaultControls.Resources uiResources = new DefaultControls.Resources();
    //Set the Button Background Image someBgSprite;
    uiResources.standard = someBgSprite;
    GameObject uiButton = DefaultControls.CreateButton(uiResources);
    uiButton.transform.SetParent(canvas.transform, false);
}

Toggle:

public GameObject canvas;
void Start()
{
    DefaultControls.Resources uiResources = new DefaultControls.Resources();
    //Set the Toggle Background Image someBgSprite;
    uiResources.background = someBgSprite;
    //Set the Toggle Checkmark Image someCheckmarkSprite;
    uiResources.checkmark = someCheckmarkSprite;
    GameObject uiToggle = DefaultControls.CreateToggle(uiResources);
    uiToggle.transform.SetParent(canvas.transform, false);
}

Slider:

public GameObject canvas;
void Start()
{
    DefaultControls.Resources uiResources = new DefaultControls.Resources();
    //Set the Slider Background Image someBgSprite;
    uiResources.background = someBgSprite;
    //Set the Slider Fill Image someFillSprite;
    uiResources.standard = someFillSprite;
    //Set the Slider Knob Image someKnobSprite;
    uiResources.knob = someKnobSprite;
    GameObject uiSlider = DefaultControls.CreateSlider(uiResources);
    uiSlider.transform.SetParent(canvas.transform, false);
}

Panel:

public GameObject canvas;
void Start()
{
    DefaultControls.Resources uiResources = new DefaultControls.Resources();
    //Set the Panel Background Image someBgSprite;
    uiResources.background = someBgSprite;
    GameObject uiPanel = DefaultControls.CreatePanel(uiResources);
    uiPanel.transform.SetParent(canvas.transform, false);
}

InputField:

public GameObject canvas;
void Start()
{
    DefaultControls.Resources uiResources = new DefaultControls.Resources();
    //Set the InputField Background Image someBgSprite;
    uiResources.inputField = someBgSprite;
    GameObject uiInputField = DefaultControls.CreateInputField(uiResources);
    uiInputField.transform.SetParent(canvas.transform, false);
    uiInputField.transform.GetChild(0).GetComponent<Text>().font = (Font)Resources.GetBuiltinResource(typeof(Font), "Arial.ttf");
}

Dropdown:

public GameObject canvas;
void Start()
{
    DefaultControls.Resources uiResources = new DefaultControls.Resources();
    //Set the Dropdown Background and Handle Image someBgSprite;
    uiResources.standard = someBgSprite;
    //Set the Dropdown Scrollbar Background Image someScrollbarSprite;
    uiResources.background = someScrollbarSprite;
    //Set the Dropdown Image someDropDownSprite;
    uiResources.dropdown = someDropDownSprite;
    //Set the Dropdown Image someCheckmarkSprite;
    uiResources.checkmark = someCheckmarkSprite;
    //Set the Dropdown Viewport Mask Image someMaskSprite;
    uiResources.mask = someMaskSprite;
    GameObject uiDropdown = DefaultControls.CreateDropdown(uiResources);
    uiDropdown.transform.SetParent(canvas.transform, false);
}

The rest of the UI Controls:

public static GameObject CreateImage(Resources resources);
public static GameObject CreateRawImage(Resources resources);
public static GameObject CreateScrollbar(Resources resources);
public static GameObject CreateScrollView(Resources resources);
public static GameObject CreateText(Resources resources);

2.Via prefab and Instantiate

This method requires that you have the UI already created and saved as a prefab, You can then Instantiate the UI when need.

Create a Toggle Control from the Editor then save it as a prefab. Delete the original one. You can then Instantiate the Toggle Control prefab during run-time and position or scale it if necessary.

public GameObject canvas;
public GameObject togglePrefab;

void Start()
{
    GameObject uiToggle = Instantiate(togglePrefab) as GameObject;
    uiToggle.transform.SetParent(canvas.transform, false);
    //Move to another position?
    uiToggle.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(...,...,...);
    //Re-scale?
    uiToggle.GetComponent<RectTransform>().localScale = new Vector3(...,...,...);
}

3.Piece by Piece (Hard)

You do this by first creating a UI from the Editor then study the Hierarchy and components attached to it in the Editor and reproduce it via code.

GameObject->UI->Toggle

For example, this is what Toggle looks like:

1.Create a Toggle GameObject then make it child of the Canvas.

2.Create a Background GameObject then make it child of the Toggle GameObject.

3.Create a Checkmark GameObject then make it child of the Background GameObject.

4.Create a Label GameObject then make it child of the Toggle GameObject.

5.Now attach components like Image, Text and Toggle to each GameObject like it appears in the Editor.

In Code:

public GameObject canvas;

void Start()
{
    makeToggle();
}

void makeToggle()
{
    GameObject toggleObj = createToggleObj(canvas);
    GameObject bgObj = createBackgroundObj(toggleObj);
    GameObject checkMarkObj = createCheckmarkObj(bgObj);
    GameObject labelObj = createLabelObj(toggleObj);
    attachAllComponents(toggleObj, bgObj, checkMarkObj, labelObj);
}

//1.Create a *Toggle* GameObject then make it child of the *Canvas*.
GameObject createToggleObj(GameObject cnvs)
{
    GameObject toggle = new GameObject("Toggle");
    toggle.transform.SetParent(cnvs.transform);
    toggle.layer = LayerMask.NameToLayer("UI");
    return toggle;
}

//2.Create a Background GameObject then make it child of the Toggle GameObject.
GameObject createBackgroundObj(GameObject toggle)
{
    GameObject bg = new GameObject("Background");
    bg.transform.SetParent(toggle.transform);
    bg.layer = LayerMask.NameToLayer("UI");
    return bg;
}

//3.Create a Checkmark GameObject then make it child of the Background GameObject.
GameObject createCheckmarkObj(GameObject bg)
{
    GameObject chmk = new GameObject("Checkmark");
    chmk.transform.SetParent(bg.transform);
    chmk.layer = LayerMask.NameToLayer("UI");
    return chmk;
}

//4.Create a Label GameObject then make it child of the Toggle GameObject.
GameObject createLabelObj(GameObject toggle)
{
    GameObject lbl = new GameObject("Label");
    lbl.transform.SetParent(toggle.transform);
    lbl.layer = LayerMask.NameToLayer("UI");
    return lbl;
}

//5.Now attach components like Image, Text and Toggle to each GameObject like it appears in the Editor.
void attachAllComponents(GameObject toggle, GameObject bg, GameObject chmk, GameObject lbl)
{
    //Attach Text to label
    Text txt = lbl.AddComponent<Text>();
    txt.text = "Toggle";
    Font arialFont =
    (Font)Resources.GetBuiltinResource(typeof(Font), "Arial.ttf");
    txt.font = arialFont;
    txt.lineSpacing = 1;
    txt.color = new Color(50 / 255, 50 / 255, 50 / 255, 255 / 255);
    RectTransform txtRect = txt.GetComponent<RectTransform>();
    txtRect.anchorMin = new Vector2(0, 0);
    txtRect.anchorMax = new Vector2(1, 1);
    //txtRect.y

    //Attach Image Component to the Checkmark
    Image chmkImage = chmk.AddComponent<Image>();
    chmkImage.sprite = (Sprite)AssetDatabase.GetBuiltinExtraResource(typeof(Sprite), "UI/Skin/Checkmark.psd");
    chmkImage.type = Image.Type.Simple;

    //Attach Image Component to the Background
    Image bgImage = bg.AddComponent<Image>();
    bgImage.sprite = (Sprite)AssetDatabase.GetBuiltinExtraResource(typeof(Sprite), "UI/Skin/UISprite.psd");
    bgImage.type = Image.Type.Sliced;
    RectTransform bgRect = txt.GetComponent<RectTransform>();
    bgRect.anchorMin = new Vector2(0, 1);
    bgRect.anchorMax = new Vector2(0, 1);

    //Attach Toggle Component to the Toggle
    Toggle toggleComponent = toggle.AddComponent<Toggle>();
    toggleComponent.transition = Selectable.Transition.ColorTint;
    toggleComponent.targetGraphic = bgImage;
    toggleComponent.isOn = true;
    toggleComponent.toggleTransition = Toggle.ToggleTransition.Fade;
    toggleComponent.graphic = chmkImage;
    toggle.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(0, 0, 0);
}

Method #3 is the hardest way to do this so, you should avoid it. Method #1 Should be fine in this case.

Hope this helps!

这篇关于Unity 从脚本创建 UI 控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆