因此,基本上,我要做的就是在用户按下按钮时断开其连接。
我添加了NetworkManager.singleton.StopClient();我的customNetworkManager脚本上的函数,该脚本继承自NetworkManager类。
但是,只要我按下按钮断开播放器的连接,团结就会停止响应。
有人在另一篇文章中说,执行功能时,单元可能会陷入while循环中
所以这是我的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.Match;
using UnityEngine.UI;
public class customNetworkManager : NetworkManager {
UIManager UImanager;
void Start()
{
UImanager = gameObject.GetComponent<UIManager> ();
}
public void SelectedWan(){
NetworkManager.singleton.StartMatchMaker();
UImanager.showWAN ();
}
public void StartHost()
{
Setport ();
NetworkManager.singleton.StartHost ();
UImanager.showGameOn ();
UImanager.showIPAddress ();
}
public void JoinGame()
{
string ip = GameObject.Find ("ipfield").transform.Find ("Text").GetComponent<Text> ().text;
if (ip == "")
return;
setip (ip);
Setport ();
NetworkManager.singleton.StartClient ();
UImanager.showGameOn ();
}
//call this method to request a match to be created on the server
public void CreateInternetMatch()
{
string matchName= GameObject.Find ("roomName").transform.Find ("Text").GetComponent<Text> ().text;
if (matchName == "")
return;
NetworkManager.singleton.matchMaker.CreateMatch(matchName, 2, true, "", "", "", 0, 0, OnInternetMatchCreate);
}
public void FindInternetMatch()
{
string matchName= GameObject.Find ("roomName").transform.Find ("Text").GetComponent<Text> ().text;
if (matchName == "")
return;
NetworkManager.singleton.matchMaker.ListMatches(0, 10, matchName, true, 0, 0, OnInternetMatchList);
}
private void OnInternetMatchCreate(bool success, string extendedInfo, MatchInfo matchInfo)
{
if (success)
{
//Debug.Log("Create match succeeded");
MatchInfo hostInfo = matchInfo;
NetworkServer.Listen(hostInfo, 9000);
NetworkManager.singleton.StartHost(hostInfo);
UImanager.showGameOn ();
}
else
{
Debug.LogError("Create match failed");
}
}
public void disconnect(){
Network.Disconnect ();
if (GameObject.FindGameObjectWithTag ("localPlayer").GetComponent<WizardScriptNet> ().isServer) {
print ("host");
NetworkManager.singleton.StopHost();
} else {
print ("client");
NetworkManager.singleton.StopClient();
}
}
//call this method to find a match through the matchmaker
//this method is called when a list of matches is returned
private void OnInternetMatchList(bool success, string extendedInfo, List<MatchInfoSnapshot> matches)
{
if (success)
{
if (matches.Count != 0)
{
//Debug.Log("A list of matches was returned");
//join the last server (just in case there are two...)
NetworkManager.singleton.matchMaker.JoinMatch(matches[matches.Count - 1].networkId, "", "", "", 0, 0, OnJoinInternetMatch);
}
else
{
Debug.Log("No matches in requested room!");
}
}
else
{
Debug.LogError("Couldn't connect to match maker");
}
}
//this method is called when your request to join a match is returned
private void OnJoinInternetMatch(bool success, string extendedInfo, MatchInfo matchInfo)
{
if (success)
{
//Debug.Log("Able to join a match");
MatchInfo hostInfo = matchInfo;
NetworkManager.singleton.StartClient(hostInfo);
UImanager.showGameOn ();
}
else
{
Debug.LogError("Join match failed");
}
}
void Setport ()
{
NetworkManager.singleton.networkPort = 7777;
}
void setip(string Address)
{
NetworkManager.singleton.networkAddress = Address;
}
}
最佳答案
我只是遇到了这个问题,很失望没有答案。我发现,由于尝试在托管时调用StopClient(),因此需要调用StopHost()。
我创建了这个小块来调用适当的函数,具体取决于我是主机,服务器还是客户端:
NetworkIdentity networkIdentity = GetComponent<NetworkIdentity>();
NetworkManager networkManager = NetworkManager.singleton;
if (networkIdentity.isServer && networkIdentity.isClient) {
networkManager.StopHost ();
} else if (networkIdentity.isServer) {
networkManager.StopServer();
} else {
networkManager.StopClient();
}
关于c# - Unity网络:当我调用NetworkManager.singleton.StopClient()函数时,Unity崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46162692/