Merge branch '04.AudioCore' into master1

# Conflicts:
#	.gitlab-ci.yml
#	Assets/01.CodeChecker/Editor.meta
#	Assets/01.CodeChecker/Editor/UnityRoslyn.meta
#	Assets/02.InformationSave/RunTime/Abstract.meta
#	Assets/02.InformationSave/RunTime/Base.meta
#	Assets/04.AudioCore/RunTime/Abstract.meta
#	Assets/04.AudioCore/RunTime/AudioCore.RunTime.asmdef.meta
#	Assets/04.AudioCore/RunTime/Base.meta
#	Assets/04.AudioCore/RunTime/Use.meta
#	Assets/05.TableTextConversion/Editor/ConvertedExslDataMessage.cs.meta
#	Assets/05.TableTextConversion/Editor/EditorFrameworkUtils.cs.meta
#	Assets/05.TableTextConversion/Editor/Excel.meta
#	Assets/05.TableTextConversion/README.md
#	Assets/05.TableTextConversion/RunTime/Abstract.meta
#	Assets/05.TableTextConversion/RunTime/Base.meta
#	Assets/05.TableTextConversion/RunTime/Base/AudioTableData.cs.meta
#	Assets/05.TableTextConversion/RunTime/Test.cs.meta
#	Assets/05.TableTextConversion/RunTime/Use.meta
#	Assets/05.TableTextConversion/package.json
#	Assets/Plugins.meta
This commit is contained in:
2025-04-07 11:48:06 +08:00
23 changed files with 151 additions and 159 deletions

View File

@@ -1 +1 @@
# 代码检查工具
# 音频播放工具

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
<<<<<<<< HEAD:Assets/05.TableTextConversion/RunTime/Abstract.meta
guid: 3f4958b2707b1874fb59e045842881b7
========
guid: b4cff2e957a4add41a649e570dbabd9d
>>>>>>>> 04.AudioCore:Assets/04.AudioCore/RunTime/Abstract.meta
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,56 +1,56 @@
using System.Collections;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AudioCore
namespace Stary.Evo.AudioCore
{
/// <summary>
/// Audio数据
/// Audio数据
/// </summary>
public struct AudioData
{
/// <summary>
/// 延迟播放时间
/// 延迟播放时间
/// </summary>
public float delayTime;
/// <summary>
/// 音频
/// 音频
/// </summary>
public AudioClip clip;
/// <summary>
/// 音量
/// 音量
/// </summary>
public float volume;
/// <summary>
/// 回调行为
/// 回调行为
/// </summary>
public System.Action onComplete;
/// <summary>
/// 延迟回调执行的时间
/// 延迟回调执行的时间
/// </summary>
public float delayOnCompleteTime;
/// <summary>
/// 自然过渡时间
/// 自然过渡时间
/// </summary>
public float fadeDuration;
/// <summary>
/// 是否不打断上一段对话
/// 是否不打断上一段对话
/// </summary>
public bool isNotOverVoice;
/// <summary>
/// 是否是3D声音
/// 是否是3D声音
/// </summary>
public bool is3D;
/// <summary>
/// 3D声音载体
/// 3D声音载体
/// </summary>
public GameObject soundObject;
}
@@ -69,7 +69,7 @@ namespace AudioCore
public abstract void Stop(AudioData audioData);
/// <summary>
/// 音频数据初始化
/// 音频数据初始化
/// </summary>
/// <param name="audioData"></param>
/// <returns></returns>

View File

@@ -0,0 +1,3 @@
{
"name": "AudioCore.RunTime"
}

View File

@@ -0,0 +1,13 @@
fileFormatVersion: 2
<<<<<<<< HEAD:Assets/05.TableTextConversion/Editor/Excel.meta
guid: 4f1217f9aa6674740afe51db32d6d46f
folderAsset: yes
DefaultImporter:
========
guid: 44e8639d57fc2a94b94ecef44bf1e36a
AssemblyDefinitionImporter:
>>>>>>>> 04.AudioCore:Assets/04.AudioCore/RunTime/AudioCore.RunTime.asmdef.meta
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
<<<<<<<< HEAD:Assets/05.TableTextConversion/RunTime/Base.meta
guid: f458924b47972e344ab95e73c17cec83
========
guid: f18d57a48c234514eaf0997407d2c9dd
>>>>>>>> 04.AudioCore:Assets/04.AudioCore/RunTime/Base.meta
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +1,8 @@
using UnityEngine;
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
namespace AudioCore
namespace Stary.Evo.AudioCore
{
public class AudioSourcePool
{
@@ -10,32 +10,32 @@ namespace AudioCore
private GameObject poolObject;
/// <summary>
/// 对象池初始化
/// 对象池初始化
/// </summary>
private void PoolAwake()
{
// 检查是否已经存在一个名为"AudioSourcePool"的对象
// 检查是否已经存在一个名为"AudioSourcePool"的对象
SceneManager.sceneUnloaded += OnSceneUnloaded;
poolObject = GameObject.Find("AudioSourcePool");
if (poolObject == null)
{
// 如果不存在,创建一个新对象
// 如果不存在,创建一个新对象
poolObject = new GameObject("AudioSourcePool");
}
CoroutineHelper.SetRunner();
// 初始化 Voice 池(最多 1 个,可动态扩展)
// 初始化 Voice 池(最多 1 个,可动态扩展)
poolDict["Voice"] = new Queue<GameObject>();
CreateAudioSource("Voice");
// 初始化 Music 池(最多 2 个)
// 初始化 Music 池(最多 2 个)
poolDict["Music"] = new Queue<GameObject>();
for (int i = 0; i < 2; i++)
{
CreateAudioSource("Music");
}
// 初始化 SFX 池(初始 4 个,可动态扩展)
// 初始化 SFX 池(初始 4 个,可动态扩展)
poolDict["SFX"] = new Queue<GameObject>();
for (int i = 0; i < 4; i++)
{
@@ -44,14 +44,14 @@ namespace AudioCore
}
/// <summary>
/// 创建对象
/// 创建对象
/// </summary>
/// <param name="type">定义对象类型</param>
/// <param name="type">定义对象类型</param>
private void CreateAudioSource(string type)
{
GameObject newObject = new GameObject($"AudioSource_{type}");
newObject.transform.SetParent(poolObject.transform); // 将新对象作为当前对象的子对象
newObject.AddComponent<AudioSource>().playOnAwake = false; // 添加 AudioSource 组件并禁用自动播放
newObject.transform.SetParent(poolObject.transform); // 将新对象作为当前对象的子对象
newObject.AddComponent<AudioSource>().playOnAwake = false; // 添加 AudioSource 组件并禁用自动播放
if (type == "Music")
{
newObject.GetComponent<AudioSource>().loop = true;
@@ -60,7 +60,7 @@ namespace AudioCore
}
/// <summary>
/// 获取对象
/// 获取对象
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
@@ -73,20 +73,20 @@ namespace AudioCore
if (!poolDict.ContainsKey(type))
{
Debug.LogError($"对象池中不存在类型: {type}");
Debug.LogError($"对象池中不存在类型: {type}");
return null;
}
if (poolDict[type].Count == 0)
{
// 如果池为空,动态创建新的 GameObject仅限 SFX 与 Voice
// 如果池为空,动态创建新的 GameObject仅限 SFX 与 Voice
if (type == "SFX" && type == "Voice")
{
CreateAudioSource(type);
}
else
{
Debug.LogWarning($"对象池 {type} 已用完,无法分配新的 AudioSource");
Debug.LogWarning($"对象池 {type} 已用完,无法分配新的 AudioSource");
return null;
}
@@ -99,7 +99,7 @@ namespace AudioCore
}
/// <summary>
/// 回收对象
/// 回收对象
/// </summary>
/// <param name="type"></param>
/// <param name="audioObject"></param>
@@ -107,19 +107,19 @@ namespace AudioCore
{
if (!poolDict.ContainsKey(type))
{
Debug.LogError($"对象池中不存在类型: {type}");
Debug.LogError($"对象池中不存在类型: {type}");
return;
}
AudioSource audioSource = audioObject.GetComponent<AudioSource>();
audioSource.Stop(); // 停止播放
audioSource.clip = null; // 清空音频剪辑
audioSource.volume = 1f; // 音量大小恢复
poolDict[type].Enqueue(audioObject); // 回收到对象池
audioSource.Stop(); // 停止播放
audioSource.clip = null; // 清空音频剪辑
audioSource.volume = 1f; // 音量大小恢复
poolDict[type].Enqueue(audioObject); // 回收到对象池
}
/// <summary>
/// 场景销毁时清空对象池
/// 场景销毁时清空对象池
/// </summary>
/// <param name="scene"></param>
void OnSceneUnloaded(Scene scene)

View File

@@ -1,8 +1,8 @@
using System.Collections;
using System.Collections;
using UnityEngine;
using UnityEngine.Internal;
namespace AudioCore
namespace Stary.Evo.AudioCore
{
public static class CoroutineHelper
{

View File

@@ -1,7 +1,7 @@
using System.Collections;
using System.Collections;
using UnityEngine;
namespace AudioCore
namespace Stary.Evo.AudioCore
{
public class MusicPlayer : AbstractAudio
{
@@ -16,9 +16,9 @@ namespace AudioCore
}
/// <summary>
/// 播放背景音乐
/// 播放背景音乐
/// </summary>
/// <param name="audioData">{[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]}</param>
/// <param name="audioData">{[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]}</param>
public override void Play(AudioData audioData)
{
audioData = AudioDataInitialize(audioData);
@@ -44,16 +44,16 @@ namespace AudioCore
}
else
{
Debug.LogWarning("已同时存在两个背景乐在切换");
Debug.LogWarning("已同时存在两个背景乐在切换");
}
}
}
/// <summary>
/// 关闭背景音乐
/// 关闭背景音乐
/// </summary>
/// <param name="audioData">{[fadeDuration:自然过渡时间]}</param>
/// <param name="audioData">{[fadeDuration:自然过渡时间]}</param>
public override void Stop(AudioData audioData)
{
audioData = AudioDataInitialize(audioData);
@@ -61,11 +61,11 @@ namespace AudioCore
}
/// <summary>
/// 切换音频
/// 切换音频
/// </summary>
/// <param name="source1">播放的音频</param>
/// <param name="fadeDuration">变化时间</param>
/// <param name="source2">停止的音频</param>
/// <param name="source1">播放的音频</param>
/// <param name="fadeDuration">变化时间</param>
/// <param name="source2">停止的音频</param>
/// <returns></returns>
private IEnumerator FadeMusic(AudioSource source1, float fadeDuration, AudioSource source2 = null)
{
@@ -79,7 +79,7 @@ namespace AudioCore
}
/// <summary>
/// 关闭音频的协程
/// 关闭音频的协程
/// </summary>
/// <param name="source"></param>
/// <param name="fadeDuration"></param>
@@ -108,7 +108,7 @@ namespace AudioCore
}
/// <summary>
/// 开启音频的协程
/// 开启音频的协程
/// </summary>
/// <param name="source"></param>
/// <param name="fadeDuration"></param>

View File

@@ -1,13 +1,13 @@
using System.Collections;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AudioCore
namespace Stary.Evo.AudioCore
{
public class SFXPlayer : AbstractAudio
{
private AudioSourcePool audioSourcePool;
private List<AudioSource> activeSources = new List<AudioSource>(); // 正在播放的 AudioSource 列表
private List<AudioSource> activeSources = new List<AudioSource>(); // 正在播放的 AudioSource 列表
public SFXPlayer(AudioSourcePool audioSourcePool)
{
@@ -15,10 +15,10 @@ namespace AudioCore
}
/// <summary>
/// 播放音效
/// 播放音效
/// </summary>
/// <param name="audioData">{[clip:音频], [volume:音量],
/// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
/// <param name="audioData">{[clip:音频], [volume:音量],
/// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
public override void Play(AudioData audioData)
{
AudioSource source = audioSourcePool.GetAudioSource("SFX");
@@ -28,17 +28,17 @@ namespace AudioCore
source.volume = audioData.volume;
source.Play();
// 将 AudioSource 加入活动列表
// 将 AudioSource 加入活动列表
activeSources.Add(source);
// 使用协程处理延迟和回调
// 使用协程处理延迟和回调
CoroutineHelper.StartCoroutine(PlaySFXCoroutine(source, audioData.delayOnCompleteTime, audioData.onComplete));
}
/// <summary>
/// 停止所有音效
/// 停止所有音效
/// </summary>
/// <param name="audioData">{[无可使用变量]}</param>
/// <param name="audioData">{[无可使用变量]}</param>
public override void Stop(AudioData audioData)
{
foreach (var source in activeSources)
@@ -53,7 +53,7 @@ namespace AudioCore
}
/// <summary>
/// 播放音效的协程
/// 播放音效的协程
/// </summary>
/// <param name="source"></param>
/// <param name="delay"></param>

View File

@@ -1,7 +1,7 @@
using System.Collections;
using System.Collections;
using UnityEngine;
namespace AudioCore
namespace Stary.Evo.AudioCore
{
public class VoicePlayer : AbstractAudio
{
@@ -15,13 +15,13 @@ namespace AudioCore
}
/// <summary>
/// 播放语音
/// 播放语音
/// </summary>
/// <param name="audioData">{[clip:音频], [volume:音量],
/// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
/// <param name="audioData">{[clip:音频], [volume:音量],
/// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
public override void Play(AudioData audioData)
{
// 停止当前正在播放的语音与旧协程
// 停止当前正在播放的语音与旧协程
Stop(new AudioData { });
audioData = AudioDataInitialize(audioData);
@@ -38,14 +38,14 @@ namespace AudioCore
currentSource.volume = audioData.volume;
currentSource.Play();
// 使用协程处理延迟和回调
// 使用协程处理延迟和回调
myCoroutine = CoroutineHelper.StartCoroutine(PlayVoiceCoroutine(currentSource, audioData.delayOnCompleteTime, audioData.onComplete));
}
/// <summary>
/// 停止语音
/// 停止语音
/// </summary>
/// /// <param name="audioData">{[无可使用变量]}</param>
/// /// <param name="audioData">{[无可使用变量]}</param>
public override void Stop(AudioData audioData)
{
if (currentSource != null && currentSource.isPlaying)
@@ -57,7 +57,7 @@ namespace AudioCore
}
/// <summary>
/// 播放语音的协程
/// 播放语音的协程
/// </summary>
/// <param name="source"></param>
/// <param name="delayOnComplete"></param>

View File

@@ -1,64 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using AudioCore;
public class Test : MonoBehaviour
{
public AudioClip clip1;
public AudioClip clip2;
public AudioClip clip21;
public AudioClip clip22;
public AudioClip clip31;
public AudioClip clip32;
void Start()
{
//AudioCore.PlayerPrefs();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
AudioCoreManager.PlayVoice(new AudioData { clip = clip1 });
}
if (Input.GetKeyDown(KeyCode.S))
{
AudioCoreManager.PlayVoice(new AudioData { clip = clip2 });
}
if (Input.GetKeyDown(KeyCode.D))
{
AudioCoreManager.PlaySFX(new AudioData { clip = clip21 });
}
if (Input.GetKeyDown(KeyCode.F))
{
AudioCoreManager.PlaySFX(new AudioData { clip = clip22 });
}
if (Input.GetKeyDown(KeyCode.G))
{
AudioCoreManager.PlayMusic(new AudioData { clip = clip31 });
}
if (Input.GetKeyDown(KeyCode.H))
{
AudioCoreManager.PlayMusic(new AudioData { clip = clip32 });
}
if (Input.GetKeyDown(KeyCode.Z))
{
AudioCoreManager.StopVoice();
}
if (Input.GetKeyDown(KeyCode.X))
{
AudioCoreManager.StopAllSFX();
}
if (Input.GetKeyDown(KeyCode.C))
{
AudioCoreManager.StopMusic();
}
if (Input.GetKeyDown(KeyCode.Space))
{
SceneManager.LoadScene(1);
}
}
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
<<<<<<<< HEAD:Assets/Plugins.meta
guid: 65c18d699fcadad459bc3e16558c2bd2
========
guid: 4ffae49923bf0d34e9da8ee451f962f8
>>>>>>>> 04.AudioCore:Assets/04.AudioCore/RunTime/Use.meta
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +1,7 @@
using UnityEngine;
using UnityEngine;
using System.Collections.Generic;
namespace AudioCore
namespace Stary.Evo.AudioCore
{
public static class AudioCoreManager
{
@@ -13,26 +13,26 @@ namespace AudioCore
static AudioCoreManager()
{
audioSourcePool = new AudioSourcePool();
// 初始化播放器
// 初始化播放器
Voice = new VoicePlayer(audioSourcePool);
SFX = new SFXPlayer(audioSourcePool);
Music = new MusicPlayer(audioSourcePool);
}
#region
#region
/// <summary>
/// 播放语音
/// 播放语音
/// </summary>
/// <param name="audioData">{[clip:音频], [volume:音量],
/// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
/// <param name="audioData">{[clip:音频], [volume:音量],
/// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
public static void PlayVoice(AudioData audioData)
{
Voice.Play(audioData);
}
/// <summary>
/// 停止当前的语音
/// 停止当前的语音
/// </summary>
public static void StopVoice()
{
@@ -42,20 +42,20 @@ namespace AudioCore
#endregion
#region
#region
/// <summary>
/// 播放音效
/// 播放音效
/// </summary>
/// <param name="audioData">{[clip:音频], [volume:音量],
/// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
/// <param name="audioData">{[clip:音频], [volume:音量],
/// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
public static void PlaySFX(AudioData audioData)
{
SFX.Play(audioData);
}
/// <summary>
/// 停止所有音效
/// 停止所有音效
/// </summary>
public static void StopAllSFX()
{
@@ -65,21 +65,21 @@ namespace AudioCore
#endregion
#region
#region
/// <summary>
/// 播放背景音乐
/// 播放背景音乐
/// </summary>
/// <param name="audioData">{[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]}</param>
/// <param name="audioData">{[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]}</param>
public static void PlayMusic(AudioData audioData)
{
Music.Play(audioData);
}
/// <summary>
/// 停止播放背景音乐
/// 停止播放背景音乐
/// </summary>
/// <param name="fadeDuration">自然过渡时间</param>
/// <param name="fadeDuration">自然过渡时间</param>
public static void StopMusic(float fadeDuration = 1f)
{
AudioData audioData = new AudioData();

View File

@@ -1,10 +1,10 @@
{
"name": "com.staryevo.codechecker",
"version": "1.0.0",
"displayName": "01.CodeChecker",
"name": "com.staryevo.audiocore",
"version": "1.0.1",
"displayName": "04.AudioCore",
"description": "音频播放工具",
"unity": "2021.3",
"unityRelease": "30f1",
"unityRelease": "23f1",
"keywords": [
"unity",
"scirpt"

View File

@@ -1,5 +1,9 @@
fileFormatVersion: 2
<<<<<<<< HEAD:Assets/Plugins.meta
guid: 65c18d699fcadad459bc3e16558c2bd2
========
guid: 4ffae49923bf0d34e9da8ee451f962f8
>>>>>>>> 04.AudioCore:Assets/04.AudioCore/RunTime/Use.meta
folderAsset: yes
DefaultImporter:
externalObjects: {}