在运行时添加GameObject

时间:2015-02-12 09:37:01

标签: c# unity3d gameobject unity3d-2dtools

这似乎是一个愚蠢的问题,但我坚持下去。我在一个列表(List<GameObject>)中有GameObjects,我想在场景运行时添加它们,最好是在预定义的位置(如占位符或其他东西)。什么是一个好方法呢?我一直在网上搜索但是找不到能解决这个问题的东西。到目前为止,这是我的代码:

public static List<GameObject> imglist = new List<GameObject>();
private Vector3 newposition;
public static GameObject firstGO;
public GameObject frame1;//added line

void Start (){
newposition = transform.position;
firstGO = GameObject.Find ("pic1");
frame1 = GameObject.Find ("Placeholder1");//added line

//this happens when a button is pressed
imglist.Add(firstGO);
foreach(GameObject gos in imglist ){
            if(gos != null){
                print("List: " + gos.name);
                try{
                    //Vector3 temp = new Vector3 (0f, 0f, -5f);
                    Vector3 temp = new Vector3( frame1.transform.position.x, frame1.transform.position.y, -1f);//added line
                    newposition = temp;
                    gos.transform.position += newposition;
                    print ("position: " + gos.transform.position);
                }catch(System.NullReferenceException e){}
            }
        }
}

如何将照片(5)放在预定义的位置?

//----------------

编辑:现在我可以将1张图片放置到占位符(透明png)。由于某种原因,z值遍布整个地方,因此需要强制为-1f,但这没关系。我将图像从其他场景添加到列表中,其中可以有1-5个。我是否需要将占位符放在另一个列表或数组中?我在这里有点迷失。

3 个答案:

答案 0 :(得分:1)

如果你已经创建了5个新对象,你可以像在这里一样做: InvokeScript下的http://unity3d.com/learn/tutorials/modules/beginner/scripting/invoke

foreach(GameObject gos in imglist)
{
    Instantiate(gos, new Vector3(0, 2, 0), Quaternion.identity);
}

答案 1 :(得分:0)

我真的不明白你要做什么,但是如果我是正确的并且你有一个对象列表,并且你知道你想在运行时移动它们的位置,那么只需要制作两个列表, 一个包含对象和 一个包含放置在这些预定义位置的场景中的空游戏对象的变换,并在运行时匹配它们。

从检查器中填充两个列表。

public List<GameObject> imglist = new List<GameObject>();
public List<Transform> imgPositions = new List<Transform>();


void Start()
{
    for(var i = 0 i < imglist.Count; ++i)
    {
        imglist[i].transform.position = imgPositions[i].position
    }
}

答案 2 :(得分:0)

一般最好的方法是为对象创建预制件,将它们作为参数传递并在需要时进行实例化(在您的情况下开始)。这是常见的情况,但也许你的情况略有不同。

这是传递prefabs数组并为数组中的每个实例化一个对象的示例:

public GameObject prefabs[];
List<GameObject> objects = new List<GameObject>();

void Start() {
    for(GameObject prefab in prefabs) {
        GameObject go = Instantiate(prefab, Vector3.zero, Quaternion.identity) as GameObject; // Replace Vector3.zero by actual position

        objects.Add(go); // Store objects to access them later: total enemies count, restart game, etc.
    }
}

如果您需要多个相同预制件的实例(例如多个敌人或物品),请调整上面的代码。