【问题标题】:OnTriggerEnter Restarts AudioOnTriggerEnter 重新启动音频
【发布时间】:2014-05-18 23:41:36
【问题描述】:

我试图创建一个触发区域,以便当您进入一个选中 Is Trigger 的球体对撞机时,音乐开始播放,而当您退出时音乐停止。只有一个问题。如果我真的从球体对撞机内部开始,并向前迈出一步,“唤醒时播放”已经打开的音频会停止一秒钟,然后音频会重新启动。我猜一旦我移动 OnTriggerEnter 函数就会被调用,所以它会重新启动。一旦我移动,我可以通过什么方式从球体内的播放器开始而不重新启动音频?

    #pragma strict

private var theCollider: String;

function OnTriggerEnter (other : Collider)
{
theCollider = other.tag;
if(theCollider == "Player")
{
audio.Play();
audio.loop = true;
}

}

function OnTriggerExit (other : Collider)
{
theCollider = other.tag;
if(theCollider == "Player")
{
audio.Stop();
audio.loop = false;
}
}

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    回答

    使用AudioSource.isPlaying 确定音频剪辑是否已经在播放。并且只有在没有的情况下才调用Play

    function OnTriggerEnter (other : Collider)
    {
        theCollider = other.tag;
        if (theCollider == "Player" && !audio.isPlaying)
        {
            audio.Play();
            audio.loop = true;
        }
    }
    

    旁注

    记住一条黄金法则:如果变量可以本地化,那就让它本地化。

    违反此规则会导致您在上一个问题中显示的代码中出现错误(请参阅我对RaycastHit Randomly Gets 2 Hits 的评论)。

    这里我说的是private var theCollider: String;。您可以制作 theCollider 局部变量,并且应该这样做。

    【讨论】:

    • 谢谢,我以前见过 !audio.isPlaying 但我完全忘记了。另外,如果可能的话,我将从现在开始尝试将变量设为本地变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多