天天看點

Unity3D內建騰訊語音GVoice SDK

友情提示:最近發現騰訊GVoice有另一個官網,叫做騰訊遊戲服務,經過對比發現這個網站才是最新的,下面我介紹的那個估計是已經廢棄的,但不知道為啥老的網站沒有直接連結到新網址而是仍然保留了。不過新官網的文檔更加詳細,SDK也有所更新,是以建議去新官網下載下傳SDK和Demo,接入流程基本沒有啥大變化。

簡述

我們項目中用到了實時語音功能,在最初語音 SDK 技術選型的時候測試過融雲、聲網和騰訊的 GVoice 。融雲和聲網我都在我們項目中使用過,但是效果都不如王者榮耀遊戲中的實時語音效果,這兩天好好研究了一下騰訊的 GVoice,終于成功內建。由于騰訊 GVoice 官網的接入流程并不是很詳細,如果隻懂 Unity3D 不懂 Android 基礎知識的朋友,可能接入過程不會一帆風順。我雖了解一點點 Android 基礎,但仍趟過了好幾個坑,下面我就分享一下我在 Android 平台接入 GVoice 的過程。

資源準備

進入騰訊GVoice官網下載下傳 GVoice SDK 和 Unity3D Demo。如下圖:

接入流程

1. 導入SDK

先建立一個空的 Unity 項目 GVoiceDemo,按照官網的接入流程,我們直接将下載下傳的SDK壓縮包解壓後将其中的 Plugins 和 Scripts 兩個檔案夾都拷貝到 Unity 項目中。

2. 建立 Jar 包

将Unity項目導出成安卓項目,導出路徑選擇某個指定的檔案夾,我這裡在桌面建立了一個叫 unity_gvoicedemo 的檔案夾,将項目導出到該檔案夾中,操作如下圖:

導出成功後會生成 GCloudVoice 和 GVoiceDemo 兩個檔案夾,用 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 檔案。

3. 導入其他檔案

将下載下傳的 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"

注意:AndroidManifest.xml 檔案中的入口 Activity 的名字必須和建立的 Jar 包中的建立的 Activity 名字保持一緻。這裡的入口 Activity 叫 MainActivity,是以 AndroidManifest.xml 檔案中的代碼為

android:name=".MainActivity"

,當然也可以寫成

android:name="com.example.gcloudu3ddemo.MainActivity"

4. 建構Unity場景

這裡我用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 許可協定。轉載請注明出處!

作者:Sheh偉偉

出處:http://www.cnblogs.com/davidsheh/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.

繼續閱讀