c# - Unity 从脚本创建 UI 控件

标签 c# toggle unity3d

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

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

最佳答案

你应该制作 Toggle Canvas 的 child .你没有在你的代码中这样做。此外,您使用 newGO.GetComponent<RectTransform>().anchoredPosition3D 移动 UI 组件和游戏对象。不是newGO.transform.position .

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

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

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

按钮:

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

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

面板:

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(硬)

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

GameObject->UI->切换

例如,这是 Toggle 的样子:

enter image description here

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

2.创建一个Background GameObject 然后让它成为Toggle GameObject 的子对象。

3.创建一个 Checkmark GameObject,然后将其作为 Background GameObject 的子对象。

4.创建一个 Label 游戏对象,然后将其作为 Toggle 游戏对象的子对象。

5。现在附加组件,如 Image , TextToggle每个游戏对象就像它出现在编辑器中一样。

在代码中:

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 在这种情况下应该没问题。

希望这对您有所帮助!

关于c# - Unity 从脚本创建 UI 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41194515/

相关文章:

c# - 从 Linqkit 获取 SQL 字符串

javascript - 元素在键盘输入时不由自主地切换

android - 按下按钮时在听筒和扬声器之间切换

android - 我怎样才能从谷歌播放服务排行榜获得高分?

audio - 使声音触发器起作用

c# - 如何在一段时间内更改变量

c# - C# 中的 Windows shell 脚本

c# - X文档 : is it possible to force the load of a malformed XML file?

c# - 指数分布柏林噪声的实现问题

Jquery使用toggle方法检查所有内容