【问题标题】:Unity Create UI control from scriptUnity 从脚本创建 UI 控件
【发布时间】:2016-12-17 01:24:33
【问题描述】:

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

我是 Unity 新手,这非常困难。

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

【问题讨论】:

    标签: c# unity3d toggle unity5


    【解决方案1】:

    您应该将Toggle 设为Canvas 的子级。你没有在你的代码中这样做。此外,您使用 newGO.GetComponent&lt;RectTransform&gt;().anchoredPosition3D 而不是 newGO.transform.position 移动 UI 组件和 GameObject。

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

    1.使用DefaultControls API 生成(简单且推荐)

    使用DefaultControls 类,Unity 将创建提供的 UI,然后返回 UI 的父级。这是最简单和推荐的方法。 它以DefaultControls.Resources 作为参数,以便您可以在创建默认 UI 控件时提供要使用的精灵。

    按钮:

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

    切换:

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

    滑块:

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

    面板:

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

    输入字段:

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

    下拉菜单:

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

    其余的 UI 控件:

    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.通过预制和实例化

    此方法要求您已经创建了 UI 并保存为预制件,然后您可以在需要时Instantiate UI。

    从编辑器创建一个Toggle 控件,然后将其保存为预制件。删除原来的。然后,您可以在运行时 Instantiate Toggle 控制预制件,并在必要时定位或缩放它。

    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)

    您首先从编辑器创建一个 UI,然后在编辑器中研究层次结构和附加到它的组件并通过代码重现它。

    游戏对象->UI->切换

    例如,这就是 Toggle 的样子:

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

    2。创建一个 Background 游戏对象,然后使其成为 Toggle 游戏对象的子对象。

    3.创建一个复选标记游戏对象,然后将其设为背景游戏对象的子对象。

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

    5。现在将ImageTextToggle 等组件附加到每个游戏对象,就像它在编辑器中显示一样。

    在代码中:

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

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

    希望这会有所帮助!

    【讨论】:

    • 这很棒。但是 Unity API 仍然缺少基本功能 - 例如。它不会使用默认的背景图像、按钮图像等(根据定义,它应该这样做)。但是这个技巧会为你解决这个问题:forum.unity3d.com/threads/…
    • 是的。这是一个缺点。希望 Unity 能解决这个问题。谢谢你的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多