目录
1. 初始化UnityServices 使用匿名身份验证登陆
概述:
Unity Lobby 服务为玩家提供了一种发现和连接其他玩家的方式,以实现各种多人游戏场景。Lobby API帮助开发者快速构建一个多人游戏大厅。以下是构建大厅的一些常用方法:
1. 初始化UnityServices 使用匿名身份验证登陆
private async void InitializeAuthentication()
{
InitializationOptions initializationOptions = new InitializationOptions();
initializationOptions.SetProfile(UnityEngine.Random.Range(0,1000).ToString());
try
{
await UnityServices.InitializeAsync(initializationOptions);//UnityServices初始化
AuthenticationService.Instance.SignedIn += () =>
{
//...
Debug.Log(AuthenticationService.Instance.PlayerId);
//...
};
await AuthenticationService.Instance.SignInAnonymouslyAsync();//匿名身份验证登陆
}
catch(AuthenticationException e)
{
Debug.Log(e);
}
}
2. 创建玩家大厅
2.1 简单创建
private Lobby joinedLobby;//缓存创建的大厅
private const int MAX_PLAYER_AMOUNT = 4;//大厅最大玩家数量
public async void CreateLobby(string lobbyName)
{
try
{
joinedLobby = await LobbyService.Instance.CreateLobbyAsync(lobbyName,
MAX_PLAYER_AMOUNT);
}
catch(LobbyServiceException e)
{
Debug.Log(e);
}
}
2.2 带有操作的创建
private const string PLAYER_NAME = "PlayerName";
private Player GetPlayer(string playerName)
{
return new Player()
{
Data = new System.Collections.Generic.Dictionary<string, PlayerDataObject>()
{
{
PLAYER_NAME,new PlayerDataObject
(
PlayerDataObject.VisibilityOptions.Member,
playerName
)
}
}//玩家数据,可以储存名字等信息
};
}
private const string GAME_MODE = "GameMode";
public async void CreateLobby(string lobbyName,bool isPrivate)
{
CreateLobbyOptions createLobbyOptions = new CreateLobbyOptions()
{
IsPrivate = isPrivate,//设置大厅是否私有
Player = GetPlayer("lllllllc__"),//创建大厅时Host玩家信息
Data = new System.Collections.Generic.Dictionary<string, DataObject>()
{
{ GAME_MODE,
new DataObject
(
DataObject.VisibilityOptions.Public,
"Complete Goal"
)
}
}//设置大厅数据,可以储存大厅模式等信息
//Password 设置大厅密码
//IsLocked 设置大厅是否锁定
};
try
{
joinedLobby = await LobbyService.Instance.CreateLobbyAsync
(
lobbyName,
MAX_PLAYER_AMOUNT,
createLobbyOptions
);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
3. 加入大厅
3.1 快速加入
private Lobby joinedLobby;
public async void QuickJoinLobby()
{
QuickJoinLobbyOptions quickJoinLobbyOptions = new QuickJoinLobbyOptions()
{
Filter = new System.Collections.Generic.List<QueryFilter>()
{
new QueryFilter
(
QueryFilter.FieldOptions.AvailableSlots,
"1",
QueryFilter.OpOptions.GE
)
},//过滤加入的大厅操作
Player = GetPlayer("Player" + UnityEngine.Random.Range(100,999)),
//为加入的player设置一个随机名字
};
try
{
joinedLobby = await LobbyService.Instance.QuickJoinLobbyAsync
(
quickJoinLobbyOptions
);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
3.2 一般加入
private Lobby joinedLobby;
public async void JoinLobby(string playerName)
{
JoinLobbyByIdOptions joinLobbyByIdOptions = new JoinLobbyByIdOptions()
{
Player = GetPlayer(playerName),//为加入的player设置一个名字
//Password 提交大厅密码
};
try
{
joinedLobby = await LobbyService.Instance.JoinLobbyByIdAsync
(
joinedLobby.Id,
joinLobbyByIdOptions
);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
3.3 通过大厅代码加入(适用于加入私有大厅)
public async void JoinLobby(string lobbyCode,string playerName)
{
JoinLobbyByCodeOptions joinLobbyByCodeOptions = new JoinLobbyByCodeOptions()
{
Player = GetPlayer(playerName),//为加入的player设置一个名字
//Password 提交大厅密码
};
try
{
joinedLobby = await LobbyService.Instance.JoinLobbyByCodeAsync
(
lobbyCode,
joinLobbyByCodeOptions
);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
4.查询大厅
List<Lobby> lobbies;//缓存查询到的大厅
public async void ListLobbies()
{
QueryLobbiesOptions queryLobbiesOptions = new QueryLobbiesOptions()
{
Count = 10,//单次查询大厅的数量
Filters = new List<QueryFilter>()
{
new QueryFilter
(
QueryFilter.FieldOptions.AvailableSlots,
"0",
QueryFilter.OpOptions.GT
)//过滤可用位置大于0的大厅
},
Order = new List<QueryOrder>()
{
new QueryOrder
(
true,//不做设置则默认降序
QueryOrder.FieldOptions.AvailableSlots
)//按大厅可用位置升序排序
}
};
try
{
QueryResponse queryResponse = await Lobbies.Instance.QueryLobbiesAsync
(
queryLobbiesOptions
);
lobbies = queryResponse.Results;
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
5. 更新大厅信息
public async void UpdateLobby()
{
UpdateLobbyOptions updateLobbyOptions = new UpdateLobbyOptions()
{
Name = "NewLobbyName",//更改大厅名字
MaxPlayers = 1,//最大玩家数
IsPrivate = true,//是否私有
//IsLocked 是否锁定
//HostId 更换主机玩家id
Data = new Dictionary<string, DataObject>()
{
{
GAME_MODE,
new DataObject
(
DataObject.VisibilityOptions.Public,
"New GameMode"
)
}
}//更新大厅存入的数据
};
try
{
joinedLobby = await LobbyService.Instance.UpdateLobbyAsync
(
joinedLobby.Id,
updateLobbyOptions
);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
6. 更新大厅中玩家信息
public async void UpdatePlayer()
{
UpdatePlayerOptions updatePlayerOptions = new UpdatePlayerOptions()
{
Data = new Dictionary<string, PlayerDataObject>
{
{
PLAYER_NAME,
new PlayerDataObject
(
PlayerDataObject.VisibilityOptions.Member,
"newPlayerName"
)
}
}
};
try
{
joinedLobby = await LobbyService.Instance.UpdatePlayerAsync
(
joinedLobby.Id,
AuthenticationService.Instance.PlayerId,
updatePlayerOptions
);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
7. 删除大厅
public async void DeleteLobby()
{
try
{
await LobbyService.Instance.DeleteLobbyAsync(joinedLobby.Id);
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
8. 离开大厅
public async void LeaveLobby()
{
try
{
await LobbyService.Instance.RemovePlayerAsync
(
joinedLobby.Id,
AuthenticationService.Instance.PlayerId
);
joinedLobby = null;
}
catch (LobbyServiceException e)
{
Debug.Log(e);
}
}
9. 心跳
大厅默认活动时间为1分钟,1分钟内无玩家加入就自动休眠,因此需定时向大厅发送心跳。
private float heartbeatTimer = 20f;
private float heartbeatTimerMax = 20f;
private void HandleHeartbeat()//在Update()或协程中执行
{
heartbeatTimer -= Time.deltaTime;
if(heartbeatTimer < 0f)
{
heartbeatTimer = heartbeatTimerMax;
LobbyService.Instance.SendHeartbeatPingAsync(joinedLobby.Id);
}
}
完。