我被困在Unity腳本中。我有3個文件:Scene.cs,Player.cs和NetworkUtil.cs。我無法編譯我的代碼,因爲我不知道如何將Coroutine響應傳遞迴Scene。Unity3D協程錯誤
在Scene.cs
(MonoBehavior
類):
void OnGUI() {
if(GUI.Button(new Rect(0, 0, 100, 100), "Register")) {
StartCoroutine(registerPlayer());
}
}
IEnumerator registerPlayer() {
return Player.NewPlayer("Raptor"); // since Player is not IEnumerator, this line causes error.
}
在Player.cs
(Object
類):
public static Player NewPlayer(string name) {
Player p = new Player();
result = p.tryRegister();
if(result) {
return p;
} else {
return null;
}
}
private bool tryRegister() {
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("some_key", "some_value");
NetworkUtil.ExecuteAPI(data);
}
在NetworkUtil.cs
(Object
類):
public static IEnumerator ExecuteAPI(Dictionary<string, string> data) {
WWWForm form = new WWWForm();
form.AddField("mode", request);
foreach(KeyValuePair<string, string> entry in data) {
form.AddField(entry.Key, entry.Value);
}
WWW handler = new WWW(API_URL, form);
yield return handler;
if(handler.error != null) {
Debug.Log("Error occurred: " + handler.error); // Server Error
} else {
Debug.Log("Response: " + handler.text);
}
}
我怎樣才能改變f代碼低完整?
注意:在Object
類中,StartCoroutine()
不存在。
編輯
我已經改變了我的代碼使用委託&活動:
// DelegatesAndEvents.cs
public class DelegatesAndEvents : MonoBehaviour {
public delegate void RegisterEventHandler(Player player);
public static event RegisterEventHandler onPlayerRegister;
public static void NewPlayerRegistered(Player player) {
if(onPlayerRegister != null) {
onPlayerRegister(player);
}
}
}
然後在Scene.cs
:
void Start() {
DelegatesAndEvents.onPlayerRegister += this.userRegistered;
}
public void userRegistered(Player player) {
Debug.Log("User registered.");
}
我應該怎麼把扳機NetworkUtil.cs
& Player.cs
?
如果您使用委託...我注意到您有引用被添加到Start()方法中。確保在OnEnable()方法中添加引用,然後在OnDisable()方法中將其刪除,以避免內存泄漏。 – AnxGotta