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); });
}
因此,我们的想法是传递一个方法,当有玩家时(即注册时),需要执行该玩家。我的示例使用了方便的,最后一段代码使用了一个,如果您有一个足够简单的代码想要运行,那么通常使用它是一个好主意
最后,看一看描述观察者设计模式的部分,以获得一个完整而枯燥的解释。非常详细的解释。谢谢