C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

论坛 期权论坛 脚本     
niminba   2021-5-23 04:10   1063   0

我们已经上线了 Agora Unreal SDK,提供了支持 Blueprint 和 C++ 的两个版本 SDK。我们分享了如何基于 Blueprint 在游戏中创建实时音视频功能 。在本文中,我们来分享如何基于声网 Agora Unreal SDK C++版本,在游戏中实现实时音视频功能。

本篇教程较长,建议在 Web 浏览器端浏览,体验更好。

准备工作

需要的开发环境和需要准备的与 Blueprint 一样:

  • Unreal 4.34 以上版本
  • Visual Studio 或 Xcode(版本根据 Unreal 配置要求而定)
  • 运行 Windows 7 以上系统的 PC 或 一台 Mac
  • Agora 注册账号一枚(免费注册,见官网 Agora.io)
  • 如果你的企业网络存在防火墙,请在声网文档中心搜索「应用企业防火墙限制」,进行配置。

新建项目

如果你已经有 Unreal 项目了,可以跳过这一步。在 Unreal 中创建一个 C++类型的项目。

确保在 [your_project]/Source/[project_name]/[project_name].Build.cs文件的 PrivateDependencyModuleNames一行,去掉注释。Unreal 默认是将它注释掉的,这会导致在编译的时候报错。

// Uncomment if you are using Slate UI
 PrivateDependencyModuleNames.AddRange(new string[] { "UMG", "Slate", "SlateCore" });

接下来我们在项目中集成 Agora SDK

1.将 SDK 复制到这个路径下 [your_project]/Plugins

2.把插件依赖添加到[your_project]/Source/[project_name]/[project_name].Build.cs文件的私有依赖(Private Dependencies)部分 PrivateDependencyModuleNames.AddRange(new string[] { "AgoraPlugin", "AgoraBlueprintable" });

3.重启 Unreal

4.点击 Edit->Plugin,在分类中找到 Project->Other,确定插件已经生效

创建新的 Level

接下来我们将创建一个新的 Level,在那里建立我们的游戏环境。有几种不同的方法可以创建一个新的 Level,我们将使用文件菜单的方法,其中列出了关卡选择选项。

在虚幻编辑器里面,点击文件菜单选项,然后选择新建 Level......

然后会打开一个新的对话框 。

选择Empty Level ,然后指定一个存储的路径。

创建核心类

在这里我们要创建两个类:VideoFrameObserver 和VideoCall C++ Class。他们会负责与 Agora SDK 进行通信。

首先是 VideoFrameObserver。VideoFrameObserver 执行的是 agora::media::IVideoFrameObserver。这个方法在 VideoFrameObserver 类中负责管理视频帧的回调。它是用 registerVideoFrameObserver 在 agora::media::IMediaEngine 中注册的。

在 Unreal 编辑器中,选择 File->Add New C++ Class。

父类谁定为 None,然后点击下一步。

为 VideoFrameObserver明明,然后选择 Create Class。

创建 VideoFrameObserver 类接口。

打开 VideoFrameObserver.h 文件然后添加如下代码:

//VideoFrameObserver.h
#include "CoreMinimal.h"
#include <functional>
#include "AgoraMediaEngine.h"
class AGORAVIDEOCALL_API VideoFrameObserver : public agora::media::IVideoFrameObserver
{
public:
 virtual ~VideoFrameObserver() = default;
public:
 bool onCaptureVideoFrame(VideoFrame& videoFrame) override;
 bool onRenderVideoFrame(unsigned int uid, VideoFrame& videoFrame) override;
 void setOnCaptureVideoFrameCallback(
 std::function<void(std::uint8_t*, std::uint32_t, std::uint32_t, std::uint32_t)> callback);
 void setOnRenderVideoFrameCallback(
 std::function<void(std::uint8_t*, std::uint32_t, std::uint32_t, std::uint32_t)> callback);
 virtual VIDEO_FRAME_TYPE getVideoFormatPreference() override { return FRAME_TYPE_RGBA; }
private:
 std::function<void(std::uint8_t*, std::uint32_t, std::uint32_t, std::uint32_t)VBТFVuvFvWBРТ6VFR$VFТ6VFR$VFWGW&S$BРТ6VFRfwC&SУFcУXhYXУТffW.KX*$t${Xk.X8vGF8VvNY(VffW%6^yNXxn)[~yNX8#Т%F&vWDv^YTK6FR''W6hn{ynhniJyNYKn8#Т%F&vWEFWGW&^h{ynKnKyJ'VffW.XiNik8#УVУFFUFWGW&U&Vv~ZK{ynyNiNikXY~ZKKXY
Zh.K{Xe6F^XX>{JyNzX~8.hKnyJZ{Xe&V%F&vWDv^KyE&V%F&vWEFWGW&^8#Уb673&66У&R673''W67#ТFVuvFvWBТРХT452Ц672tDTUfFVuvFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3ТU$E&W&VDF&FvWBТTvR&V%F&vWDvRG#РТU$EVFDFVfV4ТUFWGW&S$B&V%F&vWEFWGW&RG#РТUFWGW&S$B6&WGW&RG#РТV'VffW"G#ТV%GFТV%VvBТV"'VffW%6RТeWFFUFWGW&U&VvWFFUFWGW&U&VvG#РТe6FT''W6''W6РТd7&F6V7FWFWРТЧ&SУFcУnybfT6'V7Bikk9SУfT6'V7NKhKnyJ).XxXhKNYKnXxXhKE&V%F&vWEFWGW&^KΙhKyJ7&VFUG&V>yJX[Xh{ynGW&S$N.xKnYnXVffW%6^KvGFVvBNyD'VffW%6^KX*$t$jNKZ.zK.KKniNikhKN{ynKKyJWFFUFWGW&U&Vv{[8.X{[yNZ^XKKiNX8h{Xk.X8.KX8h{Xk.Xi{nKh>yJX{[iKXY{ynK8.xyJhKE&V%F&vWEFWGW&^XxX''W6XnY&V%F&vWDvRvFvWNK''W68#Уb673&66У&R673''W67#ТFVuvFvWBРХT452Ц672tDTUfFVuvFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3РТРТffT6'V7B&FSРТЧТFVuvFvWBРЧfUfFVuvFvWCfT6'V7BЧТ7WW#fT6'V7BРТvGFcCТVvB3cРТ&V%F&vWEFWGW&RUFWGW&S$C7&VFUG&VvGFVvBe#Т&V%F&vWEFWGW&RwCWFFU&W6RРТ'VffW%6RvGFVvBCТ'VffW"V'VffW%6UТfV"fvGFVvCТТ'VffW%B3#Т'VffW%B3#Т'VffW%B%3#Т'VffW%B5dcТWFFUFWGW&U&VveWFFUFWGW&U&VvvGFVvBТ&V%F&vWEFWGW&RwCWFFUFWGW&U&VvWFFUFWGW&U&VvvGFBV"B'VffW"РТ''W6E&W6T7B&V%F&vWEFWGW&RТ&V%F&vWDvRwC6WD''W6''W6ЧУFcУnybfTFW7G'V7Bikk9SУb673&66У&R673''W67#ТFVuvFvWBРХT452Ц672tDTUfFVuvFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3РТРТffTFW7G'V7B&FSРТЧТFVuvFvWBРЧfUfFVuvFvWCfTFW7G'V7BЧТ7WW#fTFW7G'V7BРТFVFU'VffW#ТFVFRWFFUFWGW&U&VvУFcУnybfUF6ikk9SУ.iFFUFWGW&U&VvGFhdVvNKKW.yEvGFVvNXhKΙhxkX[&V%F&vWEFWGW&^K^iJNikyNX[nX8fR6'V7NhYKj~xHxX8.Y
nXXyJ'VffW.>yJWFFUFWGW&U&Vv#Уb673&66У&R673''W67#ТFVuvFvWBТРХT452Ц672tDTUfFVuvFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3РТРТffUF66dvV'fvV'fBFVF&FSРТЧТFVuvFvWBРЧfUfFVuvFvWCfUF66dvV'fvV'fBFVFЧТ7WW#fUF6vV'FVFРТe666fFWРТbWFFUFWGW&U&VvwCvGFvGFТWFFUFWGW&U&VvwCVvBVvBТТWFuWFFUFWGW&U&VveWFFUFWGW&U&VvvGFVvBРТWFu&V%F&vWEFWGW&RUFWGW&S$C7&VFUG&VvGFVvBe#Т&V%F&vWEFWGW&RwCWFFU&W6RТ&V%F&vWEFWGW&RwCWFFUFWGW&U&VvWFFUFWGW&U&VvvGFBV"B'VffW"РТ''W6E&W6T7B&V%F&vWEFWGW&RТ&V%F&vWDvRwC6WD''W6''W6РТ72w27V62UFWGW&S$B&RWF6v&&vR67FVBvVW&R2&BW"&VfW&V2FRFB7BТbW7BfRBF&VfW&VBVWvW&RFVBv&RFW7G&WF6РТeWFFUFWGW&U&VvFWFFUFWGW&U&VvWFFUFWGW&U&VvТ&V%F&vWEFWGW&R&V%F&vWEFWGW&SТWFFUFWGW&U&VvWFFUFWGW&U&VvТFVFRFWFFUFWGW&U&Vv&WGW&&V%F&vWEFWGW&RwCWFFUFWGW&U&VvWFFUFWGW&U&VvvGFBV"B'VffW"ЧУFcУWFFT'VffW"ikk9SУyJiiNik'VffW"X.hKKv4D{^iKnXikyNX.yKKSByNXnKnXXX'VffW"K[nYfUF6ikk9^KNik{ynK^K>yJWFFUFWGW&U&Vv#Уb673&66У&R673''W67#ТFVuvFvWBРХT452Ц672tDTUfFVuvFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3РТРТfWFFT'VffW"V$t$'VffW"V%GFV%VvBV%RТf&W6WD'VffW"ТЧТFVuvFvWBРЧfUfFVuvFvWCWFFT'VffW"ТV$t$'VffW"V%WuvGFV%WtVvBV%Wu6RЧТe666fFWРТb$t$'VffW"ТТ&WGW&Тb'VffW%6R6RТТ7FC6$t$'VffW"$t$'VffW"6R'VffW"ТVPТТFVFU'VffW#Т'VffW%6R6SТvGFvGFТVvBVvCТ'VffW"V'VffW%6UТ7FC6$t$'VffW"$t$'VffW"6R'VffW"ТЧfUfFVuvFvWC&W6WD'VffW"ЧТfV"fvGFVvCТТ'VffW%B3#Т'VffW%B3#Т'VffW%B%3#Т'VffW%B5dcТУFcУ[fFVWuvFvWB2{УFVWuvFvWB{yNKyJiiYY(yJh~yNxn)8.hKΙhKNKfFVuvFvWB[nKyJiiiziYiNX8Nxn)nKKyJiiKyJh~iKnXyNxn)~KhKKyJh~#У[{Y({XhyBVFSУ*>j~X[vFvWB2{XhyFVF^8#Уb673&66У&R673''W67#ТFVWuvFvWBРТ6VFR$6 Т6VFR$&W&W6W%vFvWBТ6VFR$6G2T& РТ6VFR%fFVuvFvWBРТ6VFR%fFVWuvFvWBFVBТFVWuvFvWBРТ6VFR$6G2f56B&SУFcУXhYXУb673&66У&R673''W67#ТFVWuvFvWBРТРХT452Ц672tDTUfFVWuvFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3РТU$E&W&VDF&FvWBТUfFVuvFvWBFVuvFvWBG#РТU$E&W&VDF&FvWBТU6T&FVT&G#РТU$E&W&VDF&FvWBТUfFVuvFvWBFFFfFVuvFvWBG#РТU$E&W&VDF&FvWBТU6T&FFFfFVT&G#РЧV&3Т"FVFТ"FVvBРТЧ&SУFcУnybfUF6ikk9SУb673&66У&R673''W67#ЦТFVWuvFvWBРТРХT452Ц672tDTUfFVWuvFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3РТРТffUF66dvV'fvV'fBFVF&FSРТЧТFVWuvFvWBРЧfUfFVWuvFvWCfUF66dvV'fvV'fBFVFЧТ7WW#fUF6vV'FVFРТWF&VVRvV'D6RРТbFVvBТТfB7V7E&FТ7V7E&FFVFBFVvCРТWFFVG'FVuvFvWBwCvWD66VDvV'ТWFFVVVRFVG'D6RТbFVVVRТТ&WGW&ТWFtFVvBFVVVR哰ТWFtFVF7V7E&FFVvCРТFVT&wC6WD6&VEvGFFVFТFVT&wC6WD6&VDVvBFVvBРТT656B656B67BfT656BfwCFVT&wC6BТ656BwC6WDWFRG'VRРТefV7FWtFVFТWtFVvBТ656BwC6WEWuТУFcУNikWFFTFVfW"FTFFFfFVfSУb673&66У&R673''W67#ТFVWuvFvWBРРТРРХT452Ц672tDTUfFVWuvFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3РТРТfWFFTFVfW"V$t$'VffW"V%GFV%VvBV%RТfWFFTFFFfFVfW"V$t$'VffW"V%GFV%VvBV%RРТf&W6WD'VffW'2ТЧТFVWuvFvWBРЧfUfFVWuvFvWCWFFTFVfW"ТV$t$'VffW"V%GFV%VvBV%RЧТbFVuvFvWBТТ&WGW&FVFvGFТFVvBVvCТFVuvFvWBwCWFFT'VffW"$t$'VffW"vGFVvB6RЧЧfUfFVWuvFvWCWFFTFFFfFVfW"ТV$t$'VffW"V%GFV%VvBV%RЧТbFFFfFVuvFvWBТТ&WGW&FFFfFVuvFvWBwCWFFT'VffW"$t$'VffW"vGFVvB6RЧЧfUfFVWuvFvWC&W6WD'VffW'2ЧТbFVuvFvWBFFFfFVuvFvWBТТ&WGW&FVuvFvWBwC&W6WD'VffW"ТFFFfFVuvFvWBwC&W6WD'VffW"ЧУFcУ[fFVFvWB2{УFVFvWB{KKzKKNyJz[>)>yJ[n8.ZY
K^KhnNK~KETXX>{J{Z#У[{Y({XhyFVFSУ*>j~X[vFvWB2{X[yFVF^Y(Xi#Уb673&66У&R673''W67#ТFVFvWB6VFR$6 Т6VFR$&W&W6W%vFvWBРТ6VFR%FVFW2VUG"Т6VFR$6G2vRТ6VFR$6G2F Т6VFR$VFWGW&S$BРТ6VFR%fFV РТ6VFR%fFVWuvFvWBРТ6VFR%fFVFvWBFVBРЦ672fFVW$6#Ц672UfFVuvFvWCТFVFvWBРТ6VFR$6BW7FF72Т6VFR%T7B7G'V7FW'2Т6VFR$6G2f56BРТ6VFR%fFVuvFvWBРТ6VFR%fFVW$6"&SУFcУhYXУb673&66У&R673''W67#ТFVFvWBРХT452Ц672tDTUfFVFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3ТfFVW$6"W$6"G#РЧV&3ТU$E&W&VDF&FvWBТUfFVWuvFvWBfFVWuvFvWBG#РТGFU$E&W&VDF&FvWBТT'WGFV'WGFG#ТU$E&W&VDF&FvWBТT'WGFFT6VFFG#ТU$E&W&VDF&FvWBТT'WGFfFVT'WGFG#РТGFWGW&W0Т"'WGFUcТ"'WGFUcТUFWGW&S$BV'WGFGW&RG#ТUFWGW&S$BVFFFUFWGW&RG#ТUFWGW&S$BVFFFUFWGW&RG#ТUFWGW&S$BfFVT'WGF&WGW&RG#ТUFWGW&S$BfFVT'WGF&GW&RG#РТEVVUG"ffFVwCfFVG#РТЧ&SУFcУxXfFVFvWCУjh*76WNYn[nX[nXnXy[NyN{yn8.xKnY{ynXxXjh*#Уb673&66У&R673''W67#ТFVFvWBТРХT452Ц672tDTUfFVFvWBV&2UW6W%vFvW@ЧТtTDTEРЧV&3РТТUfFVFvWB6d7DW"f7DW"РТffT6'V7B&FSТffTFW7G'V7B&FSРЧ&fFSТf'WGFРТЧТFVFvWBРРЧfUfFVFvWCfT6'V7BЧТ7WW#fT6'V7BРТ'WGFЧЧfUfFVFvWCfTFW7G'V7BЧТ7WW#fTFW7G'V7BРРТbfFVG"ТТfFVG"wC7FТХUfFVFvWCUfFVFvWB6d7DW"f7DW"Т7WW"7DW"ЧТ7FF26'V7FW'3d7Df"fUFWGW&S$BfwCТV'WGFGW&Tf"DUB%FWGW&RrRFGW&W2wWr"ТbV'WGFGW&Tf"66VVFVBТТV'WGFGW&RV'WGFGW&Tf"V7CТ7FF26'V7FW'3d7Df"fUFWGW&S$BfwCТVFFFUFWGW&Tf"DUB%FWGW&RrRFGW&W2RFRr"ТbVFFFUFWGW&Tf"66VVFVBТТVFFFUFWGW&RVFFFUFWGW&Tf"V7CТ7FF26'V7FW'3d7Df"fUFWGW&S$BfwCТVFFFUFWGW&Tf"DUB%FWGW&RrRFGW&W2WFRFRr"ТbVFFFUFWGW&Tf"66VVFVBТТVFFFUFWGW&RVFFFUFWGW&Tf"V7CТ7FF26'V7FW'3d7Df"fUFWGW&S$BfwCТfFVT'WGF&GW&Tf"DUB%FWGW&RrRFGW&W2W&&ТbfFVT'WGF&GW&Tf"66VVFVBТТfFVT'WGF&GW&RfFVT'WGF&GW&Tf"V7CТ7FF26'V7FW'3d7Df"fUFWGW&S$BfwCТfFVT'WGF&WGW&Tf"DUB%FWGW&RrRFGW&W2W&6&"ТbfFVT'WGF&WGW&Tf"66VVFVBТТfFVT'WGF&WGW&RfFVT'WGF&WGW&Tf"V7CТЧfUfFVFvWC'WGFЧТbV'WGFGW&RТТV'WGFwCvFvWE7G&6WE&W6T7BV'WGFGW&RТV'WGFwCvFvWE7G&vU6RefV7F'WGFU'WGFUТV'WGFwCvFvWE7G&G&t2U6FT''W6G&uGSGSvSРТV'WGFwCvFvWE7GfW&VBE&W6T7BV'WGFGW&RТV'WGFwCvFvWE7GfW&VBvU6RefV7F'WGFU'WGFUТV'WGFwCvFvWE7GfW&VBt2U6FT''W6G&uGSGSvSРТV'WGFwCvFvWE7GW76VBE&W6T7BV'WGFGW&RТV'WGFwCvFvWE7GW76VBvU6RefV7F'WGFU'WGFUТV'WGFwCvFvWE7GW76VBt2U6FT''W6G&uGSGSvSТV'WGFwC6VBDG2F2fUfFVFvWCD6РТ6WDVFFFRТFT6VFFwC6VBDG2F2fUfFVFvWCFT6VFТ6WEfFVT'WGF6&ТfFVT'WGFwC6VBDG2F2fUfFVFvWCfFVRРЧУFcУXh*ycУkzKz[yT6'WGFGW&W>K[yYih~Kn{;{ih~KnZKXX8.hiyNh*yn;X*Y*>x.YKyNy^Z[KKY'WGFGW&W>yNiky^nhiyNh*~hniK*>xKyNy8#УX6WGFW'3Уb673&66У&R673''W67#ТFVFvWBТРХT452Ц672tDTUfFVFvWBV&2UW6W%vFvW@ЧТtTDTEРТРЧV&3Тf6WEfFVW$6"fFVW$6"fFVW$6"Тf6WEfFVEVVUG"ffFVwC76VEfFVG"РТЧТFVFvWBРЧfUfFVFvWC6WEfFVW$6"fFVW$6"fFVW$6"ЧТW$6"fFVW$6#ЧЧfUfFVFvWC6WEfFVEVVUG"ffFVwC76VEfFVG"ЧТfFVG"7FCfR76VEfFVG"ЧУFcУyJiiNikfWryNikk9SУb673&66У&R673''W67#ТFVFvWBТРХT452Ц672tDTUfFVFvWBV&2UW6W%vFvW@ЧТtTDTEРТРЧ&fFSРРТf6WEfFVT'WGF6&Тf6WEfFVT'WGF6&РТf6WDVFFFRТf6WDVFFVFRРТЧТFVFvWBРРЧfUfFVFvWC6WEfFVT'WGF6&ЧТbfFVT'WGF&WGW&RТТfFVT'WGFwCvFvWE7G&6WE&W6T7BfFVT'WGF&WGW&RТfFVT'WGFwCvFvWE7G&vU6RefV7F'WGFU'WGFUТfFVT'WGFwCvFvWE7G&G&t2U6FT''W6G&uGSGSvSРРТfFVT'WGFwCvFvWE7GfW&VBE&W6T7BfFVT'WGF&WGW&RТfFVT'WGFwCvFvWE7GfW&VBvU6RefV7F'WGFU'WGFUТfFVT'WGFwCvFvWE7GfW&VBt2U6FT''W6G&uGSGSvSРРТfFVT'WGFwCvFvWE7GW76VBE&W6T7BfFVT'WGF&WGW&RТfFVT'WGFwCvFvWE7GW76VBvU6RefV7F'WGFU'WGFUТfFVT'WGFwCvFvWE7GW76VBt2U6FT''W6G&uGSGSvSТЧfUfFVFvWC6WEfFVT'WGF6&ЧТbfFVT'WGF&GW&RТТfFVT'WGFwCvFvWE7G&6WE&W6T7BfFVT'WGF&GW&RТfFVT'WGFwCvFvWE7G&vU6RefV7F'WGFU'WGFUТfFVT'WGFwCvFvWE7G&G&t2U6FT''W6G&uGSGSvSРТfFVT'WGFwCvFvWE7GfW&VBE&W6T7BfFVT'WGF&GW&RТfFVT'WGFwCvFvWE7GfW&VBvU6RefV7F'WGFU'WGFUТfFVT'WGFwCvFvWE7GfW&VBt2U6FT''W6G&uGSGSvSРТfFVT'WGFwCvFvWE7GW76VBE&W6T7BfFVT'WGF&GW&RТfFVT'WGFwCvFvWE7GW76VBvU6RefV7F'WGFU'WGFUТfFVT'WGFwCvFvWE7GW76VBt2U6FT''W6G&uGSGSvSТЧfUfFVFvWC6WDVFFFRЧТbVFFFUFWGW&RТТFT6VFFwCvFvWE7G&6WE&W6T7BVFFFUFWGW&RТFT6VFFwCvFvWE7G&vU6RefV7F'WGFU'WGFUТFT6VFFwCvFvWE7G&G&t2U6FT''W6G&uGSGSvSРТFT6VFFwCvFvWE7GfW&VBE&W6T7BVFFFUFWGW&RТFT6VFFwCvFvWE7GfW&VBvU6RefV7F'WGFU'WGFUТFT6VFFwCvFvWE7GfW&VBt2U6FT''W6G&uGSGSvSРТFT6VFFwCvFvWE7GW76VBE&W6T7BVFFFUFWGW&RТFT6VFFwCvFvWE7GW76VBvU6RefV7F'WGFU'WGFUТFT6VFFwCvFvWE7GW76VBt2U6FT''W6G&uGSGSvSТЧfUfFVFvWC6WDVFFVFRЧТbVFFFUFWGW&RТТFT6VFFwCvFvWE7G&6WE&W6T7BVFFFUFWGW&RТFT6VFFwCvFvWE7G&vU6RefV7F'WGFU'WGFUТFT6VFFwCvFvWE7G&G&t2U6FT''W6G&uGSGSvSРТFT6VFFwCvFvWE7GfW&VBE&W6T7BVFFFUFWGW&RТFT6VFFwCvFvWE7GfW&VBvU6RefV7F'WGFU'WGFUТFT6VFFwCvFvWE7GfW&VBt2U6FT''W6G&uGSGSvSРТFT6VFFwCvFvWE7GW76VBE&W6T7BVFFFUFWGW&RТFT6VFFwCvFvWE7GW76VBvU6RefV7F'WGFU'WGFUТFT6VFFwCvFvWE7GW76VBt2U6FT''W6G&uGSGSvSТУFcУ'D6ikk9SУb673&66У&R673''W67#ТFVFvWBРТРРХT452Ц672tDTUfFVFvWBV&2UW6W%vFvW@ЧТtTDTEРРЧV&3РРТРРТf'D66e7G&66e7G&VF6e7G&VFRРРТЧТFVFvWBРРЧfUfFVFvWC'D6Т6e7G&66e7G&VF6e7G&VFRЧТbfFVG"ТТ&WGW&РТWF6&6&6F5Т7FCV'VffW"7FCV%GF7FCV%VvB7FCV%RТТfFVWuvFvWBwCWFFTFFFfFVfW"'VffW"vGFVvB6RТТfFVG"wC&Vv7FW$6&6&66&6&6РРТWF&VFTg&6&6F5Т7FCV'VffW"7FCV%GF7FCV%VvB7FCV%RТТfFVWuvFvWBwCWFFTFVfW"'VffW"vGFVvB6RТТfFVG"wC&Vv7FW$FTg&6&6FTg&6&6РРТfFVG"wC7F'D66VFVFRЧУFcУD6ikk9SУb673&66У&R673''W67#ТFVFvWBРТРРХT452Ц672tDTUfFVFvWBV&2UW6W%vFvW@ЧТtTDTEРРЧV&3РРТРРТTeTW&&ТfD6РРТЧТFVFvWBРРЧfUfFVFvWCD6ЧТbfFVG"ТТfFVG"wC7FТРТbfFVWuvFvWBТТfFVWuvFvWBwC&W6WD'VffW'2ТРТbW$6"ТТ6WEf6&GU6FUf6&G66VBТW$6"wCV7FCfRfFVG"ТУFcУFT6VFk9SУb673&66У&R673''W67#ТFVFvWBРТРРХT452Ц672tDTUfFVFvWBV&2UW6W%vFvW@ЧТtTDTEРРЧV&3РРТРРТTeTW&&ТfFT6VFРРТЧТFVFvWBРРЧfUfFVFvWCFT6VFТbfFVG"ТТ&WGW&bfFVG"wC46VFVBТТfFVG"wCFT6VFRТ6WDVFFFRТVPТТfFVG"wCFT6VFVRТ6WDVFFVFRТУFcУfFV^ikk9SУb673&66У&R673''W67#ТFVFvWBРТРРХT452Ц672tDTUfFVFvWBV&2UW6W%vFvW@ЧТtTDTEРРЧV&3РРТРРТTeTW&&ТffFVRРРТЧТFVFvWBРРЧfUfFVFvWCfFVRЧТbfFVG"ТТ&WGW&bfFVG"wC46FVVBТТfFVG"wCFT6FVVRРРТ6WEfFVT'WGF6&ТVPТТfFVG"wCVfFVVRТfFVG"wCFT6FVRРРТ6WEfFVT'WGF6&ТУFcУ&W&{УK>zjznk*ihXyNy[nizk9^KKjyNi88.Zh.i[{.{n2K>znY[{KKnk*iyXhyN{~[	ikh>[y#У[%W$6FvWB&W&76WN8#У[KKTV$6FvWByB&W&Xx+X{Xh^ZhyJh~yXΙ[nhvFvWB&W&#У"7&3GG3F&'22V"c6SS6#c#3c#vCFFCF&#SFCr#УNiKikyNyJh~[~yN{yNxn{8.h>[&W&KX{xT{yXΙ8^Xk^KFW6vXiyN8.x+X{Y.h*Xy.h*h.{.8.Yi$FWF.Kx+X{KhX~.xn{.hKX[yD2{TV$6FvWN8.xX^8.>.iz~XY
XzzxYN[nXyJZi
KyBTXX>{J8.hFWN8VFF&FWN8'WGF(6&7G&XX>{JnYnZnX[z^KX.YzK8.xKnYXZR$V$6FvWB.ih~KnKBTV$6FvWByNZ^yhYXyNY{Y(yN{YUFWD&68VFF&FWD&T'WGF6&&8.X%VWufFvWB{K{KhnXyETXX>{JyYNY{8.KX	X{XX>{J[nY.K.iKNiKY{iZ8.[	Y.Zh.i[k{XKKK[n^YKyEW6W%vFvWN{K{xgvFvWNY{KXNh8^Xk^KX{xKIУ"7&3GG3F&'22V"c6cv&C&cC3ff#v3S&br#УXih~KnZKKKh"FVvFvWG2V$6FvWB76WN8#У[%VuvFvWB76WN8#У"7&3GG3F&'22V"cvf33FV3##&FS&V#ssf##&Sbr#УY~yNIx+У"7&3GG3F&'22V"c3cccsFC#3fc3&6S#&#sCVc2r#У[%VWuvFvWB76WCУ[%fFVWuvFvWB76WBnxn{KUfFVWuvFvWNnk{X%VfFVuvFvWB{YBTXX>{JFVuvFvWBY(FVEfFVuvFvWN8.Y{nk{X6T&YBFVT&(FFFfFVT&XX>{J8#У"7&3GG3F&'22V"cV6S3Ff6VcsF#s3VCfCFSc2r#У[%VFvWB76WCУ[%fFVFvWB76WNnxn{KUfFVFvWNGFRTXX>{J%fFVWuvFvWBK[nk{XY{KfFVWuvFvWNXV'WGFFT6VFF(fFVT'WGF*#У"7&3GG3F&'22V"ccfC#S#363sVS&3VCsC#ss##r#У"7&3GG3F&'22V"c&&3&fCscCCf3c#csSScsbr#У[%VW$6"&W&76WCУYi%fFVW%W$6"&W&76WByNi{nX	KnKKhyBfFVW%W$6"{[%fFVW$6"9NK~8#У7GFWBv6V"#"7&3GG3F&'22V"cF36FFCFVFf##cVVCVcvr#У[KKfFVW%W$6.yF&W&8.Xx+X{Xh^ZhFBh*Θh&W&z~Xhxn{6&V676W>:XnfFVW$6.{8#УY[nhKX[yN[nXnXW$6..KYzK8#У7GFWBv6V"#"7&3GG3F&'22V"ccSvcC33C&SCcfSf##Sss6c"r#УnX[nKXih~KnZKZh"FVvFvWG2fFVW$6"76WN8#У[%&fFVFT&6R76WCУ[KKfFVW$6"yB&W&Xx+X{Xh^ZhFBh*Θh&W&{6&V672z~XhvFR&6R67>8.hikhn{8#УvFSУYKhKyNzZvFR{Y(nY8.XKnyXKhZNXУ7GFWBv6V"#"7&3GG3F&'22V"cf3VCFV36#s3S&csSv#r#У~Z鮚yNУXZRVFBwC&B6WGF>[2fFW>8.鮛У7GFWBv6V"#"7&3GG3F&'22V"c##6FVS#C3CS3vcV#FFfVsrr#У7GFWBvgB#G66fc#G&h{37G&7jX[>KYVKkhZ{n)K.XyNih~z[K{NZIyX[42kh)K.XXh^Z{J.zKK^XNih~zhn{~{XyNyX[>ih~z[ZJ~Z^YZIiJ
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP