Unity Lobby API 学习笔记(包含构建多人游戏大厅的简单方法)

目录

概述:

1. 初始化UnityServices 使用匿名身份验证登陆

2. 创建玩家大厅

2.1 简单创建

2.2 带有操作的创建

3. 加入大厅

3.1 快速加入

3.2 一般加入

3.3 通过大厅代码加入(适用于加入私有大厅)

4.查询大厅

5. 更新大厅信息

6. 更新大厅中玩家信息

7. 删除大厅

8. 离开大厅

9. 心跳


概述:

        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);
    }
}

        完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值