我正在尝试创建一个简单的平台生成器,并且想出了以下方法:
float space = Random.Range(0, distance);
Instantiate(building, building.transform.GetChild(1).position + new Vector3(building.transform.position.x,0,0)+ new Vector3(space,0,0), Quaternion.identity);
但是,正如预期的那样,它只是根据第一个平台的位置实例化平台。我如何每次都能获得生成平台的位置,而不仅仅是第一个?
答案 0 :(得分:2)
Instantiate
函数返回其实例化的对象。您可以获取该对象并从中获取位置和旋转。
用于保存最后一个实例化对象的全局变量:
public GameObject obj;
实例化并返回对实例化对象的引用:
obj = Instantiate(building, building.transform.GetChild(1).position
+ new Vector3(building.transform.position.x, 0, 0) + new Vector3(space, 0, 0), Quaternion.identity);
访问实例化对象的位置和旋转:
Vector3 pos = obj.transform.position;
Quaternion rot = obj.transform.rotation;
如果您需要使用最后一个实例化对象的位置,则只需检查它是否null
。如果null
,请使用预制的原始预制位置,因为还没有实例化的预制。如果不是null
,则使用最后实例化的对象位置。
if (obj == null)
{
//Use the original prefab position
obj = Instantiate(building, building.transform.GetChild(1).position
+ new Vector3(building.transform.position.x, 0, 0) + new Vector3(space, 0, 0), Quaternion.identity);
}
else
{
//Use last instantiated object position
obj = Instantiate(building, obj.transform.GetChild(1).position +
new Vector3(obj.transform.position.x, 0, 0) + new Vector3(space, 0, 0), Quaternion.identity);
}
答案 1 :(得分:0)
我没有使用Unity的经验。但是,在人们循环制作Windows Forms元素的情况下,我可以为您提供此信息:
您可以循环创建它们。并且,每一个信号都会从下一个边界偏移(i * [平台宽度+平台之间的间隙])+偏移量。
您也可以将最后一个平台保留在变量范围之外的变量中。您只需要在第一个发信号时处理它为空(null)即可。并在循环完成后使其超出范围。像这样:
{
Platform lastPlatform = null;
for(...){
}
}
我希望有一些更好的Unity特定解决方案。