首页 > 解决方案 > 有没有办法指定游戏对象在层次结构中统一生成的位置?

问题描述

我已经设置了一个随机生成器来创建新的游戏对象,但是它们是在我的画布之外创建的,因此在玩游戏时看不到它们。有没有什么办法解决这一问题?对象“否定想法”是 UI 按钮,并且正在画布之外创建,即使我需要它们出现在屏幕上以便可以使用它们。

我确实看到了一个类似的问题,但这些建议对我的问题不起作用。

这对我来说非常令人沮丧,任何帮助都会很棒!

标签: unity3dlocationhierarchyspawn

解决方案


你可以简单地传递parentInstantiate

parent
将分配给新对象的父级

var newObj = Instantiate(prefab, parentTransform);

或附加转换

var newObj = Instantiate (prefab, position, rotation, parentTransform);

或者正如其他人已经说过的那样,您仍然可以随时通过简单地分配一个新的transform.parent

newObj.transform.parent = parentTransform;

或使用transform.SetParent

newObj.transform.SetParent(parentTransform, worldPositionStays);

后者的优点是你有一个可选参数worldPositionStays

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

分配一个新的

transform.parent = parentTransform;`

将始终以相同的方式行事

transform.SetParent(parentTransform);

因为worldPositionStays(所以如果你没有明确传递它)的默认值是true.


因此,对于 a 中 UI 的特定情况,Canvas您可以使用

public TheSpawnComponent : MonoBehaviour
{
    // Via the Inspector drag&drop any object here that is inside the canvas
    // or the canvas itself
    [SerializeField] private GameObject parentInCanvas;

    [SerializeField] private Button buttonPrefab;

    public void DoInstantiate()
    {
        var newButton = Instantiate (buttonPrefab, parentInCanvas);
        //Todo Position and callback
    }
}

或者,如果生成器脚本附加到画布内的对象,您也可以直接使用

var newButton = Instantiate(buttonPrefab, transform);

推荐阅读