2025-01-25 04:38:09 +08:00

328 lines
9.8 KiB
C#

using Thousandto.Code.Center;
using Thousandto.Code.Global;
using Thousandto.CoreSDK;
using Thousandto.CoreSDK.Event;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EventManager = UnityEngine.Gonbest.MagicCube.EventManager;
using EventSystemHandler = UnityEngine.Gonbest.MagicCube.EventSystemHandler;
using JSONData = UnityEngine.Gonbest.MagicCube.JSONData;
using EventConstDefine = UnityEngine.Gonbest.MagicCube.EventConstDefine;
using JSONArray = UnityEngine.Gonbest.MagicCube.JSONArray;
namespace Thousandto.Code.Logic
{
//基础协议
public class BaseVoiceLogic
{
#region//静态变量
//当前激活的逻辑
public static BaseVoiceLogic ActiveVoiceLogic = null;
//玩家控制是否可以说话 --
private static bool _userIsMute = false;
#endregion
#region//私有变量
private ulong _id = 0;
//通道ID
private string _channelID = string.Empty;
//系统控制是否说话
private bool _systemIsMute = true;
//所有玩家
private List<string> _allUsers = new List<string>();
//玩家数量
private int _userCount = 0;
//是否激活
private bool _isInRoom = false;
#endregion
#region
//当前频道类型
public VoiceChannel Channel { get; protected set; }
//当前频道ID
public ulong ID {
get { return _id; }
protected set {
if (_id != value)
{
_id = value;
_channelID = string.Format(Channel.ToString() + "_" + _id);
}
}
}
//当前频道所有玩家的列表
public List<string> AllUsers
{
get
{
return _allUsers;
}
}
//玩家数量
public int UserCount
{
get
{
return _userCount;
}
}
//是否被激活
public bool IsActived
{
get
{
return _isInRoom;
}
}
//系统控制是否静音
public bool SystemIsMute
{
get
{
return _systemIsMute;
}
set
{
if (_systemIsMute != value)
{
_systemIsMute = value;
OnMuteChanged();
}
}
}
//玩家自定义是否静音
public bool UserIsMute
{
get
{
return _userIsMute;
}
set
{
if (_userIsMute != value)
{
_userIsMute = value;
OnMuteChanged();
}
}
}
#endregion
#region//公共方法
protected BaseVoiceLogic(VoiceChannel channel)
{
Channel = channel;
}
public void Initialize()
{
//注册玩家信息改变的消息
EventManager.SharedInstance.RegFixEventHandle(SDKEventDefine.SDK_VOICE_ENTER, OnUserEnterSuccessCallBack);
EventManager.SharedInstance.RegFixEventHandle(SDKEventDefine.SDK_VOICE_ROOM_ENTER_FAIL, OnUserEnterFailCallBack);
EventManager.SharedInstance.RegFixEventHandle(SDKEventDefine.SDK_VOICE_ROOM_PERSON_NUM, OnUserListChangedCallBack);
EventManager.SharedInstance.RegFixEventHandle(SDKEventDefine.SDK_VOICE_EXIT, OnUserExitCallBack);
OnInitialize();
}
public void Uninitialize()
{
//卸载玩家信息改变的消息
EventManager.SharedInstance.UnRegFixEventHandle(SDKEventDefine.SDK_VOICE_ENTER, OnUserEnterSuccessCallBack);
EventManager.SharedInstance.UnRegFixEventHandle(SDKEventDefine.SDK_VOICE_ROOM_ENTER_FAIL, OnUserEnterFailCallBack);
EventManager.SharedInstance.UnRegFixEventHandle(SDKEventDefine.SDK_VOICE_ROOM_PERSON_NUM, OnUserListChangedCallBack);
EventManager.SharedInstance.UnRegFixEventHandle(SDKEventDefine.SDK_VOICE_EXIT, OnUserExitCallBack);
Exit();
ClearUsers();
SystemIsMute = true;
OnUninitialize();
}
public void Enter()
{
if (ActiveVoiceLogic != null)
{
ActiveVoiceLogic.Exit();
}
if (OnEnter())
{
ActiveVoiceLogic = this;
}
else
{
ActiveVoiceLogic = null;
}
}
public void Exit()
{
OnExit();
ActiveVoiceLogic = null;
}
#endregion
#region//保护类型--用于子类调用
protected void EnterOfSDK()
{
//FuncellThirdVoiceSDK.Instance.JoinVoiceRoom(LocalPlayerRoot.LocalPlayerID.ToString(), _channelID, "1", "0");
}
protected void ExitOfSDK()
{
//FuncellThirdVoiceSDK.Instance.LeaveRoom();
}
public void QueryUserListOfSDK()
{
//var obj = FuncellThirdVoiceSDK.Instance.CallQueryUserList(_channelID);
//ParseUserListJson(obj as string);
}
protected void ClearUsers()
{
_allUsers.Clear();
_userCount = 0;
//ToDo:这里需要发送一个用户数量改变的消息
GameCenter.EventManager.PushFixEvent((int)LogicEventDefine.EID_EVENT_VOICE_MEMBERINFO_CHANGED,this);
}
#endregion
#region//子类继承,重写
protected virtual void OnInitialize()
{
}
protected virtual void OnUninitialize()
{
}
protected virtual bool OnEnter()
{
return true;
}
protected virtual bool OnExit()
{
return true;
}
#endregion
#region//私有方法
//玩家进入房间的回调
private void OnUserEnterSuccessCallBack(object obj,object sender)
{
string[] arr = obj as string[];
if (arr[0] == _channelID && ActiveVoiceLogic == this)
{
_isInRoom = true;
OnMuteChanged();//在进入房间之后进行设置
//FuncellThirdVoiceSDK.Instance.CallQueryUserList(arr[0]);
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_VOICE_CHANNEL_CHANGED);
}
}
private void OnUserEnterFailCallBack(object obj, object sender)
{
string[] arr = obj as string[];
if (arr[0] == _channelID && ActiveVoiceLogic == this)
{
_isInRoom = false;
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_VOICE_CHANNEL_CHANGED);
}
}
private void OnUserExitCallBack(object obj, object sender)
{
//退出不做处理
_isInRoom = false;
_id = 0;
_channelID = string.Empty;
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_VOICE_CHANNEL_CHANGED);
}
//当用户列表改变的时候
private void OnUserListChangedCallBack(object obj, object sender)
{
object[] arr = obj as object[];
if (arr != null && arr.Length >= 3)
{
var id = (string)arr[0];
if (id == _channelID)
{
var users = arr[1] as JSONArray;
var status = (int)arr[2];
if (status == 0)
{//等于0表示是返回全部
_allUsers.Clear();
}
if (status <= 1)
{//1是返回进入的用户列表
for (int i = 0; i < users.Count; i++)
{
_allUsers.Add(users[i]);
}
}
else
{//2返回的是退出的用户列表
for (int i = 0; i < users.Count; i++)
{
_allUsers.Remove(users[i]);
}
}
_userCount = _allUsers.Count;
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_VOICE_MEMBERINFO_CHANGED);
}
}
else
{
//UnityEngine.Debug.LogError("OnUserListChangedCallBack:返回的obj参数不对." + (arr == null ? "arr == NULL" :("arr.length == "+arr.Length.ToString())));
}
}
//当已经设置改变的时候调用
private void OnMuteChanged()
{
if (_isInRoom)
{
//发送给SDK用来设置自己可以说话.
//FuncellThirdVoiceSDK.Instance.SetMicrophoneMute(SystemIsMute || UserIsMute);
}
}
//解释用户列表的json串
private void ParseUserListJson(string jsonText)
{
if (jsonText == null)
{
//UnityEngine.Debug.LogError("request voice room member list fail !!!!");
return;
}
JSONData json = new JSONData(jsonText);
if (json == null || json.Count == 0) return;
_userCount = json.Count;
//ToDo:这里需要发送一个用户数量改变的消息
GameCenter.EventManager.PushFixEvent((int)LogicEventDefine.EID_EVENT_VOICE_MEMBERINFO_CHANGED, this);
}
#endregion
}
}