你应该将
Toggle
作为
Canvas
的子级。在你的代码中没有这样做。另外,你移动了一个UI组件和GameObject,使用的是
newGO.GetComponent<RectTransform>().anchoredPosition3D
而不是
newGO.transform.position
。
在Unity中创建完整UI控件的方法有三种:
1. 使用
DefaultControls
API生成它(简单且推荐)
使用
DefaultControls
类,Unity会创建所提供的UI,然后返回UI的父级。这是最简单和推荐的方法。它以
DefaultControls.Resources
作为参数,这样您就可以在创建默认UI控件时提供要使用的精灵。
public GameObject canvas;
void Start()
{
DefaultControls.Resources uiResources = new DefaultControls.Resources();
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();
uiResources.background = someBgSprite;
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();
uiResources.background = someBgSprite;
uiResources.standard = someFillSprite;
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();
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();
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.通过Prefab和Instantiate
这种方法需要你已经创建并保存UI作为prefab。然后在需要的时候,可以使用Instantiate
实例化UI。
从编辑器中创建一个Toggle
控件,然后将其保存为prefab。删除原始控件。您可以在运行时实例化Toggle
控件预制件,并根据需要定位或缩放它。
public GameObject canvas;
public GameObject togglePrefab;
void Start()
{
GameObject uiToggle = Instantiate(togglePrefab) as GameObject;
uiToggle.transform.SetParent(canvas.transform, false);
uiToggle.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(...,...,...);
uiToggle.GetComponent<RectTransform>().localScale = new Vector3(...,...,...);
}
3. 逐个创建(困难)
首先从编辑器中创建一个 UI,然后在编辑器中研究 Hierarchy 和与之相关联的组件,通过代码再次复制它。
GameObject->UI->Toggle
例如,这是 Toggle 的外观:
![enter image description here](https://istack.dev59.com/q8Ibs.webp)
1. 创建一个 Toggle GameObject,将其设置为 Canvas 的子物体。
2. 创建一个 Background GameObject,将其设置为 Toggle GameObject 的子物体。
3. 创建一个 Checkmark GameObject,将其设置为 Background GameObject 的子物体。
4. 创建一个 Label GameObject,将其设置为 Toggle GameObject 的子物体。
5. 现在像在编辑器中一样,将组件如 Image
、Text
和 Toggle
附加到每个 GameObject 上。
在代码中:
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);
}
GameObject createToggleObj(GameObject cnvs)
{
GameObject toggle = new GameObject("Toggle");
toggle.transform.SetParent(cnvs.transform);
toggle.layer = LayerMask.NameToLayer("UI");
return toggle;
}
GameObject createBackgroundObj(GameObject toggle)
{
GameObject bg = new GameObject("Background");
bg.transform.SetParent(toggle.transform);
bg.layer = LayerMask.NameToLayer("UI");
return bg;
}
GameObject createCheckmarkObj(GameObject bg)
{
GameObject chmk = new GameObject("Checkmark");
chmk.transform.SetParent(bg.transform);
chmk.layer = LayerMask.NameToLayer("UI");
return chmk;
}
GameObject createLabelObj(GameObject toggle)
{
GameObject lbl = new GameObject("Label");
lbl.transform.SetParent(toggle.transform);
lbl.layer = LayerMask.NameToLayer("UI");
return lbl;
}
void attachAllComponents(GameObject toggle, GameObject bg, GameObject chmk, GameObject lbl)
{
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);
Image chmkImage = chmk.AddComponent<Image>();
chmkImage.sprite = (Sprite)AssetDatabase.GetBuiltinExtraResource(typeof(Sprite), "UI/Skin/Checkmark.psd");
chmkImage.type = Image.Type.Simple;
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);
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);
}
第三种方法是最困难的,所以你应该避免使用它。在这种情况下,第一种方法应该是可以的。
希望这可以帮到你!