【问题标题】:Instantiating a U.I object at the position of another object while keeping the Canvas as the parent在另一个对象的位置实例化一个 UI 对象,同时保持 Canvas 作为父对象
【发布时间】:2020-07-06 08:05:40
【问题描述】:

遇到了一个我正在努力解决的 UI 问题(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);

这解决了在画布之外进行实例化的问题,但也(令人恼火地)重置了实例化位置,令人尴尬的是,我不知道如何将其重新设置,同时确保它仍然是画布的子项。还没有事件触及改名部分。

从昨晚开始我就一直在研究这个,虽然我得到了很多不同的结果进行实验,但没有一个是我想要的。还是个新手,所以我确信它正看着我,所以请帮我找到它。

【问题讨论】:

    标签: c# unity3d user-interface instantiation


    【解决方案1】:

    首先,我强烈建议尽可能避免使用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,则修改父相对位置、缩放和旋转,以使对象保持与以前相同的世界空间位置、旋转和缩放.

    worldPositionStays 参数的默认值为true

    简单地把它排除在外

    HUD.transform.SetParent(_parentCanvas);
    // this equals
    //HUD.transform.SetParent(_parentCanvas, true);
    

    或者你甚至可以在 Object.Instantiate 中一次性完成,这需要一个额外的参数

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

    // This directly instantiates the new hud as child of _parentCanvas
    // while still taking the position and rotation in absolute worldspace
    GameObject HUD = Instantiate(EnemyHUB, Positions[i].position, Positions[i].rotation, _parentCanvas);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多