游戏已经不单单是一种娱乐方式。
关注【融云全球互联网通信云】了解更多
作为离元宇宙最近的赛道,游戏不仅是各种沉浸式体验类技术落地融合的首发场景,也是创作者经济爆发的热土。
移动游戏在人们的线上消费方面势头强劲,根据 data.ai 的《2022 年移动游戏报告》,2021 年移动游戏用户支出达到了 1,160 亿美元,并保持相当的增速。2022 年第一季度约为 220 亿美元,相较 2020 年第一季度增长了 42%。
(移动游戏用户支出持续增长)
与消费者趋势相吻合,游戏下载量稳居第一,其中,休闲游戏的表现尤为惊人,游戏玩家下载休闲游戏的数量是 2018 年的 5.5 倍左右。
游戏产品在细分品类上愈加多元化发展,创新型玩法与垂直赛道的机会开始增多。而 Unity 是游戏开发者无法绕开的入局钥匙。
游戏和社交深度融合发展的当下,游戏社交化作为提高游戏粘性、提升用户留存的重要手段被广泛应用于所有游戏类别中。
近日,融云 Unity SDK5.1 正式发布,专注游戏场景,方便开发者快速在游戏中接入即时通讯和实时音视频功能。
融云 Unity SDK介绍及适用范围
融云 Unity SDK 特点:
① 跨平台,一次编写多平台运行。节省人力成本,便于维护。
② 支持 Raw Image 和 MeshRender 渲染方式,可以自由选择在 UGUI 或任意 3D 场景中进行视频渲染。
③ 简单清晰的接口设计,30 秒即可快速接入,接入代码不超过 15 行。
④ 版本兼容性强,支持绝大部分 Unity 版本。
⑤ 多场景支持,基于个性化的场景,选择适用的 SDK,音视频、纯音频 SDK 任你选择。
适用游戏及其特点:
麻将、五子棋、跳棋、斗兽棋等几乎所有棋牌类游戏,一站到底、桌球、连连看等几乎所有休闲益智类游戏,均可通过接入融云 SDK 获得通信能力加持,为玩家提供高质量、低延迟的交互体验。它们在通信方面的场景特点为:
① 游戏时只有一个 RTC 房间,所有人员都在同一个房间内;
② 玩家默认都订阅其他人的音频;
③ 玩家不能控制其他玩家的麦克风开关,只能关闭自己的麦克风;
④ 玩家可以选择性收听某些玩家的音频,对于不友善的音频可以选择针对性屏蔽。
游戏中的通信方式:
① IM:单聊、聊天室;文字消息、表情、emoji 等。在游戏过程中的发送消息逻辑为:
- 匹配到对手之后,将本方玩家和对方玩家都加入到同一个聊天室内;
- 游戏中,聊天室处于保活状态,游戏结束后将本方玩家和对方玩家都踢出房间,且销毁房间(若直接再来一局则不算游戏结束)。
② RTC:1V1 语音;随机匹配,邀请好友等。游戏过程中的语音逻辑为:
- 匹配到对手后,将本方玩家和对方玩家加入同⼀个 RTC 房间,默认打开麦克风和听筒/扬声器;
- 本方玩家可以关闭自己的⻨克风,对方将听不到本方发言;
- 本方玩家可以关闭自己的听筒/扬声器,自己将听不到对方的发言;
- 游戏结束后,默认通话结束,将本方玩家和对方玩家都踢出房间,且销毁房间(若直接再来一局则不算游戏结束)。
融云 Unity SDK接入方式及相关接口
融云 Unity SDK 接入方式:
① 直接集成融云的 Unity RTCLib SDK、 Unity IMLib SDK到游戏项目中,Android 和 iOS 可以直接调用 SDK 封装的 Unity 的接口实现游戏内消息、语音需求;
② 分别集成融云的 iOS 端和 Android 端的原生IMLib SDK、 RTCLib SDK,在实现游戏内消息、语音时,iOS 端和 Android 端需要分别调用各自的 IMLib SDK、RTCLib SDK 接口来实现。
涉及接口:
① 创建聊天室
如果聊天室未创建,SDK 会创建聊天室并加入,如果已创建,则直接加入。
// 创建聊天室
String chatRoomId = "聊天室 ID";
int defMessageCount = 50;
RCIMClient.Instance.JoinChatRoom(chatRoomId, (RCErrorCode code) => {
// code : 错误码
}, defMessageCount);
② 加入已创建的聊天室
// 加入聊天室
String chatroomId = "聊天室 ID";
int defMessageCount = 50;
RCIMClient.Instance.JoinExistChatRoom(chatroomId, (RCErrorCode code) => {
// code : 错误码
}, defMessageCount);
③ 获取聊天室历史消息
// 获取聊天室历史消息
var conversationType = RCConversationType.ChatRoom;
int lastMessageId = -1;
final int count = 10;
final String targetId = "聊天室 ID";
final long recordTime = 0;
// 首先加载本地聊天室消息
var localMsgList = await RCIMClient.Instance.GetHistoryMessages(conversationType, targetId, lastMessageId, count);
if (localMsgList != null) {
// 展示本地聊天室消息
recordTime = localMsgList.Last().SentTime;
}
// 本地消息加载完毕,再获取远端服务器消息
RCIMClient.Instance.GetChatRoomHistoryMessages(targetId, recordTime, count, true,
(code, chatRoomHistoryMessages) => {
// code: 状态码,0 成功
// chatRoomHistoryMessages: 聊天室远端历史消息
});
④ 获取聊天室属性
// 获取聊天室属性
String chatRoomId = "聊天室 ID";
RCIMClient.Instance.GetChatRoomAllEntries(chatRoomId,
(RCErrorCode code, IDictionary entries) {
// entries: 聊天室属性
// code: 状态码,0 成功
});
⑤ 设置聊天室属性
// 设置聊天室属性
String chatRoomId = "聊天室 ID";
String key = "name";
String value = "融融";
bool sendNotification = true;
bool isAutoDel = false;
String notificationExtra = "通知消息扩展";
RCIMClient.Instance.ForceSetChatRoomEntry(chatRoomId, key, value, sendNotification, isAutoDel, notificationExtra, (code) => {
// code: 状态码,0 成功
});
⑥ 删除聊天室属性
// 订阅⽤户
int Subscribe(String userId, RCRTCMediaType type);
int Subscribe(IList userIds, RCRTCMediaType type);
⑦ 退出聊天室属性
// 退出聊天室
String chatroomId = "聊天室 ID";
RCIMClient.Instance.QuitChatRoom(chatroomId, (RCErrorCode code) => {
// code: 错误码
});
⑧ 加入房间
// 加⼊RTC房间
RCRTCRoomSetup setup = RCRTCRoomSetup.Builder.Create().WithRole(RCRTCRole.LIVE_BROADCASTER).Build();
Engine.JoinRoom(RoomId, setup);
⑨ 麦克风控制
主播可以在房间内打开或关闭本端麦克风
// 是否启⽤⻨克⻛
int EnableMicrophone(bool enable);
⑩ 扬声器控制
主播可以在房间切换声音的播放设置,扬声器或听筒。接入外设时调用此方法,如蓝牙音箱等返回 -1。
// 是否启⽤扬声器
int EnableSpeaker(bool enable);
⑪ 发布本地音频
加入 RTC 房间成功后,发布本地音频
Engine.Publish(RCRTCMediaType.AUDIO);
⑫ 取消发布本地音频
Engine.Unpublish(RCRTCMediaType.AUDIO);
⑬ 订阅用户
// 订阅⽤户
int Subscribe(String userId, RCRTCMediaType type);
int Subscribe(IList userIds, RCRTCMediaType type);
⑭ 取消订阅用户
// 取消订阅⽤户
int Unsubscribe(String userId, RCRTCMediaType type);
int Unsubscribe(IList userIds, RCRTCMediaType type);
⑮ 离开房间
Engine.LeaveRoom();