AudioSource中的PlayClipAtPoint()和PlayOneShot()

博客介绍了Unity中AudioClip的播放方法。当同一时间只需播放一个AudioClip,用AudioSource组件及相关方法即可;当需同时播放多个时,有PlayClipAtPoint()和PlayOneShot()两种方法,还阐述了它们的共同点是播放完自动关闭销毁,不同点在于音效维度和是否为静态方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当同一个时间只需播放一个AudioClip时,用AudioSource组件

在脚本中用Play(), Pause(), Stop()方法就能满足

 

当需要在同一个时间播放N中AudioClip时,有两种方法PlayClipAtPoint()和PlayOneShot()

1.共同点

两个方法都是播放完AudioClip后自动关闭自动销毁

2.不同点

PlayClipAtPoint()播放的是3D音效

PlayOneShot()播放的是2D音效

PlayClipAtPoint是静态方法,而PlayOneShot不是。就是说,需要使用PlayOneShot方法,必须指明实例化的对象。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour {

    public AudioClip audioClip;
    private AudioSource audioSource;

	void Start () {
        audioSource = GetComponent<AudioSource>();
	}
	
    //使用PlayClipAtPoint
    void Test1()
    {
        AudioSource.PlayClipAtPoint(audioClip, Vector3.zero);
    }

    //使用PlayOneShoot
    void Test2()
    {
        audioSource.PlayOneShot(audioClip);
    }
}

 

using UnityEngine; using System.Collections; using System.Collections.Generic; using XLua; namespace LuaFramework { [LuaCallCSharp] public class SoundManager : Manager { public AudioSource bgAudio; public AudioSource audio; public AudioSource audioTwo; public AudioSource audioThree; //public AudioSource[] gens = new AudioSource[6]; public AudioSource gens; public AudioSource nets; private Hashtable sounds = new Hashtable(); public static SoundManager _instance; void Awake() { _instance = this; } public static SoundManager Instance { get { return _instance; } } void Start() { bgAudio = GetComponent<AudioSource>(); audio = transform.Find("Audio").GetComponent<AudioSource>(); audioTwo = transform.Find("AudioTwo").GetComponent<AudioSource>(); audioThree = transform.Find("AudioThree").GetComponent<AudioSource>(); gens = transform.Find("Gen").GetComponent<AudioSource>(); nets = transform.Find("Net").GetComponent<AudioSource>(); /*for (int i = 0; i < 6; i++) { gens[i] = transform.Find("Gen"+i).GetComponent<AudioSource>(); }*/ } /// <summary> /// Ìí¼ÓÒ»¸öÉùÒô /// </summary> void Add(string key, AudioClip value) { if (sounds[key] != null || value == null) return; //Debug.Log("..add..AudioClip.."+key); sounds.Add(key, value); } public void ClearGameAudio(string key) { if (sounds[key] != null) { sounds[key] = null; } } /// <summary> /// »ñȡһ¸öÉùÒô /// </summary> AudioClip Get(string key) { if (sounds[key] == null) return null; return sounds[key] as AudioClip; } public float GetBgAudioVolume() { return bgAudio.volume; } public void SetBgAudioVolume(float value) { string key = "BgSound"; bgAudio.volume = value; PlayerPrefs.SetFloat(key, value); } public float GetGameAudioVolume(float value) { return audio.volume; } public void SetGameAudioVolume(float value) { string key = "GameAudio"; audio.volume = value; PlayerPrefs.SetFloat(key,value); } public void ChangBgVolumeOnGameScene(float value) { bgAudio.volume = value; } public void ChangGameVolueOnGameScene(float value) { audio.volume = value; audioTwo.volume = value; audioThree.volume = value; gens.volume = value; nets.volume = value; /*for (int i = 0; i < 6; i++) { gens[i].volume = value; }*/ } public void EnterMainScene() { bgAudio.volume = 1.0f; audio.volume = 1.0f; } IEnumerator playBgAudioClip(string name) { AudioClip Aclip; if (AppConst.UpdateMode) { AssetBundle built = null; #if UNITY_ANDROID || UNITY_IPHONE string path_2 = "file:///" + AppConst.FrameworkRoot + "/datingui_" + AppConst.UIVersion + "/" + name + ".u3d"; WWW www = new WWW(@path_2); yield return www; if (www.error == null) { yield return built = www.assetBundle; } else { Debug.Log("www null-------- " + path_2); } #else byte[] data = null;// = OpenFile.GetFileData(path_); if (File.Exists(path_)) { FileStream file_ = new FileStream(path_, FileMode.Open, FileAccess.Read); yield return data = new byte[file_.Length]; file_.Read(data, 0, (int)file_.Length); file_.Close(); } if (data != null) { yield return built = AssetBundle.LoadFromMemory(data); } #endif if (built != null) { Aclip = built.LoadAsset(name) as AudioClip; built.Unload(false); Add(name, Aclip); bgAudio.clip = Aclip; bgAudio.Play(); } www.Dispose(); }else { string path = "datingui_" + AppConst.UIVersion + "/" + name; yield return Aclip = (AudioClip)Resources.Load(path, typeof(AudioClip)); bgAudio.clip = Aclip; bgAudio.Play(); } } /// <summary> /// ÊÇ·ñ²¥·Å±³¾°ÒôÀÖ£¬Ä¬ÈÏÊÇ1£º²¥·Å /// </summary> /// <returns></returns> public bool CanPlayBackSound() { string key = "BackSound"; int i = PlayerPrefs.GetInt(key, 1); return i == 1; } /// <summary> /// ²¥·Å±³¾°ÒôÀÖ /// </summary> /// <param name="canPlay"></param> public void PlayBacksound(string name, bool canPlay) { if (bgAudio.clip != null) { if (name.IndexOf(bgAudio.clip.name) > -1) { if (!canPlay) { bgAudio.Stop(); bgAudio.clip = null; //Util.ClearMemory(); return; } } } if (canPlay) { bgAudio.loop = true; //audio.clip = LoadAudioClip(name); //audio.Play(); AudioClip Aclip; Aclip = Get(name); if (Aclip != null) { bgAudio.clip = Aclip; bgAudio.Play(); return; } else { StartCoroutine(playBgAudioClip(name)); } } else { bgAudio.Stop(); bgAudio.clip = null; //Util.ClearMemory(); } } public void PlayGameAudio(string name, bool canPlay) { if (audio.clip != null) { if (name.IndexOf(audio.clip.name) > -1) { if (!canPlay) { audio.Stop(); audio.clip = null; //Util.ClearMemory(); return; } } } if (canPlay) { audio.loop = false; //audio.clip = LoadAudioClip(name); //audio.Play(); AudioClip Aclip; Aclip = Get(name); if (Aclip != null) { audio.clip = Aclip; audio.Play(); return; } else { Debug.Log("...GameAudio..is ..null"); } } else { audio.Stop(); audio.clip = null; //Util.ClearMemory(); } } public void LoopPlayGameAudio(string name) { if (audio.clip != null) { if (name.IndexOf(audio.clip.name) > -1) { audio.loop = true; return; } } AudioClip Aclip; Aclip = Get(name); if (Aclip != null) { //audio.loop = true; audio.clip = Aclip; audio.loop = true; audio.Play(); return; } else { Debug.Log("...GameAudio..is ..null"); } } /// <summary> /// ÊÇ·ñ²¥·ÅÒôЧ,ĬÈÏÊÇ1£º²¥·Å /// </summary> /// <returns></returns> public bool CanPlaySoundEffect() { string key = "SoundEffect"; int i = PlayerPrefs.GetInt(key, 1); return i == 1; } /// <summary> /// ²¥·ÅÒôƵ¼ô¼­ /// </summary> /// <param name="clip"></param> /// <param name="position"></param> public void Play(AudioClip clip, Vector3 position) { if (!CanPlaySoundEffect()) return; AudioSource.PlayClipAtPoint(clip, position); } /// <summary> /// Í£Ö¹ÒôÀÖ /// </summary> public void StopBgAudio() { bgAudio.Stop(); //string key = "BackSound"; //PlayerPrefs.SetInt(key,0); Debug.Log("....BackSoundStopAudio"); } /// <summary> /// ²¥·ÅÒôÀÖ /// </summary> public void PlayBgAudio() { bgAudio.Play(); //string key = "BackSound"; //PlayerPrefs.SetInt(key,1); Debug.Log("....BackSoundPlayAudio"); } public void AudioTwoPlayOneShot(string name) { AudioClip Aclip; Aclip = Get(name); if (Aclip) { //audioTwo.clip = Aclip; audioTwo.PlayOneShot(Aclip); } } public void AudioThreePlayOneShot(string name) { AudioClip Aclip; Aclip = Get(name); if (Aclip) { //audioThree.clip = Aclip; audioThree.PlayOneShot(Aclip); } } public void AudioPlayOneShot(string name) { AudioClip Aclip; Aclip = Get(name); if (Aclip) { //audio.clip = Aclip; audio.PlayOneShot(Aclip); } } public void AudioPlayGen(string name) { AudioClip Aclip; Aclip = Get(name); if (Aclip) { gens.clip = Aclip; gens.Play(); } /*if (genSeat < 6) { AudioClip Aclip; Aclip = Get(name); if (Aclip) { gens[genSeat].PlayOneShot(Aclip); } }*/ } public void AudioPlayNet(string name) { AudioClip Aclip; Aclip = Get(name); if (Aclip) { nets.clip = Aclip; nets.Play(); } } public void ExitGame() { nets.Stop(); gens.Stop(); bgAudio.Stop(); audio.Stop(); audioTwo.Stop(); audioThree.Stop(); } float jindus; public AudioClip LoadAudioClipByPath(string name) { //string path; AudioClip Aclip = Get(name); if (Aclip != null) { return Aclip; } //AudioClip Aclip; if (AppConst.UpdateMode) { AssetBundle built = null; WWW www = null; #if UNITY_ANDROID //string path_2 = "file:///" + AppConst.FrameworkRoot + "/datingui_" + AppConst.UIVersion + "/" + path + name + ".u3d"; string path_2 = "file:///" + AppConst.FrameworkRoot + "/FishAudio_" + AppConst.UIVersion + "/" + name + ".u3d"; www = new WWW(@path_2); //yield return www; if (www.error == null) { built = www.assetBundle; } else { Debug.Log("www null-------- " + path_2); } #else string _path = AppConst.FrameworkRoot + "/FishAudio_"+ AppConst.UIVersion + "/" + name + ".u3d"; byte[] data = null;// = OpenFile.GetFileData(path_); if (System.IO.File.Exists(_path)) { System.IO.FileStream file_ = new System.IO.FileStream(_path, System.IO.FileMode.Open, System.IO.FileAccess.Read); data = new byte[file_.Length]; int redline = 0; int allnum = 0; while (true) { byte[] reddata = new byte[1024000]; redline = file_.Read(reddata, 0, (int)reddata.Length); if (redline <= 0) { jindus = 1.0f; break; } else { //Debug.LogError(redline); System.Array.Copy(reddata, 0, data, allnum, redline); allnum += redline; jindus = (float)allnum / (float)data.Length; } } file_.Close(); } if (data != null) { built = AssetBundle.LoadFromMemory(data); } #endif if (built != null) { Aclip = built.LoadAsset(name) as AudioClip; built.Unload(false); Add(name, Aclip); if (Aclip == null) { Debug.Log("Aclip null-------- "); } if (www != null) www.Dispose(); return Aclip; }else { if (www != null) www.Dispose(); return null; } }else { //string path_3 = "datingui_" + AppConst.UIVersion + "/" + path + name; string path_3 = "FishAudio_" + AppConst.UIVersion + "/" + name; Aclip = (AudioClip)Resources.Load(path_3, typeof(AudioClip)); Add(name, Aclip); if (Aclip == null) { Debug.Log("Aclip null-------- "); } return Aclip; } } public void ClearGameAudioClip(string key) { if (sounds[key] != null) { sounds.Remove(key); } } } }这个代码是Unity5.3.3f1版本的,现在升级到Unity2021.3.45f1版本后怎么兼容?并且把修改后的完整代码给我
07-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值