C# Unity3D网络请求流

C# Unity3D网络请求流,c#,mono,unity3d,C#,Mono,Unity3d,我有一个Player类,它存储玩家的信息 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() {

我有一个
Player
类,它存储玩家的信息

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
是一个扩展
monobhavior
System.IDisposable
的类。当
NetworkManager
完成网络操作时,它将调用
Player
类中的
OnFinish
事件


我有一个Unity场景,它有一个GUI按钮,可以触发
Player.NewPlayer(“我的名字”)
。注册正常时,如何将
播放器
对象返回到场景?

这取决于您将对播放器执行什么操作或如何操作它,但一个好的通用解决方案是在播放器注册时使用委托执行,如下所示:

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); });
    }
因此,我们的想法是传递一个方法,当有玩家时(即注册时),需要执行该玩家。我的示例使用了方便的,最后一段代码使用了一个,如果您有一个足够简单的代码想要运行,那么通常使用它是一个好主意


最后,看一看描述观察者设计模式的部分,以获得一个完整而枯燥的解释。

非常详细的解释。谢谢