gpt4 book ai didi

c# - 为什么主机玩家没有权限发送服务器[命令]?统一 - 镜子

转载 作者:行者123 更新时间:2023-12-04 09:38:04 25 4
gpt4 key购买 nike

我正在使用 Unity 2019.3.2f1 制作回合制多人游戏,并使用 Mirror 连接玩家。我的目标是将玩家对象添加到 GameMaster 脚本中(您将在我最底部的脚本中看到),以便我可以跟踪它们并在 Player 脚本中更新它们的进度。我遵循了 DapperDino 的 youtube 教程 (https://www.youtube.com/watch?v=oBRt9OifJvE&list=PLS6sInD7ThM1aUDj8lZrF4b4lpvejB2uB&index=2) 并制作了一个大厅,从教程中复制了除生成器系统之外的所有内容,并且我对场景的名称进行了调整,删除了 map 处理程序,而只有 2 个场景。 2名玩家进入大厅后,点击准备,主机点击开始,MainMenu场景切换到GameScene,游戏开始,但在此之前功能NetworkServer.ReplacePlayerForConnection(conn, gameplayerInstance.gameObject)被调用,在场景改变之前。我得到这个错误:

RemoveClientAuthority 只能在服务器上为生成的对象调用。
UnityEngine.Logger:Log(LogType, Object) Mirror.ILoggerExtensions:LogError(ILogger, Object) (at Assets/Mirror/Runtime/LogFactory.cs:58) Mirror.NetworkIdentity:RemoveClientAuthority() (at Assets/Mirror/Runtime/NetworkIdentity .cs:1230) Mirror.NetworkServer:InternalReplacePlayerForConnection(NetworkConnection, GameObject, Boolean) (at Assets/Mirror/Runtime/NetworkServer.cs:843) Mirror.NetworkServer:ReplacePlayerForConnection(NetworkConnection, GameObject, Boolean) (at Assets/Mirror/Runtime/NetworkServer.cs:680) DapperDino.Mirror.Tutorials.Lobby.NetworkManagerLobby:ServerChangeScene(String) (at Assets/Lobby/Scripts/NetworkManagerLobby.cs:181) DapperDino.Mirror.Tutorials.Lobby.NetworkManagerLobby:StartGame() (at Assets /大厅/脚本/NetworkManagerLobby.cs:163)

为什么应该调用 RemoveClientAuthority()?

然后我收到这个警告:试图在没有权限的情况下为对象发送命令。播放器.CmdAddPlayer

这是我的代码。如您所见,在更新时我检查 if(!hasAuthority),如果客户端没有,我将返回 Update 函数,但它从来没有,所以我对其进行了评论以进行调试。我得到的警告是在主机进程上,这让我感到困惑。主机不应该有权限,因为它也是服务器吗?

using System.Collections.Generic;
using UnityEngine;
using Mirror;


public class Player : NetworkBehaviour
{
GameMaster gameMaster=null;
//public NetworkManager networkManager;

public Country country;
public List<Territory> controlledTerritories;
public List<Army> armies = new List<Army>();
public int gold;
bool set = false;
void Start()
{
//networkManager = GameObject.FindWithTag("NetworkManager").GetComponent<NetworkManager>();
}
[Client]
void Update()
{
//Debug.Log(networkManager);
if (!set)
{
if (!hasAuthority)
{
//return;
}
Debug.Log("About to call CmdAddPlayer()");
//This is the furthest I get. I get the warning after trying to call CmdAddPlayer() and it isn't called
CmdAddPlayer();
}
}
[Command]
void CmdAddPlayer()
{
//Validate logic here
Debug.Log("Called CmdAddPlayer()");
RpcAddPlayer();
}

[ClientRpc]
void RpcAddPlayer()
{
Debug.Log("Called RpcPlayer()");
GameObject _mapTmp = GameObject.FindWithTag("GameController");
GameMaster _gameMasterTmp = null;
if (_mapTmp != null)
{
_gameMasterTmp = _mapTmp.GetComponent<GameMaster>();
}
if (gameMaster == null && _gameMasterTmp != null)
{
gameMaster = _gameMasterTmp;
gameMaster.players.Add(this);
set = true;
}
}
}

最佳答案

我正在学习相同的教程并遇到相同的错误。
基本上显然它与Mirror的ServerChangeScene有关。
你可以很容易地解决这个问题。在 DapperDino NetworkManagerLobby 脚本中,转到 ServerChangeScene 覆盖,并获取销毁的 reid,以便它从这里开始:

NetworkServer.Destroy(conn.identity.gameObject);     
NetworkServer.ReplacePlayerForConnection(conn, gameplayerInstance.gameObject);

以便将其更改为:
 NetworkServer.ReplacePlayerForConnection(conn, gameplayerInstance.gameObject); 

这应该解决它。房间播放器对象似乎会自动销毁。
如果这不起作用,您可以在此处找到有关错误的更多信息: https://github.com/vis2k/Mirror/issues/1593
要回答问题的后半部分,这里有一个很好的解释:
Unity3D. Trying to send command for object without authority
基本上,您可能试图从没有权限的对象发送命令。那是什么意思呢?
您只能从您的玩家对象向另一台计算机上代表您的玩家对象发送命令。
从您的代码中不清楚,但您可能是:
  • 尝试从属于其他玩家的“玩家”对象发送命令(例如,如果您要遍历游戏中的所有玩家)。
  • 或者您编写了一个名为“player”的脚本,该脚本尚未被授予权限(我怀疑是这个脚本,因为您将对象称为“播放器”而不是教程中的“NetworkGamePlayer”。

  • 如果您尝试做第一个,请确保检查播放器是否是本地播放器:
        void CallCommandMove(){
    if(!isLocalPlayer){
    return;
    }
    CmdMove();
    }
    或者,如果您尝试执行第二个操作,则需要授予您自己的玩家对象权限(如该线程中接受的答案所示: Unity3D. Trying to send command for object without authority
    最后, 最简单 学习的方法是简单地将您的代码放在 NetworkGamePlayer 脚本上。

    关于c# - 为什么主机玩家没有权限发送服务器[命令]?统一 - 镜子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62458966/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com