Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Johnconstine
minigame-unity-webgl-transform
提交
bb3c01a1
M
minigame-unity-webgl-transform
项目概览
Johnconstine
/
minigame-unity-webgl-transform
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
minigame-unity-webgl-transform
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
bb3c01a1
编写于
11月 11, 2022
作者:
ocean2o11
提交者:
GitHub
11月 11, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #220 from wechat-miniprogram/fix/audio
Fix/audio
上级
55a487e9
931f67c2
变更
6
展开全部
隐藏空白更改
内联
并排
Showing
6 changed file
with
612 addition
and
135 deletion
+612
-135
Demo/API/Assets/Scenes/InnerAudio.unity
Demo/API/Assets/Scenes/InnerAudio.unity
+417
-69
Demo/API/Assets/Scripts/AudioManager.cs
Demo/API/Assets/Scripts/AudioManager.cs
+177
-62
Demo/API/Assets/WX-WASM-SDK/Editor/MiniGameConfig.asset
Demo/API/Assets/WX-WASM-SDK/Editor/MiniGameConfig.asset
+1
-1
Demo/API/ProjectSettings/EditorBuildSettings.asset
Demo/API/ProjectSettings/EditorBuildSettings.asset
+6
-0
Demo/API/UserSettings/EditorUserSettings.asset
Demo/API/UserSettings/EditorUserSettings.asset
+6
-0
Design/AudioOptimization.md
Design/AudioOptimization.md
+5
-3
未找到文件。
Demo/API/Assets/Scenes/InnerAudio.unity
浏览文件 @
bb3c01a1
此差异已折叠。
点击以展开。
Demo/API/Assets/Scripts/AudioManager.cs
浏览文件 @
bb3c01a1
...
...
@@ -6,13 +6,20 @@ using WeChatWASM;
public
class
AudioManager
:
MonoBehaviour
{
// cdn路径音频最多支持10个同时在线播放,先下载后的音频(needDownload)最多支持32个同时播放,先初始化10个
private
static
int
DEFAULT_AUDIO_COUNT
=
10
;
//
private static int DEFAULT_AUDIO_COUNT = 10;
// 创建音频队列
private
static
Queue
<
WXInnerAudioContext
>
audioPool
=
new
Queue
<
WXInnerAudioContext
>();
// 当前场景需要预下载的音频列表
private
static
string
[]
audioList
=
{
// 短音频
"https://res.wx.qq.com/wechatgame/product/webpack/userupload/20221108/194356/1.mp3"
,
"https://res.wx.qq.com/wechatgame/product/webpack/userupload/20221108/194517/2.mp3"
,
"https://res.wx.qq.com/wechatgame/product/webpack/userupload/20221108/194523/3.mp3"
,
"https://res.wx.qq.com/wechatgame/product/webpack/userupload/20221108/194530/4.mp3"
,
"https://res.wx.qq.com/wechatgame/product/webpack/userupload/20221108/194536/5.mp3"
,
// 长音频
"https://res.wx.qq.com/wechatgame/product/webpack/userupload/20220901/211827/CallMeTeenTop.mp3"
,
"https://res.wx.qq.com/wechatgame/product/webpack/userupload/20220815/105451/1.mp3"
,
"https://res.wx.qq.com/wechatgame/product/webpack/userupload/20220901/211846/Night-n.mp3"
,
...
...
@@ -23,83 +30,128 @@ public class AudioManager : MonoBehaviour
// 正在播放的音频对象列表
private
static
List
<
WXInnerAudioContext
>
audioPlayArray
=
new
List
<
WXInnerAudioContext
>();
// 背景音乐
private
WXInnerAudioContext
audioBGM
=
null
;
private
bool
isDestroyed
=
false
;
private
int
createdAudioCount
=
0
;
// 初始化
public
void
Start
()
{
// 创建音频对象池,创建时设置属性需要下载
for
(
var
i
=
0
;
i
<
DEFAULT_AUDIO_COUNT
;
i
++)
{
addAudio
(
);
};
//
//
创建音频对象池,创建时设置属性需要下载
//
for (var i = 0; i < DEFAULT_AUDIO_COUNT; i++)
//
{
// addAudio(false
);
//
};
// 批量下载音频文件
downloadAudio
();
// 先下载后播放第3个音频
playAfterDownload
(
2
);
// 立即播放(但不会缓存到本地)第1个音频
playRightNow
(
0
);
}
// 从缓存池中获取音频实例
private
WXInnerAudioContext
getAudio
()
{
if
(
this
.
isDestroyed
)
{
if
(
this
.
isDestroyed
)
{
return
null
;
}
if
(
audioPool
.
Count
==
0
)
{
addAudio
();
addAudio
(
false
);
}
var
audio
=
audioPool
.
Dequeue
();
audio
.
needDownload
=
true
;
audioPlayArray
.
Add
(
audio
);
return
audio
;
}
private
void
removeAudio
(
WXInnerAudioContext
audio
)
// 销毁或回收实例
private
void
removeAudio
(
WXInnerAudioContext
audio
,
bool
needDestroy
=
true
)
{
audio
.
OffCanplay
();
if
(
audioPlayArray
.
Contains
(
audio
))
{
audio
.
OffCanplay
();
audioPlayArray
.
Remove
(
audio
);
audioPool
.
Enqueue
(
audio
);
}
if
(
needDestroy
)
{
audio
.
Destroy
();
}
else
{
if
(!
audioPool
.
Contains
(
audio
))
{
audioPool
.
Enqueue
(
audio
);
}
}
Debug
.
Log
(
"___________________"
);
Debug
.
Log
(
"已创建InnerAudio"
+
createdAudioCount
+
" 对象池:"
+
audioPool
.
Count
+
" 正在播放:"
+
audioPlayArray
.
Count
);
Debug
.
Log
(
"___________________"
);
}
private
WXInnerAudioContext
addAudio
()
// 创建InnerAudioContext实例
// 参数needDestroy表示是否需要在播放完之后销毁,目前建议都先销毁再创建使用
private
WXInnerAudioContext
addAudio
(
bool
needDestroy
=
true
)
{
if
(
createdAudioCount
>
32
)
{
Debug
.
LogError
(
"最多只支持同时使用32个InnerAudio"
);
}
var
audio
=
WX
.
CreateInnerAudioContext
(
new
InnerAudioContextParam
()
{
needDownload
=
true
});
createdAudioCount
+=
1
;
// 自动播放停止
audio
.
OnEnded
(()
=>
{
removeAudio
(
audio
);
Debug
.
Log
(
audio
.
instanceId
+
" OnEnded"
);
removeAudio
(
audio
,
needDestroy
);
});
// 加载出错
audio
.
OnError
(()
=>
{
Debug
.
Log
(
audio
.
instanceId
+
"audio OnError"
);
audio
.
Stop
();
removeAudio
(
audio
);
removeAudio
(
audio
,
needDestroy
);
});
// 手动停止
audio
.
OnStop
(()
=>
{
removeAudio
(
audio
);
Debug
.
Log
(
audio
.
instanceId
+
"audio OnStop"
);
removeAudio
(
audio
,
needDestroy
);
});
audioPool
.
Enqueue
(
audio
);
// 暂停
audio
.
OnPause
(()
=>
{
Debug
.
Log
(
audio
.
instanceId
+
"audio OnPause"
);
});
// 播放成功
audio
.
OnPlay
(()
=>
{
Debug
.
Log
(
audio
.
instanceId
+
"audio OnPlay"
);
});
if
(!
needDestroy
)
{
audioPool
.
Enqueue
(
audio
);
}
return
audio
;
}
// 预下载音频
private
void
downloadAudio
()
{
// 预下载音频
...
...
@@ -110,7 +162,7 @@ public class AudioManager : MonoBehaviour
// 下载成功
// 下载后播放第2个音频
playAfterDownload
(
1
);
//
playAfterDownload(1);
}
else
{
...
...
@@ -119,81 +171,144 @@ public class AudioManager : MonoBehaviour
});
}
public
void
playAfterDownload
(
int
index
)
// 播放音频
public
void
playAfterDownload
(
int
index
,
bool
isShort
)
{
var
audioIndex
=
getAudio
();
if
(
audioIndex
==
null
)
{
if
(
audioIndex
==
null
)
{
return
;
}
// 如果没有下文修改needDownload为false的函数,理论上创建的所有音频都是true,可以省去这一条
audioIndex
.
needDownload
=
true
;
if
(
audioIndex
.
src
==
audioList
[
index
])
{
audioIndex
.
Play
();
// 如果要设置的src和原音频对象一致,可以直接播放
if
(
audioIndex
.
src
==
audioList
[
index
])
{
audioIndex
.
Play
();
}
else
{
// 对于已经设置了needDownload为true的audio,设置src后就会开始下载对应的音频文件
// 如果该文件已经下载过,并且配置了缓存本地,就不会重复下载
// 如果该文件没有下载过,等同于先调用WX.PreDownloadAudios下载后再播放
audioIndex
.
src
=
audioList
[
index
];
// 在可以播放时播放
audioIndex
.
OnCanplay
(()
=>
{
audioIndex
.
Play
();
});
else
{
// 对于已经设置了needDownload为true的audio,设置src后就会开始下载对应的音频文件
// 如果该文件已经下载过,并且配置了缓存本地,就不会重复下载
// 如果该文件没有下载过,等同于先调用WX.PreDownloadAudios下载后再播放
audioIndex
.
src
=
audioList
[
index
];
// 短音频可以直接调用Play
if
(
isShort
)
{
audioIndex
.
Play
();
}
else
{
// 长音频在可以播放时播放
audioIndex
.
OnCanplay
(()
=>
{
audioIndex
.
Play
();
});
}
}
}
// 不缓存立即播放
public
void
playRightNow
(
int
index
)
{
// 如果是需要在当前场景立刻播放的音频,则不设置needDownload,音频会边下边播
// 但是再次使用该音频时会因为没有下载而需要再次下载,并不推荐这样使用
var
audioPlayRightNow
=
getAudio
();
if
(
audioPlayRightNow
==
null
)
{
audioPlayRightNow
.
needDownload
=
false
;
if
(
audioPlayRightNow
==
null
)
{
return
;
}
// 修改src会触发下载,所以设置needDownload属性要在修改src之前
audioPlayRightNow
.
needDownload
=
false
;
// 如果要设置的src和原音频对象一致,可以直接播放
if
(
audioPlayRightNow
.
src
==
audioList
[
index
])
{
audioPlayRightNow
.
Play
();
if
(
audioPlayRightNow
.
src
==
audioList
[
index
])
{
audioPlayRightNow
.
Play
();
}
else
{
// 如果当前音频已经下载过,并且配置了缓存本地,就算设置needDownload为false也不会重复下载
audioPlayRightNow
.
src
=
audioList
[
index
];
// 在可以播放时播放
audioPlayRightNow
.
OnCanplay
(()
=>
{
audioPlayRightNow
.
Play
();
});
else
{
// 如果当前音频已经下载过,并且配置了缓存本地,就算设置needDownload为false也不会重复下载
audioPlayRightNow
.
src
=
audioList
[
index
];
// 在可以播放时播放
audioPlayRightNow
.
OnCanplay
(()
=>
{
audioPlayRightNow
.
Play
();
});
}
}
// 暂停所有在播放的音乐
public
void
pauseAllAudio
()
{
audioPlayArray
.
ForEach
(
audio
=>
{
audio
.
Pause
();
});
}
// 重新播放所有在播放的音乐
public
void
resumeAllAudio
()
{
audioPlayArray
.
ForEach
(
audio
=>
{
// innerAudio没有resume,直接用play重新播放
audio
.
Play
();
});
}
// 停止所有在播放的音乐
public
void
stopAllAudio
()
{
audioPlayArray
.
ForEach
(
audio
=>
{
audioPlayArray
.
ForEach
(
audio
=>
{
audio
.
OffCanplay
();
audio
.
Stop
();
});
}
public
void
playRandom
()
// 播放短音频
public
void
playShort
()
{
var
index
=
new
System
.
Random
().
Next
(
0
,
5
);
Debug
.
Log
(
"playShort:"
+
index
);
playAfterDownload
(
index
,
true
);
}
// 同时播放5个短音频(测试用)
public
void
playShort5
()
{
var
index
=
new
System
.
Random
().
Next
(
0
,
audioList
.
Length
);
for
(
var
i
=
0
;
i
<
5
;
i
++)
{
this
.
playShort
();
};
}
// 播放背景音乐
public
void
playBGM
()
{
var
index
=
new
System
.
Random
().
Next
(
5
,
10
);
Debug
.
Log
(
"Play:"
+
index
);
Debug
.
Log
(
"PlayAudioLength:"
+
audioPlayArray
.
Count
);
playRightNow
(
index
);
if
(
audioBGM
!=
null
)
{
audioBGM
.
Stop
();
}
// 长音频在使用后需要销毁
audioBGM
=
addAudio
(
true
);
audioPlayArray
.
Add
(
audioBGM
);
audioBGM
.
src
=
audioList
[
index
];
audioBGM
.
OnCanplay
(()
=>
{
audioBGM
.
Play
();
});
}
// 销毁场景
private
void
OnDestroy
()
{
this
.
isDestroyed
=
true
;
...
...
Demo/API/Assets/WX-WASM-SDK/Editor/MiniGameConfig.asset
浏览文件 @
bb3c01a1
...
...
@@ -38,7 +38,7 @@ MonoBehaviour:
loadingBarWidth
:
240
needCheckUpdate
:
0
SDKOptions
:
UseAudioApi
:
0
UseAudioApi
:
1
UseFriendRelation
:
0
UseCompressedTexture
:
0
CompileOptions
:
...
...
Demo/API/ProjectSettings/EditorBuildSettings.asset
浏览文件 @
bb3c01a1
...
...
@@ -11,4 +11,10 @@ EditorBuildSettings:
-
enabled
:
1
path
:
Assets/Scenes/SampleScene.unity
guid
:
9a069299b0b9d4cf68218d815a4c1b38
-
enabled
:
1
path
:
Assets/Scenes/InnerAudio.unity
guid
:
6cc335c875b7242b2b937937d262f304
-
enabled
:
1
path
:
Assets/Scenes/Recorder.unity
guid
:
61476b21b30644ba3b6656f5633e7b3c
m_configObjects
:
{}
Demo/API/UserSettings/EditorUserSettings.asset
浏览文件 @
bb3c01a1
...
...
@@ -11,6 +11,12 @@ EditorUserSettings:
RecentlyUsedSceneGuid-1
:
value
:
5a5004505c0750020f5e0e7b14775c16404f4a7b742c7e6178284930b3e26760
flags
:
0
RecentlyUsedSceneGuid-2
:
value
:
5500005153575b0a0f5d5c7444775d1145154e7c797e20657b7a4e36b5e2673b
flags
:
0
RecentlyUsedSceneGuid-3
:
value
:
5552575556000a035a5b0e7542770d12441541797b717567297b4b61e4b3646c
flags
:
0
vcSharedLogLevel
:
value
:
0d5e400f0650
flags
:
0
...
...
Design/AudioOptimization.md
浏览文件 @
bb3c01a1
...
...
@@ -11,7 +11,7 @@
### 接口使用
参考
[
微信开发者文档
](
https://developers.weixin.qq.com/minigame/dev/api/media/audio/InnerAudioContext.html
)
其中
src为音频地址,可填本地路径如 xx.wav,运行时会自动和配置的音频地址前缀(默认为
DATA_CDN/Assets)做拼接得到最终线上地址。
其中
src 为音频地址,可填本地路径如 xx.wav,运行时会自动和配置的音频地址前缀(默认为
DATA_CDN/Assets)做拼接得到最终线上地址。
```
c#
// 使用方法一:创建音频对象可以在初始化是加上needDownload = true,音频会先下载到本地,然后再播放
...
...
@@ -42,7 +42,7 @@ audio2.OnCanplay(() =>
// 使用方法三:先提前创建音频对象,批量下载音频文件,在下载完成后可以直接修改音频对象的src并播放
string
[]
a
=
{
"Audio/0.wav"
,
"Audio/1.wav"
,
"Audio/2.wav"
};
string
[]
a
=
{
"Audio/0.wav"
,
"Audio/1.wav"
,
"Audio/2.wav"
};
var
audio3
=
WX
.
CreateInnerAudioContext
(
new
InnerAudioContextParam
(){
needDownload
=
true
});
WX
.
PreDownloadAudios
(
a
,
(
int
res
)
=>
{
...
...
@@ -63,10 +63,12 @@ audio.Stop();
```
## 参考示例
音频一般最多只能同时存在10个,所以必须要开发者自己控制音频对象池重复使用,可以参考以下示例:
InnerAudioContext 实例最多同时存在 32 个,如果播放的不是本地文件而是 cdn 地址,则最多只支持 10 个,因此建议使用 needDownload 先下载,可以参考以下示例使用:
[
音频示例
](
https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Demo/API/Assets/Scripts/AudioManager.cs
)
## 示例补充说明
-
示例只是作为参考,可以不按照示例,以开发者文档为准
-
WX.CreateInnerAudioContext 返回的音频对象是可以复用的,可以多次调用 Play 方法播放,但是如果需要多个音频同时播放就要创建多个音频对象。
-
其中音频 src 为音频地址,可填本地路径如 Audios/xx.wav,运行时会自动和配置的音频地址前缀(默认为 DATA_CDN/Assets)做拼接得到最终线上地址。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录