我试图在用户拖动2D游戏对象时播放声音。
游戏对象必须播放许多声音,因此我以编程方式创建音频源并通过检查器分配剪辑。
public class Card: Monobehavior, IDraggable {
public AudioClip tokenGrabClip;
public AudioClip tokenReleaseClip;
public AudioSource tokenGrab;
public AudioSource tokenRelease;
public AudioSource TokenGrab {
get{ return tokenGrab; }
}
public virtual void Start() {
tokenGrab = AddAudio (tokenGrabClip, false, false, 1f);
tokenRelease = AddAudio (tokenReleaseClip, false, false, 1f);
}
public virtual AudioSource AddAudio(AudioClip clip, bool isLoop, bool isPlayAwake, float vol) {
AudioSource newAudio = gameObject.AddComponent<AudioSource>();
newAudio.clip = clip;
newAudio.loop = isLoop;
newAudio.playOnAwake = isPlayAwake;
newAudio.volume = vol;
return newAudio;
}
}
这将为我游戏中Card
类型的每个游戏对象创建两个音频源。
现在在我的游戏经理中,我只是尝试播放声音......
void CheckDragStart(GameObject go, Draggable d) {
if (go.GetComponent<Card> () != null) {
print("check drag start");
go.GetComponent<Card> ().TokenGrab.Play ();
}
}
没有播放声音,但我可以通过“检查拖动开始消息”查看我的控制台。
知道我可能做错了吗?我可以在第一个代码块中看到使用我的方法分配给我的游戏对象的音频源,但我的音频剪辑没有分配给它们......
答案 0 :(得分:1)
这不是 go GameObject,GetComponent<Card>()
或TokenGrab
是null
。如果其中任何一个为空,您将收到NullException
错误。我正在把它们排除在外。
查看您的代码,这些是您的音频无法播放的可能原因。从很可能到最少订购。
1 。您的AudioClip
未从编辑中分配。
检查这两个变量是否都在编辑器中分配。
public AudioClip tokenGrabClip;
public AudioClip tokenReleaseClip;
必须为附加到场景中任何GameObject的每个 Card
脚本执行此操作。
如果未分配或
2 。您的Card
脚本及其附加的GameObject在调用Play()
后被销毁。尝试在任何有Destroy
功能的地方发表评论。再试一遍。如果问题得到解决,你必须通过将AudioSource移动到一个不需要销毁的空游戏对象来解决这个问题。
答案 1 :(得分:0)
我只是在这里提出我的建议。我发现你不想循环剪辑。那你为什么不试试这样的事呢?
public AudioClip tokenGrabClip;
public AudioClip tokenReleaseClip;
AudioSource audioSrc;
void Start () {
audioSrc = GetComponent<AudioSource> ();
}
public void PlayTokenGrabClip () {
audioSrc.PlayOneShot (tokenGrabClip);
}
public void PlayTokenReleaseClip () {
audioSrc.PlayOneShot (tokenReleaseClip);
}
将AudioSource
个组件添加到GameObject
。通过编辑器将音频文件(mp3
,wav
)分配给tokenGranClip
和tokenReleaseClip
。然后调用函数PlayTokenGrabClip ()
和PlayTokenReleaseClip ()
以在需要时播放相应的声音。
答案 2 :(得分:0)
问题来自于不更新我的预制件。我公开在我的C#脚本中分配AudioClips,但是这个更改没有立即反映在我的预制件中。我不是必须更新许多预制件,而是重新组织了我的资源在启动时加载的方式:
我在Resources.Load(...) as AudioClip;
中使用Awake()
定义我的音频片段,并在Start()
中创建AudioSource Components。由此,我可以通过C#将AudioClip添加到我的AudioSources。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Card : MonoBehaviour, IDraggable {
public bool counter;
private AudioClip tokenGrabClip;
private AudioClip tokenReleaseClip;
private AudioSource tokenGrab;
private AudioSource tokenRelease;
public AudioSource TokenGrab {
get{ return tokenGrab; }
}
public AudioSource TokenRelease {
get{ return tokenRelease; }
}
public virtual void Start() {
tokenGrab = AddAudio (tokenGrabClip, false, false, 0.5f);
tokenRelease = AddAudio (tokenReleaseClip, false, false, 0.5f);
}
public virtual void Awake () {
tokenGrabClip = Resources.Load ("Audio/tokenGrab") as AudioClip;
tokenReleaseClip = Resources.Load ("Audio/tokenRelease") as AudioClip;
}
public virtual AudioSource AddAudio(AudioClip clip, bool isLoop, bool isPlayAwake, float vol) {
AudioSource newAudio = gameObject.AddComponent<AudioSource> () as AudioSource;
newAudio.clip = clip;
newAudio.loop = isLoop;
newAudio.playOnAwake = isPlayAwake;
newAudio.volume = vol;
return newAudio;
}
}