2017-09-11 13 views
2

基本的に、私がやりたいことは、ボタンを押したときにユーザーを切断することだけです。 NetworkManager.singleton.StopClient()を追加しました。私のcustomNetworkManagerスクリプトのNetworkManagerクラスから継承した関数です。 しかし、私はプレーヤーを切断するためにボタンを押すたびに、団結が反応しなくなります。Unity Networking:NetworkManager.singleton.StopClient()関数を呼び出すとUnityがクラッシュする

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

} 

答えて

0

は、私はちょうどこの問題に遭遇したと全く答えがなかった失望した: 誰かが私のスクリプトです

だからここに関数の実行中に多分ユニットは、whileループで立ち往生することを別のポストにしました。私はホスティング中に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(); 
} 
関連する問題