2014-02-26 110 views
1

我有一個Player類,它存儲玩家的信息。Unity3D網絡請求流程

public class Player { 
    private string player_id; 

    public static void NewPlayer(string name) { 
    Debug.Log("NewPlayer"); 
    Player p = new Player(); 
    p.player_id = "123"; 
    p.register(); 
    } 

    private void register() { 
    WWWForm form = new WWWForm(); 
    form.AddField("mode", "register"); 
    form.AddField("player_id", this.player_id); 
    NetworkManager nm = NetworkManager.instance; 
    nm.OnFinish += HandleOnFinish; 
    nm.Push (new NetworkManager.Request(NetworkManager.API_URL, HandleFinishNetwork, form)); 
    nm.Execute(); 
    } 

    void HandleFinishNetwork(WWW www) { 
    if(www.text == "OK") { 
     Debug.Log("Registration OK"); 
     // *** what should I put here to return the Player object to the scene? *** 
    } else { 
     Debug.Log("Unexpected Data Returned: " + www.text); 
    } 
    } 
} 

其中NetworkManager是延伸MonoBehaviourSystem.IDisposable和一個類。當NetworkManager完成網絡操作時,將在Player類中調用OnFinish事件。

我有一個Unity場景,它有一個GUI按鈕,觸發Player.NewPlayer("MyName")。當註冊成功時,我怎樣才能將Player對象返回到場景?

回答

2

這要看你要什麼用的播放器或者你如何去操縱它做的,但一個好的解決方法是使用一個委託當玩家註冊到執行,就像這樣:

public class Player { 
    private string player_id; 
    private Action<Player> onPlayerRegistered; 

    public static void NewPlayer(string name, Action<Player> onPlayerRegistered) { 
    Debug.Log("NewPlayer"); 
    Player p = new Player(); 
    p.player_id = "123"; 
    p.onPlayerRegistered = onPlayerRegistered; 
    p.register(); 
    } 

    // ... 

    void HandleFinishNetwork(WWW www) { 
    if(www.text == "OK") { 
     Debug.Log("Registration OK"); 
     onPlayerRegistered(this); 
    } else { 
     Debug.Log("Unexpected Data Returned: " + www.text); 
    } 
    } 
} 

而在將要創建的播放器類,你會做這樣的事情:

public class SomeClass : MonoBehaviour { 
    private void Start() { 
     Player.NewPlayer("Steve Woz", StartTheGame); 
    } 

    private void StartTheGame(Player player) { 
     StopTheSpiningWheel(); 
     ReallyStart(player); 
     Whatever(); 
    } 

甚至:

public class SomeClass : MonoBehaviour { 
    private void Start() { 
     Player.NewPlayer("Steve Woz", (player) => { Debug.Log("My name is " + player.name); }); 
    } 

所以,這個想法是通過需要玩家執行的方法,當有玩家時(即註冊時)。我的例子使用方便的Action class,這最後一段代碼使用lambda expression,如果您想要運行一個足夠簡單的代碼,這通常是一個好主意。

最後,看看描述Observer設計模式的this reference,以獲得完整無聊的解釋。

+0

非常詳細的解釋。謝謝! – Raptor