本篇章记录一下Unity使用Mirror框架遇到的问题和解决方法(不断更新)
1.当开发测试中出现A客户端和B客户端操作进行同步的情况,需要注意(有没有进行isLocalPlayer是否是本地Player的判断)
这个isLocalPlaye是需要继承NetworkBehaviour这个脚本,才可以进行判断的
2.当开发中出现了同画面的情况,需要注意你的Player下面是否有相机且一直开启状态,这会导致每生成一个Player就会有镜头画面的冲突,导致会看最后一个生成Player镜头,所以解决办法如下:
重写一下刚开始加载Player的生命周期函数,这个方法也是继承于NetworkBehaviour这个脚本
3.假设你的设备采用的是WiFi连接方式(缺点IP不是固定的,客户端连接不知道连接哪个IP?),想要快速做出功能 可以采用我这种方式,
Mirror框架有一个脚本NetworkDiscoveryHUD,没错挂载到My_NetworkManager共同的物体上(挂载的时候会有个绑定脚本NetworkDiscovery我们也是需要的),然后重点来了!!!修改这个NetworkDiscoveryHUD脚本,添加两个方法如下:
/// <summary>
/// 查找开启的服务端
/// </summary>
public void My_FindServers()
{
discoveredServers.Clear();
networkDiscovery.StartDiscovery();
Debug.Log($"Discovered Servers [{discoveredServers.Count}]:");
foreach (ServerResponse info in discoveredServers.Values)
{
Debug.Log("IP_URL"+info.uri.ToString());
Connect(info);
Debug.Log("循环");
}
}
/// <summary>
/// 开启服务端和一个客户端
/// </summary>
public void My_StartHost()
{
discoveredServers.Clear();
NetworkManager.singleton.StartHost();
networkDiscovery.AdvertiseServer();
}
然后在自己写的脚本中去调用这两个方法,如下:
using Mirror;
using Mirror.Discovery;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class My_NetworkManager : MonoBehaviour
{
NetworkManager manager;
NetworkDiscoveryHUD networkDiscoveryHUD;
public Text text;
public Button button_StartHost, button_StartClient;
void Awake()
{
manager = GetComponent<NetworkManager>();
networkDiscoveryHUD = GetComponent<NetworkDiscoveryHUD>();
}
private void Start()
{
button_StartHost.onClick.AddListener(Button_StartHostEvent);
button_StartClient.onClick.AddListener(Button_StartClientEvent);
}
private void Button_StartHostEvent()
{
// manager.StartHost();
networkDiscoveryHUD.My_StartHost();
text.text = "服务端+客户端";
button_StartHost.gameObject.SetActive(false);
button_StartClient.gameObject.SetActive(false);
}
private void Button_StartClientEvent()
{
// manager.StartClient();
networkDiscoveryHUD.My_FindServers();
text.text = "客户端";
button_StartHost.gameObject.SetActive(false);
button_StartClient.gameObject.SetActive(false);
}
}
调用完成之后,回到HUD的脚本别忘了注释掉这个If判断
当然不想要OnGUI的界面按钮,可以直接GUILayout.BeginArea(new Rect(0, 0, 0, 0));或者去掉都行…
这边我自己的脚本就有两个选项,服务端+客户端和客户端,你们可以根据情况安排修改(有什么不懂的可以在评论区提问)…
目前遇到这些,后续再更新…