在将Canvas保留为父对象的同时在另一个对象的位置实例化一个U.I对象

问题描述 投票:0回答:1

遇到我正在努力解决的U.I问题(UI一直是我的问题)。该项目的要点是,我有一个生成点数组(Positions [i]),一个由敌方预制件(Enemies [j])组成的数组,以及一个带有文本组件(EnemyHUD)的UI面板预制件。当我通过某个函数传递字符串名称时,只要存在一个具有相同名称和位置的预制件,它就会加载到敌人手中。现在,对于装入的每个敌人预制件,我都希望在敌人的位置实例化“ EnemyHUD”预制件,并在文本上显示敌人的名字。

GameObject HUD = Instantiate(EnemyHUB, Positions[i].position, Positions[i].rotation);

此行在正确的位置生成EnemyHUD预制件,但将其实例化到画布之外,因此显示为红色x。所以我添加了这个:

HUD.transform.SetParent(GameObject.Find("Canvas").transform, false);

这解决了在画布外实例化的问题,但又(令人烦恼)重新设置了实例化位置,令人尴尬的是,我不确定如何在设置它为Canvas的子对象的同时重新设置它。事件尚未触摸名称更改部分。

自昨晚以来,我一直在为此进行研究,尽管我尝试了许多不同的结果,但没有一个是我想要的。非常新手,所以我确定它在看着我,所以请帮助我找到它。

c# unity3d user-interface instantiation
1个回答
0
投票

首先,我强烈建议尽可能避免使用Find!而是已经引用了Canvas并存储了其引用。特别是i假设您是循环执行的,因此重复使用Find效率极低!

// Drag you Canvas object into this field via the Inspector in Unity
[SerializeField] private Canvas _parentCanvas;

private void Awake()
{
    // use this only as fallback an only ONCE
    if(!_parentCanvas) _parentCanvas = GameObject.Find("Canvas");

    if(!_parentCanvas) Debug.LogError("Could not get Canvas!", this);
}

然后调用Transform.SetParent的第二个参数

worldPositionStays如果为true,则修改父相对位置,比例和旋转,以使对象与以前保持相同的世界空间位置,旋转和比例

Transform.SetParent参数的默认值为worldPositionStays

或者简单地将其省略

true

或者您甚至可以在HUD.transform.SetParent(_parentCanvas); // this equals //HUD.transform.SetParent(_parentCanvas, true); 中单步执行,它需要一个附加参数

parent将分配给新对象的父级。

Object.Instantiate
© www.soinside.com 2019 - 2024. All rights reserved.