问题描述
我一整天都在试图解决这个问题,因为我不想为每个子弹制作一个单独的脚本,而是我想要一个 EnemyBulletMovement 脚本,它可以以不同的方式移动每个子弹,具体取决于BulletType int 我在实例化它时输入它。
问题是,如果我同时发射多颗子弹,一旦另一个子弹被实例化,它们都会改变 BulletType,因为它们都共享相同的脚本。
我的目标是让所有项目符号都有一个私有脚本,但无论我尝试什么,每次我尝试仅为其中一个更改变量时,所有活动项目符号的变量仍然会更改。
EnemyController 脚本,用于实例化子弹并为它们提供 BulletType 值:
GameObject enemyBullet = ObjectPooler.SharedInstance.GetPooledEnemyBullet();
if (enemyBullet != null)
{
Quaternion rotationAmount = Quaternion.Euler(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
}
}
编辑:这个调试 Shootin
从来没有出现在我的控制台中,所以也许 bulletType 在这里根本没有被正确读取?为澄清起见,第一个 Debug.Log(bulletType);
返回 0 或 2,因此它可以正常工作。但是第二个 Debug.Log("Shootin");
永远不会被打印出来。
我尝试了私有的、静态的,并从整个 EnemyBulletMovement 脚本中创建了一个实例,但没有任何效果。
当我调试这段代码时,脚本可以工作,bulletType 将从 2 变为 0 并返回,但是当它改变时,它会改变两个子弹,所以两者都会以相同的方式飞行,当我想要的是每个子弹跟随自己的运动。如果没有办法做到这一点,我将不得不为每个子弹运动创建一个单独的脚本,但我在这里只显示 2 个,而且我已经有很多了,这就是为什么我想尝试一下并使其与 {{ 1}},然后使用 if statements
。
编辑:在下面添加了 ObjectPooler 脚本。
case statements
解决方法
项目符号类型应声明为 private int bulletType
。如果您将项目符号类型声明为 private static int bulletType
,则所有项目符号都相同。
如果它已经声明为private int bulletType
,那么你应该检查你使用对象池的逻辑。您可能会一遍又一遍地处理同一个项目符号,或者处理池中的所有项目符号。