微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更改共享脚本中的变量,而不影响共享该脚本的所有其他游戏对象?

如何解决如何更改共享脚本中的变量,而不影响共享该脚本的所有其他游戏对象?

我一整天都在试图解决这个问题,因为我不想为每个子弹制作一个单独的脚本,而是我想要一个 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,那么你应该检查你使用对象池的逻辑。您可能会一遍又一遍地处理同一个项目符号,或者处理池中的所有项目符号。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。