如何在一个脚本中使用合并列表中的两个对象?
How to use two objects from a pooled list in one script?
我正在尝试了解对象池。我能够让脚本一次拉出一个对象,但我需要能够同时从列表中拉出三个或更多对象。
我的对象池脚本很大,所以除非必要,否则我真的不想分享整个东西。
我需要能够更改火焰生成的位置,因此我创建了一个脚本来执行此操作:
private void CreateWavesForFlames(GameObject flame, float xBase, float xDisplacement, float dropHeight)
{
flame.transform.position = new Vector3(xBase + xDisplacement, dropHeight, 0);
flame.SetActive(true); //this turn the pooled object on
}
所以我需要同时生成三个火焰并更改它们的生成位置
wave 调用看起来像这样:
void Wave1() {
Debug.Log("Wave1");
tempGOHolder = gm.GetLargeFire();
CreateWavesForFlames(tempGOHolder, 0, 0, 12);
CreateWavesForFlames(tempGOHolder, 10, 0, 12);
CreateWavesForFlames(tempGOHolder, 15, 0, 12);
}
只创建了一个火焰,它使用了最后一个 CreatWavesForFlames。我需要三个不同。
任何有关如何执行此操作的建议都很棒。
嗯..这就是您的代码所期望的。如果你想要 3 个不同的火焰对象,那么你将不得不这样做(假设 "gm" 是你的池管理器对象):
tempGOHolder = gm.GetLargeFire();
CreateWavesForFlames(tempGOHolder, 0, 0, 12);
tempGOHolder = gm.GetLargeFire();
CreateWavesForFlames(tempGOHolder, 10, 0, 12);
tempGOHolder = gm.GetLargeFire();
CreateWavesForFlames(tempGOHolder, 15, 0, 12);
我知道这个问题已经得到解答,但我认为还有更好的解决方案。上面的答案很棒。假设您想通过不重复调用 GetLargeFire()
函数来缩短代码,您可以使用下面的方法。
假设您的池脚本中的 GetLargeFire()
函数如下所示:
GameObject GetLargeFire()
{
return availableGameObject;
}
您可以创建 GetLargeFire()
函数的重载,以填充传递给它的数组。我不建议返回数组,因为它会分配内存,从而使您的池脚本无用。传入的数组填满比较好
public void GetLargeFire(GameObject[] gOBJ, int amountToReturn)
{
for (int i = 0; i < gOBJ.Length; i++)
{
if (i < amountToReturn)
{
gOBJ[i] = GetLargeFire();
}
else
{
//Fill the rest with null to override what was inside of it previously
gOBJ[i] = null;
}
}
}
现在,要像问题中的示例一样使用它,您应该将 tempGOHolder
声明为数组并选择您认为足够的数字。我们将在这个例子中使用 3。
GameObject[] tempGOHolder;
void Start()
{
tempGOHolder = new GameObject[3];
}
void Wave1() {
Debug.Log("Wave1");
gm.GetLargeFire(tempGOHolder, 3);
CreateWavesForFlames(tempGOHolder[0], 0, 0, 12);
CreateWavesForFlames(tempGOHolder[1], 10, 0, 12);
CreateWavesForFlames(tempGOHolder[2], 15, 0, 12);
}
您甚至可以使用循环创建 Waves CreateWavesForFlames
,代码更少。
我正在尝试了解对象池。我能够让脚本一次拉出一个对象,但我需要能够同时从列表中拉出三个或更多对象。
我的对象池脚本很大,所以除非必要,否则我真的不想分享整个东西。
我需要能够更改火焰生成的位置,因此我创建了一个脚本来执行此操作:
private void CreateWavesForFlames(GameObject flame, float xBase, float xDisplacement, float dropHeight)
{
flame.transform.position = new Vector3(xBase + xDisplacement, dropHeight, 0);
flame.SetActive(true); //this turn the pooled object on
}
所以我需要同时生成三个火焰并更改它们的生成位置
wave 调用看起来像这样:
void Wave1() {
Debug.Log("Wave1");
tempGOHolder = gm.GetLargeFire();
CreateWavesForFlames(tempGOHolder, 0, 0, 12);
CreateWavesForFlames(tempGOHolder, 10, 0, 12);
CreateWavesForFlames(tempGOHolder, 15, 0, 12);
}
只创建了一个火焰,它使用了最后一个 CreatWavesForFlames。我需要三个不同。
任何有关如何执行此操作的建议都很棒。
嗯..这就是您的代码所期望的。如果你想要 3 个不同的火焰对象,那么你将不得不这样做(假设 "gm" 是你的池管理器对象):
tempGOHolder = gm.GetLargeFire();
CreateWavesForFlames(tempGOHolder, 0, 0, 12);
tempGOHolder = gm.GetLargeFire();
CreateWavesForFlames(tempGOHolder, 10, 0, 12);
tempGOHolder = gm.GetLargeFire();
CreateWavesForFlames(tempGOHolder, 15, 0, 12);
我知道这个问题已经得到解答,但我认为还有更好的解决方案。上面的答案很棒。假设您想通过不重复调用 GetLargeFire()
函数来缩短代码,您可以使用下面的方法。
假设您的池脚本中的 GetLargeFire()
函数如下所示:
GameObject GetLargeFire()
{
return availableGameObject;
}
您可以创建 GetLargeFire()
函数的重载,以填充传递给它的数组。我不建议返回数组,因为它会分配内存,从而使您的池脚本无用。传入的数组填满比较好
public void GetLargeFire(GameObject[] gOBJ, int amountToReturn)
{
for (int i = 0; i < gOBJ.Length; i++)
{
if (i < amountToReturn)
{
gOBJ[i] = GetLargeFire();
}
else
{
//Fill the rest with null to override what was inside of it previously
gOBJ[i] = null;
}
}
}
现在,要像问题中的示例一样使用它,您应该将 tempGOHolder
声明为数组并选择您认为足够的数字。我们将在这个例子中使用 3。
GameObject[] tempGOHolder;
void Start()
{
tempGOHolder = new GameObject[3];
}
void Wave1() {
Debug.Log("Wave1");
gm.GetLargeFire(tempGOHolder, 3);
CreateWavesForFlames(tempGOHolder[0], 0, 0, 12);
CreateWavesForFlames(tempGOHolder[1], 10, 0, 12);
CreateWavesForFlames(tempGOHolder[2], 15, 0, 12);
}
您甚至可以使用循环创建 Waves CreateWavesForFlames
,代码更少。