如何在不影响共享脚本的所有其他游戏对象的情况下更改共享脚本中的变量



我整天都在努力解决这个问题,因为我不想为每个项目符号制作一个单独的脚本,相反,我想有一个EnemyBulletMovement脚本,它可以以不同的方式移动每个项目符号,这取决于我实例化它时输入的BulletType int。

问题是,如果我同时发射多个子弹,那么一旦实例化另一个子弹,它们都会更改BulletType,因为它们都共享同一个脚本。

我的目标是让所有项目符号都有一个私有脚本,但无论我尝试什么,每次我尝试为其中一个项目符号更改变量时,所有活动项目符号的变量仍然会更改。

EnemyController脚本,用于实例化子弹并为其提供BulletType值:

GameObject enemyBullet = ObjectPooler.SharedInstance.GetPooledEnemyBullet();
if (enemyBullet != null)
{
Quaternion rotationAmount = Quaternion.Euler(0, 0, 0);
Quaternion postRotation = transform.rotation * rotationAmount;
enemyBullet.transform.position = transform.position;
enemyBullet.transform.rotation = postRotation;
enemyBullet.SetActive(true);
enemyBullet.GetComponent<EnemyBulletMovement>().SetBullet(2);
}
GameObject enemyBullet2 = ObjectPooler.SharedInstance.GetPooledEnemyBullet();
if (enemyBullet2 != null)
{
Quaternion rotationAmount = Quaternion.Euler(0, 3, 0);
Quaternion postRotation = transform.rotation * rotationAmount;
enemyBullet2.transform.position = transform.position;
enemyBullet2.transform.rotation = postRotation;
enemyBullet2.SetActive(true);
enemyBullet2.GetComponent<EnemyBulletMovement>().SetBullet(0);
}

共享EnemyBulletMotion脚本,从上面的脚本中获取bulletType。这就是问题所在:

public void SetBullet(int typeIndex)
{
bulletType = typeIndex;
Debug.Log(bulletType);
}
private void BulletMotion()
{

if (bulletType == 0)
{
rb.velocity = pos;
}
if (bulletType == 1)
{
axis = Mathf.Sin(Time.deltaTime * -frequency) * magnitude * transform.up;  // Up down Wave motion
transform.Rotate(Vector3.forward * sideMag);                               // Side Sway Motion (+ Wave = Spiral Motion)
rb.velocity = pos + axis;                                                  // Combine all Motions
}
if (bulletType == 2)
{
Debug.Log("Shootin");
axis = Mathf.Sin(Time.deltaTime * -frequency) * magnitude * transform.up;  // Up down Wave motion
transform.Rotate(Vector3.forward * -sideMag);                              // Side Sway Motion (+ Wave = Spiral Motion)
rb.velocity = pos + axis;                                                  // Combine all Motions
}
}

EDIT:这个调试Shootin从未出现在我的控制台中,所以可能这里根本没有正确读取bulletType?对于澄清,第一个Debug.Log(bulletType);返回一个0或一个2,因此它正在工作。但第二个Debug.Log("Shootin");永远不会被打印出来

我尝试了私有的、静态的,并用EnemyBulletMovement的整个脚本制作了一个实例,但没有任何效果。

当我调试这段代码时,脚本会工作,bulletType会从2变为0,然后再变回来,但当它这样做时,它会改变两个项目符号,所以两者都会以相同的方式飞行,而我想要的是让每个项目符号都跟随自己的运动。如果没有办法做到这一点,我将不得不为每个bulletmotion创建一个单独的脚本,但我在这里只显示了2个,我已经有很多了,这就是为什么我想尝试一下,让它与if statements一起工作,然后稍后使用case statements

编辑:在下面添加了ObjectPooler脚本。

public List<GameObject> pooledEnemyBullets;
public GameObject EnemyBulletToPool;
public int EnemyBulletAmountToPool;
pooledEnemyBullets = new List<GameObject>();
public static ObjectPooler SharedInstance;
void Awake()
{
SharedInstance = this;
}

void Start()
{
for (int i = 0; i < EnemyBulletAmountToPool; i++)
{
GameObject obj3 = (GameObject)Instantiate(EnemyBulletToPool);
obj3.SetActive(false);
pooledEnemyBullets.Add(obj3);
}
}
public GameObject GetPooledEnemyBullet()
{
//1
for (int i = 0; i < pooledEnemyBullets.Count; i++)
{
//2
if (!pooledEnemyBullets[i].activeInHierarchy)
{
return pooledEnemyBullets[i];
}
}
//3   
return null;
}
}

项目符号类型应声明为private int bulletType。如果将项目符号类型声明为private static int bulletType,则所有项目符号的类型都相同。

如果它已经声明为private int bulletType,那么您应该检查使用对象池的逻辑。您可能正在反复处理同一个项目符号,或者处理池中的所有项目符号。

最新更新