C# 如何控制每个实例化脚本的bool个体

C# 如何控制每个实例化脚本的bool个体,c#,unity3d,C#,Unity3d,所以我想让这个脚本检查bool是否为真,如果为真,则播放一次音频,但如果为假,则不播放音频,但问题是,这个脚本存在于多个游戏对象中,并且总是不断打开和关闭,因此bool在这个游戏对象上可能为真,但在另一个对象上可能为假,因此当我尝试检查bool值时,它会被忽略返回true和false,因此在两个游戏对象满足相同条件之前,永远不会真正执行if条件来播放音乐…如何修复此问题 附言:游戏对象不是预设的 private void Update() { if (isChas

所以我想让这个脚本检查bool是否为真,如果为真,则播放一次音频,但如果为假,则不播放音频,但问题是,这个脚本存在于多个游戏对象中,并且总是不断打开和关闭,因此bool在这个游戏对象上可能为真,但在另一个对象上可能为假,因此当我尝试检查bool值时,它会被忽略返回true和false,因此在两个游戏对象满足相同条件之前,永远不会真正执行if条件来播放音乐…如何修复此问题

附言:游戏对象不是预设的

    private void Update()
    {
        if (isChasing && inSightArea)
        {
            if (!enemyFOV.chaseSound.isPlaying)
            {
                Debug.Log("music playing");
                enemyFOV.chaseSound.Play();
            }

            Debug.Log(enemyFOV.chaseSound.isPlaying);
        }

        else 
        {
            Debug.Log("is patrolling");
            enemyFOV.chaseSound.Stop();
        }

    }

“music playing”调试日志似乎是在我想要的正确时间记录的,但是enemyFOV.chaseSound.Play()是错误的;不知何故,直到来自两个对象的两个bool由于某种原因返回true,才开始运行。

我觉得您的
enemyFOV
是两个对象的相同的实例

因此,如果在一个实例中,
isChasing&&inSightArea
true
,但在另一个实例中则不是

=>一个对象启动声音,另一个对象立即停止声音


我宁愿存储所有当前正在追逐的对象,并让您的
EnemyFOV
类控制声音,例如

public class EnemyFOV : MonoBehaviour
{
    // store all currently chasing instances
    private readonly HashSet<YourScript> currentlyChasing = HashSet<YourScript>();

    // your audiosource as you have it anyway
    public AudioSource chaseSound;

    // call this one instead
    public void SetChasing(YourScript yourScript, bool iAmChasing)
    {
        if(iAmChasing)
        {
            // Store this instance
            if(!currentlyChasing.Contains(yourScript)) currentlyChasing.Add(yourScript);
        }
        else
        {
            // remove this instance 
            if(currentlyChasing.Contains(yourScript)) currentlyChasing.Remove(yourScript);
        }

        // If there is at least one instance and no sound is playing
        if(currentlyChasing.Count > 0 && !chaseSound.isPlaying)
        {
            // -> start the sound
            Debug.Log("music playing");
            chaseSound.Play();
        }
        // If there is no chasing instance but sound is playing
        else if (currentlyChasing.Count == 0 && chaseSound.isPlaying)
        {
            // -> stop the sound
            chaseSound.Stop();
        }
    }
}
private void Update()
{
    enemyFOV.SetChasing(this, isChasing && inSightArea);
}