光子螺栓 |创建后将房间设为私有

Photon Bolt | Make room private after creation

我知道如何私下玩游戏。

BoltLauncher.StartSinglePlayer

但是这次不是离线玩游戏,我想知道的是如何将房间设为私有,这样就没有更多的玩家可以加入了。

我将 IsOpen 设置为 false 并在玩家需要时将其保密,但其他客户可以加入房间。

有谁知道当服务器所有者想要时如何设置私有?

将接受模式设置为手动。

覆盖 ConnectRequest 以检查您必须跟踪的任何变量是否会话应该是私有的,如果它应该是私有的,或者如果连接应该被允许,则调用 BoltNetwork.RefuseBoltNetwork.Accept:

private bool serverShouldBePrivateNow; 

// ...

public override void ConnectRequest(UdpEndPoint endpoint, Bolt.IProtocolToken token) {
    bool connectionShouldBeRejected = false;

    connectionShouldBeRejected = connectionShouldBeRejected || serverShouldBePrivateNow;

    // any other appropriate checks go here
    // connectionShouldBeRejected = connectionShouldBeRejected || ...; 
    // connectionShouldBeRejected = connectionShouldBeRejected || ...; 
    // connectionShouldBeRejected = connectionShouldBeRejected || ...; 
   
    if (connectionShouldBeRejected)
    {
        BoltNetwork.Refuse(endpoint);
    }
    else
    {
        BoltNetwork.Accept(endpoint);
    }
}

如果您需要 return 向客户端发送数据(例如连接被拒绝的确切原因的解释),您可以使用 BoltNetwork.Refuse(UdpEndPoint endpoint, IProtocolToken refuseToken);:

以令牌响应
  1. 定义一个 IProtocolToken:
using UdpKit;

public class RequestToken : Bolt.IProtocolToken
{
    public enum RefuseReason {privateReason1, privateReason2}

    // other reasons go here 
    public RefuseReason reason { get; set; }

    public void Read(UdpPacket packet)
    {
        this.reason = (RefuseReason)packet.ReadInt();
    }

    public void Write(UdpPacket packet)
    {
        packet.WriteInt((int)this.reason);
    }
}
  1. ConnectRequest中的服务器代码上使用它:
public override void ConnectRequest(UdpEndPoint endpoint, Bolt.IProtocolToken token) {
    bool connectionShouldBeRejected = false;

    connectionShouldBeRejected = connectionShouldBeRejected || serverShouldBePrivateNow;

    if (connectionShouldBeRejected)
    {
        RequestToken token = new RequestToken();
        if (serverShouldBePrivateNow)
        { 
            token.reason = RequestToken.RefuseReason.privateReason1;
        } 
        else 
        {
            token.reason = RequestToken.RefuseReason.privateReason2;
        }

        BoltNetwork.Refuse(endpoint, token);
    }
    else
    {
        BoltNetwork.Accept(endpoint);
    }
} 
  1. void ConnectRefused(UdpEndPoint endpoint, Bolt.IProtocolToken token)中的客户端代码中查看:
public override void ConnectRefused(UdpEndpoint endpoint, Bolt.IProtocolToken token)
{
    Debug.Assert(token is RequestToken);
    RequestToken reqTok = (RequestToken)token;

    switch (token.reason)
    {
    case RequestToken.RefuseReason.privateReason1:
        // handle private Reason 1 
        break;
    case RequestToken.RefuseReason.privateReason2:
        // handle private Reason 2
        break;
    default:
        // handle error in packet
        Debug.Assert(false, "Undefined value for enum"); 
    }
}

有关详细信息,请参阅 Accepting and Refusing Connections on the Bolt wiki