Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改共享脚本中的变量,而不影响共享该脚本的所有其他游戏对象?_C#_Unity3d_Variables_Private_Shared - Fatal编程技术网

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

C# 如何更改共享脚本中的变量,而不影响共享该脚本的所有其他游戏对象?,c#,unity3d,variables,private,shared,C#,Unity3d,Variables,Private,Shared,我花了一整天的时间试图解决这个问题,因为我不想为每一个项目创建一个单独的脚本,而是想创建一个EnemyBulletMovement脚本,它可以以不同的方式移动每一个项目,具体取决于我在实例化它时输入的BulletType int 问题是,如果我同时发射多个项目符号,它们将在实例化另一个项目符号后立即更改BulletType,因为它们都共享同一个脚本 我的目标是让所有项目符号都有一个私有脚本,但无论我尝试什么,每次我尝试为其中一个项目符号更改变量时,所有活动项目符号的变量都将更改 EnemyCon

我花了一整天的时间试图解决这个问题,因为我不想为每一个项目创建一个单独的脚本,而是想创建一个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);
        }
编辑:这个调试快照从未出现在我的控制台中,所以可能这里没有正确读取bulletType?为了澄清,第一个Debug.LogbulletType;返回0或2,使其正常工作。但是第二个Debug.LogShootin;永远不会被打印出来

我尝试了private、static,并用整个EnemyBulletMovement脚本制作了一个实例,但没有任何效果

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

编辑:在下面添加了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;
}
}

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


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

谢谢您的回答,我的项目符号类型定义为私有int。我已编辑了问题并添加了ObjectPooler脚本。我不知道如何处理,但已修复!它是否与SharedInstance=this@eriksprogram只是一个猜测,但我会尝试activeSelf而不是ActiveInHierarchy。可能是池程序在同一调用中返回同一对象。另外,请尝试在pooler实例化中设置唯一的obj3.name,并使用bullet类型将其记录在BulletMotion中,以查看您是否处理了正确的对象。
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;
}
}