在运行时添加游戏对象
adding GameObject at runtime
这似乎是一个愚蠢的问题,但我坚持不懈。我在列表 (List<GameObject>
) 中有 GameObjects,我想将它们添加到场景运行时,prefarbly 在预定义的位置(如占位符或其他东西)。这样做的好方法是什么?我一直在网上搜索,但找不到任何可以解决此问题的方法。到目前为止,这是我的代码:
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 个。我需要将占位符放在另一个列表或数组中吗?我有点迷路了。
如果您已经创建了 5 个新对象,您可以像这里一样操作:
http://unity3d.com/learn/tutorials/modules/beginner/scripting/invoke下InvokeScript
foreach(GameObject gos in imglist)
{
Instantiate(gos, new Vector3(0, 2, 0), Quaternion.identity);
}
我真的不明白你想做什么,但如果我是正确的并且你有一个对象列表,并且你知道你想在运行时将它们移动到哪里,只需制作两个列表,
一个包含对象和
一个包含场景中放置在这些预定义位置的空游戏对象的变换,并在运行时匹配它们。
从检查器填充两个列表。
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
}
}
一般最好的方法是为您的对象创建预制件,将它们作为参数传递并在需要时实例化(从您的情况开始)。这是常见的情况,但也许您的情况略有不同。
这是传递预制数组并为数组中的每个对象实例化一个对象的示例:
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.
}
}
如果您需要同一预制件的多个实例(例如多个敌人或物品),只需修改上面的代码。
这似乎是一个愚蠢的问题,但我坚持不懈。我在列表 (List<GameObject>
) 中有 GameObjects,我想将它们添加到场景运行时,prefarbly 在预定义的位置(如占位符或其他东西)。这样做的好方法是什么?我一直在网上搜索,但找不到任何可以解决此问题的方法。到目前为止,这是我的代码:
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 个。我需要将占位符放在另一个列表或数组中吗?我有点迷路了。
如果您已经创建了 5 个新对象,您可以像这里一样操作: http://unity3d.com/learn/tutorials/modules/beginner/scripting/invoke下InvokeScript
foreach(GameObject gos in imglist)
{
Instantiate(gos, new Vector3(0, 2, 0), Quaternion.identity);
}
我真的不明白你想做什么,但如果我是正确的并且你有一个对象列表,并且你知道你想在运行时将它们移动到哪里,只需制作两个列表, 一个包含对象和 一个包含场景中放置在这些预定义位置的空游戏对象的变换,并在运行时匹配它们。
从检查器填充两个列表。
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
}
}
一般最好的方法是为您的对象创建预制件,将它们作为参数传递并在需要时实例化(从您的情况开始)。这是常见的情况,但也许您的情况略有不同。
这是传递预制数组并为数组中的每个对象实例化一个对象的示例:
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.
}
}
如果您需要同一预制件的多个实例(例如多个敌人或物品),只需修改上面的代码。