2016-11-30 68 views
0

我在unity3d学习raycasting和面临的一个音频问题。我正在做的是有一个Main Camera,其中附有一个名为NewCast的脚本。那Main Camera投射了一个光线,它有一个叫做box collider的组件。当看这个立方体时,光线投射效果很好。我在播放声音。这意味着当相机看着这个物体射线投射到立方体时。但为什么音频播放多次。我只想播放一次该音频,当我查看该对象并一次又一次地重复此过程时。包linkPicture声音播放多次,当看一个物体

代码:

public class NewCast : MonoBehaviour 
{ 


    private RaycastHit hit; 

    bool playAudio1; 

    [SerializeField] 
    private AudioSource source; 


    [SerializeField] 
    private AudioClip clip1; 



    private void Start() 
    { 
     source.clip = clip1; 
     playAudio1 = true; 

    } 

    private void Update() 
    { 

     if (Physics.Raycast(transform.position, transform.forward, out hit,9f)) 
     { 

      if (hit.collider.gameObject.name == "Cube") 
      { 
       playAudio1 = false; 

       if (!playAudio1) 
       { 
        source.Play(); 

        if (!source.isPlaying) 
        { 
         playAudio1 = true; 

        } 
       } 
      } 

     } 

    } 

} 

回答

1

每次对撞机是打,你设置playAudio1为false,这样下一个条件始终是真实,所以声音会一直玩...

if (Physics.Raycast(transform.position, transform.forward, out hit,9f)) 
    { 
     if (hit.collider.gameObject.name == "Cube"){ 
      if (!source.isPlaying){ 
       source.Play(); 
      } 
     } 
    } 

如果你想看看每一次玩到对象:

public class NewCast : MonoBehaviour 
{ 


private RaycastHit hit; 

bool soundPlayed = false; 

[SerializeField] 
private AudioSource source; 


[SerializeField] 
private AudioClip clip1; 


private void Start() 
{ 
    source.clip = clip1; 
} 

private void Update(){ 
    if(Physics.Raycast(transform.position, transform.forward, out hit,9f)){ 
     if (!soundPlayed && hit.collider.gameObject.name == "Cube"){ 
      if (!source.isPlaying){ 
       source.Play(); 
       soundPlayed = true; 
      } 
     } 
    }else{ 
     if(soundPlayed) soundPlayed = false; 
    } 
} 

} 
+0

首先,我尝试使用相同的逻辑,但它也会播放多次声音。 – hamel123

+0

看起来像是isPlaying有问题(有默认剪辑的东西)。尝试直接在audioSource(在编辑器中)分配音频片段。或者在播放之前尝试分配剪辑(source.clip = clip1)。 – FLX

+0

我正在脚本的'Start()'函数中分配剪辑 – hamel123

-1

它的某个时候,因为我用团结,但团结AudioSource设置为自动循环。检查具有AudioSource的脚本,并确保取消选中“正在循环”。 See the Unity Documentation

所以我guesing,如果您添加到您的start()函数,你会好起来

private void Start() 
{ 
    source.clip = clip1; 
    source.loop=false;//only plays the once and stops 
    playAudio1 = true; 

} 
+0

的AudioSource是取消选中,而该组件上安装有'主要Camera' – hamel123

+0

检查的AudioSource的特性,寻找循环或东西。不幸的是我现在没有统一开放,我无法打开它。 (我的电脑很弱,只有很少的RAM,并且正在处理关键项目),或者编辑上面的脚本并告诉我们会发生什么 –