友情提示:最近發現騰訊GVoice有另外一個官網,叫作騰訊遊戲服務,通過對比發現這個網站纔是最新的,下面我介紹的那個估計是已經廢棄的,但不知道爲啥老的網站沒有直接連接到新網址而是仍然保留了。不過新官網的文檔更加詳細,SDK也有所更新,因此建議去新官網下載SDK和Demo,接入流程基本沒有啥大變化。java
咱們項目中用到了實時語音功能,在最初語音 SDK 技術選型的時候測試過融雲、聲網和騰訊的 GVoice 。融雲和聲網我都在咱們項目中使用過,可是效果都不如王者榮耀遊戲中的實時語音效果,這兩天好好研究了一下騰訊的 GVoice,終於成功集成。因爲騰訊 GVoice 官網的接入流程並非很詳細,若是隻懂 Unity3D 不懂 Android 基礎知識的朋友,可能接入過程不會一路順風。我雖瞭解一點點 Android 基礎,但仍趟過了好幾個坑,下面我就分享一下我在 Android 平臺接入 GVoice 的過程。android
進入騰訊GVoice官網下載 GVoice SDK 和 Unity3D Demo。以下圖:git
先建立一個空的 Unity 項目 GVoiceDemo,按照官網的接入流程,咱們直接將下載的SDK壓縮包解壓後將其中的 Plugins 和 Scripts 兩個文件夾都拷貝到 Unity 項目中。github
將Unity項目導出成安卓項目,導出路徑選擇某個指定的文件夾,我這裏在桌面新建了一個叫 unity_gvoicedemo 的文件夾,將項目導出到該文件夾中,操做以下圖:app
導出成功後會生成 GCloudVoice 和 GVoiceDemo 兩個文件夾,用 eclipse 將這兩個項目一塊兒導入,以下圖eclipse
導入成功後,在 UnityPlayerActivity 項目下新建一個 MainActivity 類,繼承自 UnityPlayerActivity,詳細代碼以下:編輯器
package com.shehweiwei.gvoicedemo; import android.os.Bundle; import com.tencent.gcloud.voice.GCloudVoiceEngine; // 注意:下面這句代碼必須有,若是沒有可能會致使閃退 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
這個包,若是沒有引入則進入應用就閃退,這裏是個大坑,我好不容易纔爬出來。
而後,選中 MainActivity.java 文件,右鍵選擇 Export -> Java -> JAR file, 而後點擊 Next 按鈕, 接下來操做以下圖:測試
最後,生成一個 GVoiceDemo.jar 文件。網站
將下載的 unity_demo.zip 壓縮包解壓後將其中的 unity_demo\Assets\Plugins\Android
目錄下的 AndroidManifest.xml 和 android-support-v4.jar 兩個文件拷貝到項目的 Plugins\Android
目錄下。注意還有個GCloudVoiceDemo.jar 文件咱們沒有拷貝,這裏咱們使用上一步建立的 GVoiceDemo.jar 文件來替代。注意 jar 包中的包名必須與 AndroidManifest.xml 文件和 Unity 編輯器中PlayerSettings的 Bundle Identifier 包名保持一致。因此,要把 AndroidManifest.xml 文件中的 package="com.example.gcloudu3ddemo"
這一句代碼修改爲 package="com.shehweiwei.gvoicedemo"
。ui
注意:AndroidManifest.xml 文件中的入口 Activity 的名字必須和建立的 Jar 包中的新建的 Activity 名字保持一致。這裏的入口 Activity 叫 MainActivity,因此 AndroidManifest.xml 文件中的代碼爲android:name=".MainActivity"
,固然也能夠寫成 android:name="com.example.gcloudu3ddemo.MainActivity"
這裏我用uGUI搭建了一個簡單的界面,有六個按鈕分別調用 GVoice SDK 的六個 API ,而後一個 Text 用來顯示回調結果。界面效果以下圖:
而後新建一個 GVoiceDemo 的 C# 腳本,腳本代碼以下:
using UnityEngine; using gcloud_voice; using UnityEngine.UI; using System; public class GVoiceDemo : MonoBehaviour { // 用來顯示調用API返回的結果 public Text result; private IGCloudVoice m_voiceengine = null; // TODO: 這裏的appId和appKey使用的是官方提供的測試值,正式項目中可以使用申請的值 private const string appId = "932849489"; private const string appKey = "d94749efe9fce61333121de84123ef9b"; // TODO: 這裏使用的是測試帳號,因此房間名使用默認的100,正式項目中可根據實際狀況賦值 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,在正式項目中應該把這裏的strTime換成用戶惟一ID m_voiceengine.SetAppInfo(appId, appKey, strTime); m_voiceengine.Init(); // 註冊SDK經常使用回調監聽 m_voiceengine.OnJoinRoomComplete += OnJoinRoom; m_voiceengine.OnQuitRoomComplete += OnExitRoom; m_voiceengine.OnMemberVoice += OnMemberVoice; } } void Update() { if (m_voiceengine != null) { // 不斷檢測GVoice引擎回調 m_voiceengine.Poll(); } } void OnApplicationPause(bool pauseStatus) { if (m_voiceengine == null) { return; } // 應用暫停時GVoice引擎也暫停,應用從新開始時引擎繼續 if (pauseStatus) { m_voiceengine.Pause(); } else { m_voiceengine.Resume(); } } /// <summary> /// 加入房間,BtnJoin按鈕點擊調用 /// </summary> public void JoinRoom() { m_voiceengine.SetMode(GCloudVoiceMode.RealTime); int ret = m_voiceengine.JoinTeamRoom(roomName, 15000); result.text += "\nJoinRoom:" + ret; } /// <summary> /// 退出房間,BtnExit按鈕點擊調用 /// </summary> public void ExitRoom() { int ret = m_voiceengine.QuitRoom(roomName, 6000); result.text += "\nExitRoom:" + ret; } /// <summary> /// 打開麥克風,BtnOpenMic按鈕點擊調用 /// </summary> public void OpenMic() { int ret = m_voiceengine.OpenMic(); result.text += "\nOpenMic:" + ret; } /// <summary> /// 關閉麥克風,BtnCloseMic按鈕點擊調用 /// </summary> public void CloseMic() { int ret = m_voiceengine.CloseMic(); result.text += "\nCloseMic:" + ret; } /// <summary> /// 打開揚聲器,BtnOpenSpeaker按鈕點擊調用 /// </summary> public void OpenSpeaker() { int ret = m_voiceengine.OpenSpeaker(); result.text += "\nOpenSpeaker:" + ret; } /// <summary> /// 關閉揚聲器,BtnCloseSpeaker按鈕點擊調用 /// </summary> public void CloseSpeaker() { int ret = m_voiceengine.CloseSpeaker(); result.text += "\nCloseSpeaker:" + ret; } /// <summary> /// 加入房間回調 /// </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> /// 退出房間回調 /// </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> /// 有成員說話時回調 /// </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對象上,而後將腳本中對應的方法註冊到對應的按鈕的OnClick事件上,保存場景,而後運行到手機上,使用兩個手機就能夠語音聊天了,效果以下圖:
按照上面的流程集成完的項目並不能在PC上運行,若是要在PC上運行不報錯,能夠將下載的 unity_demo.zip 文件解壓後的 unity_demo\Assets\Plugins
目錄下的 X86 和 x86_64 兩個文件夾拷貝到項目的 Plugins 文件夾下,這樣PC上運行就不會報錯。由於我這裏沒有麥克風設備,不知道在PC上能不能使用語音聊天,有條件的朋友能夠試試,有結果了能夠反饋給我,先謝過了!
我把項目的源碼託管在了Github上了, 有須要的朋友自取。項目連接點這裏
本文做者: Sheh偉偉
本文連接: http://davidsheh.github.io/2017/05/27/Unity3D集成騰訊語音GVoiceSDK/
版權聲明: 本博客全部文章除特別聲明外,均採用 CC BY-NC-SA 3.0 許可協議。轉載請註明出處!