Unity3D集成腾讯语音GVoice SDK
友情提示:最近發(fā)現(xiàn)騰訊GVoice有另一個官網(wǎng),叫做騰訊游戲服務(wù),經(jīng)過對比發(fā)現(xiàn)這個網(wǎng)站才是最新的,下面我介紹的那個估計是已經(jīng)廢棄的,但不知道為啥老的網(wǎng)站沒有直接鏈接到新網(wǎng)址而是仍然保留了。不過新官網(wǎng)的文檔更加詳細(xì),SDK也有所更新,所以建議去新官網(wǎng)下載SDK和Demo,接入流程基本沒有啥大變化。
簡述
我們項目中用到了實時語音功能,在最初語音 SDK 技術(shù)選型的時候測試過融云、聲網(wǎng)和騰訊的 GVoice 。融云和聲網(wǎng)我都在我們項目中使用過,但是效果都不如王者榮耀游戲中的實時語音效果,這兩天好好研究了一下騰訊的 GVoice,終于成功集成。由于騰訊 GVoice 官網(wǎng)的接入流程并不是很詳細(xì),如果只懂 Unity3D 不懂 Android 基礎(chǔ)知識的朋友,可能接入過程不會一帆風(fēng)順。我雖了解一點點 Android 基礎(chǔ),但仍趟過了好幾個坑,下面我就分享一下我在 Android 平臺接入 GVoice 的過程。
資源準(zhǔn)備
進(jìn)入騰訊GVoice官網(wǎng)下載 GVoice SDK 和 Unity3D Demo。如下圖:
接入流程
1. 導(dǎo)入SDK
先創(chuàng)建一個空的 Unity 項目 GVoiceDemo,按照官網(wǎng)的接入流程,我們直接將下載的SDK壓縮包解壓后將其中的 Plugins 和 Scripts 兩個文件夾都拷貝到 Unity 項目中。
2. 創(chuàng)建 Jar 包
將Unity項目導(dǎo)出成安卓項目,導(dǎo)出路徑選擇某個指定的文件夾,我這里在桌面新建了一個叫 unity_gvoicedemo 的文件夾,將項目導(dǎo)出到該文件夾中,操作如下圖:
導(dǎo)出成功后會生成 GCloudVoice 和 GVoiceDemo 兩個文件夾,用 eclipse 將這兩個項目一起導(dǎo)入,如下圖
導(dǎo)入成功后,在 UnityPlayerActivity 項目下新建一個 MainActivity 類,繼承自 UnityPlayerActivity,詳細(xì)代碼如下:
package com.shehweiwei.gvoicedemo;
import android.os.Bundle;
import com.tencent.gcloud.voice.GCloudVoiceEngine;
// 注意:下面這句代碼必須有,如果沒有可能會導(dǎo)致閃退
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity
{
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
GCloudVoiceEngine.getInstance().init(getApplicationContext(), this);
}
}
注意:代碼中一定要引入com.unity3d.player.UnityPlayerActivity這個包,如果沒有引入則進(jìn)入應(yīng)用就閃退,這里是個大坑,我好不容易才爬出來。
然后,選中 MainActivity.java 文件,右鍵選擇 Export -> Java -> JAR file, 然后點擊 Next 按鈕, 接下來操作如下圖:
最后,生成一個 GVoiceDemo.jar 文件。
3. 導(dǎo)入其他文件
將下載的 unity_demo.zip 壓縮包解壓后將其中的 unity_demo\Assets\Plugins\Android 目錄下的 AndroidManifest.xml 和 android-support-v4.jar 兩個文件拷貝到項目的 Plugins\Android 目錄下。注意還有個GCloudVoiceDemo.jar 文件我們沒有拷貝,這里我們使用上一步創(chuàng)建的 GVoiceDemo.jar 文件來替代。注意 jar 包中的包名必須與 AndroidManifest.xml 文件和 Unity 編輯器中PlayerSettings的 Bundle Identifier 包名保持一致。所以,要把 AndroidManifest.xml 文件中的 package="com.example.gcloudu3ddemo" 這一句代碼修改成 package="com.shehweiwei.gvoicedemo"。
注意:AndroidManifest.xml 文件中的入口 Activity 的名字必須和創(chuàng)建的 Jar 包中的新建的 Activity 名字保持一致。這里的入口 Activity 叫 MainActivity,所以 AndroidManifest.xml 文件中的代碼為android:name=".MainActivity",當(dāng)然也可以寫成 android:name="com.example.gcloudu3ddemo.MainActivity"
4. 構(gòu)建Unity場景
這里我用uGUI搭建了一個簡單的界面,有六個按鈕分別調(diào)用 GVoice SDK 的六個 API ,然后一個 Text 用來顯示回調(diào)結(jié)果。界面效果如下圖:
然后新建一個 GVoiceDemo 的 C# 腳本,腳本代碼如下:
using UnityEngine;
using gcloud_voice;
using UnityEngine.UI;
using System;
public class GVoiceDemo : MonoBehaviour
{
// 用來顯示調(diào)用API返回的結(jié)果
public Text result;
private IGCloudVoice m_voiceengine = null;
// TODO: 這里的appId和appKey使用的是官方提供的測試值,正式項目中可使用申請的值
private const string appId = "932849489";
private const string appKey = "d94749efe9fce61333121de84123ef9b";
// TODO: 這里使用的是測試賬號,所以房間名使用默認(rèn)的100,正式項目中可根據(jù)實際情況賦值
private string roomName = "100";
void Start()
{
if (m_voiceengine == null)
{
m_voiceengine = GCloudVoice.GetEngine();
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string strTime = System.Convert.ToInt64(ts.TotalSeconds).ToString();
// TODO: 這里用時間模擬了一個openId,在正式項目中應(yīng)該把這里的strTime換成用戶唯一ID
m_voiceengine.SetAppInfo(appId, appKey, strTime);
m_voiceengine.Init();
// 注冊SDK常用回調(diào)監(jiān)聽
m_voiceengine.OnJoinRoomComplete += OnJoinRoom;
m_voiceengine.OnQuitRoomComplete += OnExitRoom;
m_voiceengine.OnMemberVoice += OnMemberVoice;
}
}
void Update()
{
if (m_voiceengine != null)
{
// 不斷檢測GVoice引擎回調(diào)
m_voiceengine.Poll();
}
}
void OnApplicationPause(bool pauseStatus)
{
if (m_voiceengine == null)
{
return;
}
// 應(yīng)用暫停時GVoice引擎也暫停,應(yīng)用重新開始時引擎繼續(xù)
if (pauseStatus)
{
m_voiceengine.Pause();
}
else
{
m_voiceengine.Resume();
}
}
/// <summary>
/// 加入房間,BtnJoin按鈕點擊調(diào)用
/// </summary>
public void JoinRoom()
{
m_voiceengine.SetMode(GCloudVoiceMode.RealTime);
int ret = m_voiceengine.JoinTeamRoom(roomName, 15000);
result.text += "\nJoinRoom:" + ret;
}
/// <summary>
/// 退出房間,BtnExit按鈕點擊調(diào)用
/// </summary>
public void ExitRoom()
{
int ret = m_voiceengine.QuitRoom(roomName, 6000);
result.text += "\nExitRoom:" + ret;
}
/// <summary>
/// 打開麥克風(fēng),BtnOpenMic按鈕點擊調(diào)用
/// </summary>
public void OpenMic()
{
int ret = m_voiceengine.OpenMic();
result.text += "\nOpenMic:" + ret;
}
/// <summary>
/// 關(guān)閉麥克風(fēng),BtnCloseMic按鈕點擊調(diào)用
/// </summary>
public void CloseMic()
{
int ret = m_voiceengine.CloseMic();
result.text += "\nCloseMic:" + ret;
}
/// <summary>
/// 打開揚聲器,BtnOpenSpeaker按鈕點擊調(diào)用
/// </summary>
public void OpenSpeaker()
{
int ret = m_voiceengine.OpenSpeaker();
result.text += "\nOpenSpeaker:" + ret;
}
/// <summary>
/// 關(guān)閉揚聲器,BtnCloseSpeaker按鈕點擊調(diào)用
/// </summary>
public void CloseSpeaker()
{
int ret = m_voiceengine.CloseSpeaker();
result.text += "\nCloseSpeaker:" + ret;
}
/// <summary>
/// 加入房間回調(diào)
/// </summary>
/// <param name="code"></param>
/// <param name="roomName"></param>
/// <param name="memberID"></param>
private void OnJoinRoom(IGCloudVoice.GCloudVoiceCompleteCode code, string roomName, int memberID)
{
result.text += string.Format("\nOnJoinRoom ---> code: {0}, roomName: {1}, memberID: {2}", code, roomName, memberID);
}
/// <summary>
/// 退出房間回調(diào)
/// </summary>
/// <param name="code"></param>
/// <param name="roomName"></param>
/// <param name="memberID"></param>
private void OnExitRoom(IGCloudVoice.GCloudVoiceCompleteCode code, string roomName, int memberID)
{
result.text += string.Format("\nOnExitRoom ---> code: {0}, roomName: {1}, memberID: {2}", code, roomName, memberID);
m_voiceengine.OnJoinRoomComplete -= OnJoinRoom;
m_voiceengine.OnQuitRoomComplete -= OnExitRoom;
m_voiceengine.OnMemberVoice -= OnMemberVoice;
}
/// <summary>
/// 有成員說話時回調(diào)
/// </summary>
/// <param name="members"></param>
/// <param name="count"></param>
private void OnMemberVoice(int[] members, int count)
{
result.text += string.Format("\nOnMemberVoice ---> count: {0}, roomName: {1}, memberID: {2}", count);
}
}
將 GVoiceDemo 腳本添加到Canvas對象上,然后將腳本中對應(yīng)的方法注冊到對應(yīng)的按鈕的OnClick事件上,保存場景,然后運行到手機上,使用兩個手機就可以語音聊天了,效果如下圖:
其他事項
按照上面的流程集成完的項目并不能在PC上運行,如果要在PC上運行不報錯,可以將下載的 unity_demo.zip 文件解壓后的 unity_demo\Assets\Plugins 目錄下的 X86 和 x86_64 兩個文件夾拷貝到項目的 Plugins 文件夾下,這樣PC上運行就不會報錯。因為我這里沒有麥克風(fēng)設(shè)備,不知道在PC上能不能使用語音聊天,有條件的朋友可以試試,有結(jié)果了可以反饋給我,先謝過了!
項目源碼
我把項目的源碼托管在了Github上了, 有需要的朋友自取。項目鏈接點這里
本文作者:?Sheh偉偉
本文鏈接:?http://davidsheh.github.io/2017/05/27/Unity3D集成騰訊語音GVoiceSDK/
版權(quán)聲明: 本博客所有文章除特別聲明外,均采用?CC BY-NC-SA 3.0?許可協(xié)議。轉(zhuǎn)載請注明出處!
總結(jié)
以上是生活随笔為你收集整理的Unity3D集成腾讯语音GVoice SDK的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实战进阶 Vue3+Axios+pini
- 下一篇: 数据库中的几个概念 - LGWR, AR