JSBinding + SharpKit / Coroutine支持

首先得深入了解协程的原理。如果还没有完全理解,建议看这篇:

http://wiki.unity3d.com/index.php/CoroutineScheduler

另外还要对 JavaScript 的 yield 有所了解,可以看 Mozilla 这篇文档:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield

---------------------------------------------------------------------------

以下这一段过时,新版本已经没有这个问题,请看其他文章介绍

先说结论吧:用C#写的协程转换成 JavaScript 后,无法正常工作,必须要手动修改一点点代码。

源代码中的协程例子工程:Assets/JSBinding/Samples/Coroutine/TestCoroutine.unity

以下是 TestCoroutine.cs 代码:

 [JsType(JsMode.Clr,"../../../StreamingAssets/JavaScript/SharpKitGenerated/JSBinding/Samples/Coroutine/TestCoroutine.javascript")]
public class TestCoroutine : MonoBehaviour { // Use this for initialization
void Start ()
{
StartCoroutine(DoTest());
} // Update is called once per frame
void Update ()
{ }
void LateUpdate()
{
jsimp.Coroutine.UpdateMonoBehaviourCoroutine(this);
}
IEnumerator WaitForCangJingKong()
{
yield return new WaitForSeconds(2f);
}
IEnumerator DoTest()
{
// test null
Debug.Log();
yield return null; // test WaitForSeconds
Debug.Log();
yield return new WaitForSeconds(1f); // test WWW
WWW www = new WWW("file://" + Application.dataPath + "/JSBinding/Samples/Coroutine/CoroutineReadme.txt");
yield return www;
Debug.Log("Text from WWW: " + www.text); // test another coroutine
yield return StartCoroutine(WaitForCangJingKong());
Debug.Log("Wait for CangJingKong finished!");
}
}

这是 SharpKit 编译后的代码:

 if (typeof(JsTypes) == "undefined")
var JsTypes = [];
var TestCoroutine = {
fullname: "TestCoroutine",
baseTypeName: "UnityEngine.MonoBehaviour",
assemblyName: "SharpKitProj",
Kind: "Class",
definition: {
ctor: function (){
UnityEngine.MonoBehaviour.ctor.call(this);
},
Start: function (){
this.StartCoroutine$$IEnumerator(this.DoTest());
},
Update: function (){
},
LateUpdate: function (){
jsimp.Coroutine.UpdateMonoBehaviourCoroutine(this);
},
WaitForCangJingKong: function (){
var $yield = [];
$yield.push(new UnityEngine.WaitForSeconds.ctor());
return $yield;
},
DoTest: function (){
var $yield = [];
UnityEngine.Debug.Log$$Object();
$yield.push(null);
UnityEngine.Debug.Log$$Object();
$yield.push(new UnityEngine.WaitForSeconds.ctor());
var www = new UnityEngine.WWW.ctor$$String("file://" + UnityEngine.Application.get_dataPath() + "/JSBinding/Samples/Coroutine/CoroutineReadme.txt");
$yield.push(www);
UnityEngine.Debug.Log$$Object("Text from WWW: " + www.get_text());
$yield.push(this.StartCoroutine$$IEnumerator(this.WaitForCangJingKong()));
UnityEngine.Debug.Log$$Object("Wait for CangJingKong finished!");
return $yield;
}
}
};
JsTypes.push(TestCoroutine);

注意看 DoTest 函数和 WaitForCangJingKong 函数,他们都是协程函数。SharpKit 对其中的 yield 代码翻译成一个 $yield 数组,每一个 yield 指令都加到 $yield 数组中。

这样使得我们无法与 JavaScript 的 yield 对接。这就是为什么协程编译成 JavaScript 代码后无法直接使用的原因。

目前,需要做点小修改就可以运行了,以下是修改过的 JavaScript 文件:

 if (typeof(JsTypes) == "undefined")
var JsTypes = [];
var TestCoroutine = {
fullname: "TestCoroutine",
baseTypeName: "UnityEngine.MonoBehaviour",
assemblyName: "SharpKitProj",
Kind: "Class",
definition: {
ctor: function (){
UnityEngine.MonoBehaviour.ctor.call(this);
},
Start: function (){
this.StartCoroutine$$IEnumerator(this.DoTest());
},
Update: function (){
},
LateUpdate: function (){
jsimp.Coroutine.UpdateMonoBehaviourCoroutine(this);
},
WaitForCangJingKong: function* (){ yield (new UnityEngine.WaitForSeconds.ctor()); },
DoTest: function* (){ UnityEngine.Debug.Log$$Object();
yield (null);
UnityEngine.Debug.Log$$Object();
yield (new UnityEngine.WaitForSeconds.ctor());
var www = new UnityEngine.WWW.ctor$$String("file://" + UnityEngine.Application.get_dataPath() + "/JSBinding/Samples/Coroutine/CoroutineReadme.txt");
yield (www);
UnityEngine.Debug.Log$$Object("Text from WWW: " + www.get_text());
yield (this.StartCoroutine$$IEnumerator(this.WaitForCangJingKong()));
UnityEngine.Debug.Log$$Object("Wait for CangJingKong finished!"); }
}
};
JsTypes.push(TestCoroutine);

需要修改的有:

  1. 协程函数改用 function* 定义
  2. 删除 $yield 数组的定义以及协程函数最后的返回
  3. 将 $yield.push 替换为 yield 。

===================================================

2015/07/13 22:18 更新,目前已经把这个替换工作做到菜单了,菜单是 JSB | Correct JavaScript Yield code

这个菜单会尝试替换所有在 JSBindingSetting.jsDir 目录下的所有 JavaScript 文件。你只需要在编译 SharpKit 工程后运行一下这个菜单即可,如果有错误会给出提示,如果没错,代码应该可以正常使用了!

目前这个方案算是比较完美了。

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgMAAAE3CAIAAAC4utUmAAAgAElEQVR4nO2d+7ccRbn3609w4VpcDIHcJPdk9s7eHRIQcxGFADHktrPhII2X5eV41BeFk0RQ9JW0eF495oBEFhAP4OLWhIhcDhAhgCIBQhOQiyGEhICu41mvZtBX13teduT9oXu6n6p6qrp7ZnqmZ/r7WbWyZnq6q556qvr5VlXvdIndvx/rcHq2mPTM78ee/t3Yrt+NPfX22K/fHvvVW2O/PDT2xKGxx94c23lw7JEDYzveGHto/7sP7n/3P15/9/7X371v37v3vvbuz197957X3r1n77s/KzhtR0JCQiprErt+d6QU6e1W01NvH/n1W0eefOvIrw4d+dWhI0+8eeTxN4/sPHjk0QNHGjIw9uD+sQdeH7t/39h9+8bufW3s56+N/fy1sXv2jt2zd+xnSEhISFVN4u0/H+mn9Nafj7z1zpG33jny5jtH3nxn7OA7YwfrYwfqYwfqY28cHnvj8Nj+w2P7D4+9fnjs9T+Ovf7HsX1ISEhIlU9i9B83FpM2jP7jhtEvSGldD6f1tvR5JCQkpB5O4u9/fw8JCQkJqcpJjB35u5Luve++L3/5K+vWjbYxffnLX7n3vvv0spCQkJCQup7E3/7vGE3b7r7nM5/57OZ/u+Yn/35zG9Pmf7vm/H+4YNvd9yjFISEhISF1PYk///X/0fS5L3xx89U/uu2Oux54cEcb00M7Hv3XH179uS98USkOCQkJCanrSRz+83/TtGr1yE233PYfD+/c9cyeNqZng5d2PbNn1eoRpbg2pZevHBYX3qUdf/5fhoRz5fP/ffjP91woPnVnIUV3MCXVaSUV5oq7PiWG/+W5ttlZjkq10gSxQ8qV+uJeQGp3Ev/5v/9G07kr1/701rseeWzXM8+9IqXNa8Xs9duir9edKyLO3Ryd8MOVIiE5M0q7n//ts8Gr565cqxRH0ovfGhJCON96Wjm+/QIhxNBVTxkvjK694Hbt+NNXzYsy3H6B+OStthyi9NT/dMIaMLl1Kt36CSE+sV21auiqp5LqtJJMrth+QaP1mqz77Z+MmimPnbd+QqjIdW+tUs27PfJ5K00QO6TYpHX+p6+aZ/NGG3yF1H9J/O6//krTipVrb73jZzt/ufu5F/ZJ6UcjYs7G7S/se+6FG1YKsfJH4fEdF88Z2fzCvude2Ld5tZh9yY7nGp/F6hvUHF7Yt2LlWqU4kl68Yp4YnOcMfvtFevxX33aEEGLeVb8yXhhde/5tlhO2ny8+eYsthyTdcoFQbGghpRrGpds+KSRrm8oknyu2ny/iIl68Yl54Qs5yb/tkWjO1p4EKuFy3/8Ur5gkhnCt2Rb820ytackj2pDXTrqsGbd5oh6+Q+i6Jl/b9kaZlZ6/aesvdD+x45olde6X0ryNi1oZbd+19wt8wM/wgp++tEDO/8lD4+dav1MSK69Ucdu1ddvYqpTiSnr20JtZs/M4cceEW6eDQpRsvFLXv3G+8sHHtDZYT7lgjZWtLW0bEnI3PZjkzQ0o1zGQtuWqH4pMWE+eKHd+Zw3g4p/E3pDZTexqogMtjPw9duiPJcM1IXP1nL63FP3XGIdmT1kwpHaYdvkLquyRe2vcnmpadveqmW3/+0M7nn9y9X0qb14nZl92+e/+Tu29cLsTyzfuVE/7XSjHz4kee3L3/yd2PfGk2c8KTu/cvO3uVUhxJuy+tiTU3/GnLiJizcXd08IYLRe3K+8N/o9PuWJOsI1y4Rbo2+WnNDX96ad+fXtpx5ZzonLD3qzkkBZFEDLhjjRi6dOOF8smpZcWfiam1K80VZ9KWESFG7gg/379xKPpMirh/45DkBKb0+LNsp+SKOIXaox6Jjb/flL/UHCJqJuMJerm0OOVX04Xs8eRy1TM5UtQDo443cgfjealH6X3D4BCD2XJPI0Xn6y3EbGsDkbLCXw09GamSSbyy/zBNZ52z6qd33PfIL198es+bUrrmPDH7G3fFn4UQ4rwfkhN+uIrcAPGZcjrrnFVKcSQ9t35ArL3x8Cs3XijEhdcpRwaufHD/4Vf237lWiNplz0WXyGc2PpPjj1xZiw7euTb5MLT+EblE2ZLr1sVF3LlWCLHuzleirMILU8uin/ki0hObQ3yQlqWeL1+7LvQb9VXsCjndGAY1+hNXtOrVpHbXrRNRM8kncO2lJ8Uq04WW4wbP5EkPXjYUNvd168TaGw+/8siVtbBGN15IukFiidY3DA4xmB0X98qNF9YGhsITSPfLmMIOqWDp7bGrDT0ZqZJJvPpGnaazzll9y+337nh8z1PPvSGlzaNi9mV3kiN3XjwghBArt4Zff7BSzLr40eRkMfoDcvKu4MCu4MBZ56xWiiMpWD8g1m6NPtQuC17d6oqBTQ++UWc+cJes3aodf3RTTbjXvVF/9Q1/bfhhq6vcMbXLAsWS60bjg/5aMbz+0TjP8HNqWfSzcnL2ZM/WXyuESGwznVZ/9Y36g5cNN+oqu4JL0cmjvuxeQ/5Kc8RfTSfYvCFbZbrQmGF8ueaZXOnRTbWBTQ9KbT28/lHSJaQm0PqGySEmsxu5XTc6vP5Rf61UdP6uQmth6+2xrww9uQm/IfV+EnsP1Gk6e/nqn95+7yNP7Hnm+QM0bfvagFi1VTn4zPNbzxXi3KsPPPP8gR+uErO+tpMcH/gf9ygnHzh7+WqlOJKCDQNiZGt974H63q2uGNi0YVTULg/irw/RD8klwxt2ytfSrHZuqgn3+gP1vQf8kfCDmgOTro/LPeCPiDD/XGXRz8rJOdJDlw+LUT/8d6+abVK0CC1kS9+5qSYaddFdYUz+iAhtJsaz+SvOjL+aTkh8yBZKrDJdaMxQqRTxTD63+yPCvX7nplqjlOtHxchWYrbkRq1vmBxi67fDG3b6IwObHgo/b02Kzpy0Pmb0v+JqQ0/O31eR+iCJ1w6+Q9PZy1ff5j/w2JO/2f3iIZIev3iOmH3J47tfPLT73m/OXn1T4/hNK8Xgxfce2v3ioc2rGye8eGj3j84T4rzNJIdn9xx8ds/Bs5evVoojKdg4IEZ+En72R4QQwr0+/OknrhjY9HDjeO3y4DX1eLBxQIhRPzz+8OXD0bWPbapFmfgjyYe4lHeuH20UQVKoBA0zhjc+FpsXfraUFZ2cHJQqlTM9tqkmhmsDsQGkOo9t2vgT2Wls6Yl/qEmxK+SyGjUitSbG87Wjzgw2DoioOMntbHvpSbHKdKHluMEzOd1+/agYGXWlIkbdkdhsqWp63zA4xOyHhy8frg0Mh90p/JycljVpNZX9r/X22NWGnoxUySReP/QXms75+Jo7tj34xFOv7Hnl92G6Zq0QQoi1P42P/Hz9vHi+ueo6+bSIf7imcXKYdr/w5u4X3jzn42uU4kja8/VBse6m6OsvvjksztsW/XTTRWLwu7+ITtu2LinlohvpteddpB5//LsD0edt66SDEXFxcfrFN4fJT9vWieGvPx4XEX42lEWuHTjvoka5jYOD3zVX3OYQUnFanb/ceF6j/IaXuNL3fH1QaAeJK7iKU7fExv/CULvXb4r9MPz1bzaaidhpaC896VaZLmSPJ5frnsmXbrpI7hjb1tGspB6l9w2DQyzVefy7A3Fxj393IMkzXz+RejL1P9PbY18ZezJSBZN4462/0HTOx9fctf3hXz/z25d++59tTMFvDgW/OXTOx9coxfVg2nPZoBi9uetmICG1mNCTkZIkDrz9f2havmLNtp/teOrZvS/v/UMb056X397z8tvLV6xRiuvB9MLlg2L05q6bgYTUYkJPRkqSOPi7v9J00ae+cPOtP9v13Guv7PuvNqaXX/vDy6/94aJPfUEprgfTi5cPitFbum4GElKLCT0ZKUnizd//jaatN2379Gf/6YGHfx3G7nalJ59+9UtfWb/1pm1KcUhISEhIXU/igV/sVtI3vv2D5StGFi35WBvT8hUj3/j2D/SykJCQkJC6nkSdsAUAAEA/UrciphO2bNnyVwAAAP3Fli1bpluBEgAAQJ/TpBK801YOvfXWe++9Z5+bAAAAaDtQAgAAqDpQAgAAqDqxEkydOnXatGnTpk2DEgAAQLWIlWDy5MlTpkwJ9QBKAAAAFSJWgvHjx0+YMCEUAyhBifFd4XhB0aUEnpO9mNikXFcBAEpDrATHHXfc+PHjJ0+eXEIlCDwnflWv63faRXmQwrTvFmG0TQmSEkmRKWaQa0SSM5QAgCoRK8Exxxxz/PHHT5o0qWRKEHiOFMJ8t3OhJvCcnEE8CdO+m5gdeE77tMCkBL6rxH/HC7KYQfOjZ7fBJABAj0CVYNy4cWVTgvyxuJ20oASB5xQUHPmwa4jhGcyg+TXpbigBAD1OuZUgJZAlCxuNs3xXOJ7nKksd3Jlh0PPd+BBZgnJ96RI6zNdy1ixi5gQG1BIz2c8Xb4zF6WaQS4kQJB/zmJTjKsfz5IJtK1gAgGIptxKo41UaLNixLFkiSdas2TPD7OK4E3iuvkRCh8jZhs7qUosltLElmuxPcvHdXEqQaoblOUF+k3JcFXiOfhUAoDv0jhIkh9QhOwliSryOl8r1M5nwo41MyTl8JhqawVGehkCnlWiwn+bJBv209RmLGdpD7lgo85vU3FWRc7HABEDXKLcSMBGOKAG/XJ4WgOrxryQwkhEq+UVWggyRyjC65ZZo+BKbVYJM9vErRfKVjW8dVQLiEegBAN2g5EogBcx6vZ4ogbpAYQ5A/Jly0FYWy/nVIT0TxtgkuLO515ljpMRU+zV/mBwV/u1QqhnNzQnS13nyXeWRg1gnAqDzlF0J6nX5vxPQaGd64qoGIPZMJegkZziuKz03FTTMKZkk6Kvxaf8Jgi3RYD99Vu2ZR/90CUuKuBYzlHUv3T15TEq9ilSaVqSY/3kBAMhKLygB6Evwt6cAlAYoAegYdK2K/xsoAEBXgBKADkLWqiADAJQHKAEAAFQdKAEAAFQdKAEAAFQdKAEAAFQdKAEAAFQdKAEAAFQdKAEAAFQdKAEAAFSd0inBQQAAAJ2ldEoAAACgw5ROCbo9SQIAgMoBJQAAgKqTVQlGCFACAADoJ2IlqNVqCxcuPOOMM1auXLl27doRGfFRApQAAAD6iVgJpk6dOnfu3IULFy5ZsuT000//qAyUAAAA+hYoAQAAVJ2sSnA6AUoAAAD9RKwEJ5100pw5cxYsWLB48eKPfOQjp8uUWwlMO+Lm2Cm3U5vqBp7T37t1JRVMtrcvqBgh2pi/70aZxR/6gnz9ur/qDvLQE0oQeI71ps+tBL7b2EOxkWv7lUC6q8LA5fpZlcBsTmK6UOvQVtJ8bruucCUoIOtUJdD7TC9g69ekK0VVghJUl6xK8BFCp5Ug8BzHsd36+ZTAd5ObOd5jvVAloCXGWKNZujkF37SMz6nBWUJxrnCdL7YXMIOzKwHbZ1rXo0KnTfV63Xpr0D7pu44XQAmqjK4EixYtWrp06UdkhO/7N9988+joaOeVIPAcxwtsnTSXEoTZZc2ieRoG+y6/e3uplYDzeYWVgO8zvasE7NCkDiWoMrESrFix4pJLLvE8b926dYwSnHnmmZdccsmPf/zjpUuXdlYJGneh2qflZZLkJ9Nx6UKtv/uucDyvcWn8c7QcTY+Fd6/vRpmTr/KlvitcX1sMiu59YmSahjEmxNmTTCUHWA2jLjLEU93n1GDHEfR62SFJcDMYwAiK7g2bhdqiBm1xySekmbT6qRdknxNoVticoER7Wi9PzsHU0Habk2xILdNuAduqKTWb86nemOpZTNulVA2UgFgJTj311Llz565YseLaa69dsmTJUhmxdOnSM8444+677+60EkjBKO5a0p1JRt2m41qeaqcks2W60u3qBcZL/iHyV1J+VIhigBooDc0S19V4lhywiG8aP5gMo2405M773BTe5ILkCjIG8NnQo+kWytVVhgFsM1HYZk17TsD0mSxOoJ/1/kjOS5kemGzWO22GWyBdCbjidAsZm7m2K37mA1onVoJPf/rTGzZsuPbaa2+//XZGCZYsWbJs2bI777xzyZIlnVQCJfwzAYp+NR3nkP/6ROnByWXacEbp18av4V2l3op5lSCKQOzdrChZ7AKrndoTZ3ugUCYn9lBnrSAXF9iTc1moNnGcT2pkVZo19Ykxuco8u9GcQD4zvVHRP7audpu1TpvlFsgyJ+CLUyzUjvBtl1410HViJZgxY8asWbPmz59/2mmnLV68eImM+NjHPvatb33re9/7XmeVQOtZ7E3VlBLE+Ws5Nm6qwHPi/psa4LSv0thcWbRgLpTQfgvvSqVu6hnysoRZCTL4hPF5J5UgLWhYlSDtL5f4Zs2kBLF/LLMbo3tSlIAYp9ffaHNTSmB0sdRnteJMFpIjtrYzVA2Ug1gJPvrRjw4ODi5evPiKK65glGD79u1XX331WWedtXjx4s4pgbo8SwO3PDFnVofocULQ+NOP6HxdQ5ibioRzJsDJRSYBTRruqVdblCCZ6tcDz2NjjR6wAs9xXNehtWANU1YPNBOMPm9GCRgDpMqxXk2z0L46ZAhg7MWyW8xKwPcZuxP0OtJ6+V5jrBELt6Gh7TbrE9kMt4D+g/K3Q2xxuoWMzVzb2asGykGsBMuXL//qV7/qed7nP//5RYsWLZYRiwgdUwI1KGlrpNEE1FOeIHDHCWTaS6OPflMlJzquaxvquq6aH7OQrz5LjHKXLdSXo30mby37+Ex5WYs1TJ/2Z/Q5NZh8ts4JOAPi8olXZW9YLayrQ086iWEmXxpss6bMCbg+Y3aCoY4kF6bWhoa228wtaWa4BQxuk5YWdft1CxmbubazVg2UglgJpkyZMnPmzOHh4VNPPfXDH/7wIpnuKEEvUKJhjhwfS2QYAKDkZFWCBQQoAaE0AZcblZbCMABA6YmVYMKECSeddNLcuXMdxzn55JMXyGBOYKIUATecfevPHrtuGACgJ4iVYPLkyTNmzBgaGjrllFM+9KEPnSYj6BcoAQAA9BOxEkycOHHatGmDg4MLFiw45ZRTTpWBEgAAQN+iKMHAwMDJJ5+8cOHCU2SgBAAA0LfQ5wRTp06t1Wrz589fsGDBQhkoAQAA9C1ZnxhDCQAAoF+JleDEE08MlWB4eHj+/Pkny0AJAACgb4mV4IQTTpgyZcrs2bPnzZs3PDzsyEAJAACgb1GUYNasWYODg0NDQ8My4rTTTvMbQAkAAKCfiJVg/PjxkydPnjlz5sDAwLx584aGhlavXr1p0ybP8zZt2oQ5AQAA9C2xEhx//PGTJk2aMWPG3LlzBwYGwpnB+eef//3vf//888/vFSVIfaVwi2R4Y3JbIC+z7E+SChb6f6EDaUOBNpD95dU9Rb5+3V91B/V6nSjBuHHjJk6cOH369Dlz5tRqtYEG69atGxgY6JYS0FdAZrmj29tH2XcvtjlAM5uDuH5WJTCbo28yUMzNK+++kO+6wpWggKxTlaA3X7tp69ekK+kvXAf9AlWCCRMmTJs2bfbs2XPnzq3JiA8TOqwE0oueU24wex/NFRmU97zr7wFuD8o2Btyr8c02Z9p2psibNvAcxzG/+S6Lw3M1Sr7YXsAMzq4EbJ9pXY+Kf4WUZesa+U3r0jYGoI+IleADH/hA+IekM2fOnD179hyZcigBd0CmfUoQ0C0saf4FKYG8uYBkR3mVIHSSXEaFlYDvM72rBOzQpA4l6EtiJTjuuONOOOGED37wgzNnzpw1a9ZsmdIogba5VWNLjniTDmZ7DGUjEHmLYHo5hb0NfDfc/SN9d47QzsYGNfSrtomH62uLQVEtdZsZc8jeUvqyBHWIXEp0rdGwNP/Uuc3dqMFOsrCnFCTt2GMwgBGUfC2oLWpYNrSJm0mrn3pB9jmBZoXNCUpPV/aakSqZsosPb3OSjXHT4ea2O+as0Y/Zd6+Rt9kzVw0Uia4EM2bMCMWAUkIlUDZsig+y2zmJeNMtbsXfMObS9w+js2W60u3SHdPork/K3cGsA0WFKLecGigNrcdupKieIcd2VTNNhmXzD7ObsCm8yQXJFWQM4LPJ14JydWUV5JuJwjZr2nMCps9kcQL9rM8OlY3urLNe3ma900qixU9I05WAK84+eGOybvyM16h3lVgJjj322PHjx0+ZMmX69OmhGFBKpQTqEJ+MLOhai/4ryY0/gUH+6xOlB8t7RUrDGcVy49fQYvVWzKsEUX3Yu1lRsjgQWO3M4B/qC2VyYg911gpycYE9OZeFalBjBwcMWrOmPjEmV5lnN5oTDCMc5jxTQ9tttu3RzfnHfFCrO1ecYqF2xHjzplQNFEesBO973/ve//73H3vssePGjRuvURoloKGMX9k03U51NY7k+7M5diKSTNe1fdTzKUGUi7JowXqAr09yQLsJ1TP03ZR5JUh/AqGgG1ywEqS1oFUJ0v5yiW/WTEoQ+8cyuzG6J0UJiHF6/Y02N6UERhdLfVYrzmQhOWJrO0PVQMEkfzs0c+nEoXOnL/rMnDMvrp29fuCcDTSVQwmkkbMyvdVvVP1XdWylnSCXLBWs6w9zU5FwzgQ4eY0gCWjScE+92qIEyVS/HngeG2v0gBV4juO6Dq0Fa1iaf9Ql8dTAZ1MCxgCpcqxX0yy0rw4ZAhh7sewWsxLwfcbuBL2OtF6+p8xljQ1tt1mfyNJSaERXK6SM5dWZt16cbiFjM9d29qqBgukBJTDO/7V5adZnWckdqp5gKpvkr99UyYmO69qGuq6rF6gt5KvPEiWbpfMMj3fVORQTLkhuRsPs/lGFQJGChsHks3VOwBkQl0+8mq8F5aEnncQwky8NtllT5gRcnzE7wVBHkgtTa0ND223mljSTjBzPMw/SGbdJS4u6/bqFjM1c21mrBoql5ErQN5RomCPHxxIZBgDoFlCCzlCagMuNSkthGACge0AJOkMpAm44+9afPXbdMABAd4ESAABA1YESAABA1cmqBIsIUAIAAOgnoAQAAFB1oAQAAFB1oAQAAFB1oAQAAFB1oAQAAFB1oAQAAFB1oASFku/l181D3mpZYqK3jrmeR/ZL6an/4Ny8n+mbnMvfUqBy9IQSsG94LCHsSxjbfNszu4S4ftb4YjZH322g7Z6WXz/anBIQM+WXlXeoc0AJQJ9SeiWQXl9fj1+R3hFyvZNHeeG7/kLg9qDsZ8C9I99sc6b9Z4oKp1zheYoj2zeEX+OXNGtuLyFZaop3QIGuUXIl6O69kaf0gO5lGVOcEqj7XRI7+lIJWNkzub2EQAlAqSm3EqTc53SvjXj3DcfzXPkge2Z41zV2hqnrW2eQhQhpr2AlZ8kYbmevxB7rNh2KPeSrfKnvCtfXlhiiGKLbzJhDNpnS11RowJJLia41Gmb3j7SsI22syOxTkkdSDQoh+YW0Ml+KvDZm2WpM3UsuNWfNsfoeRJEX09oOgCIptxIouy1JwUf9LQnfzGK0fma8xN447urbYip7JeqZyOgbifH2GMvStIJZB4oKYbZvY/dK0yxM2b5X20KNaCzjt8SwdP9wW0bSLcCsl1tmM4zbYxSvGvuMJEeZlSAtZ8VKOQfmLMwJQNfoHSVIDqlDdjKQ4jbq48803IiS2JBz+EwYGn8fE1/GbRxoL8v6Nay/ujaUVwmi+rBjd0XJlEe7BsMy+MemBKmXp61ryW5n/JJUWilFyZkVS+OcwJoz61ip7sLUigB0mHIrARMASOxIWUQI9B3nCfq2unqckpUgx5w9HmZy9qSWZf0qjc2lKUS6Emi/hfFTCYTqGfq2yrwSpPknRQnSH2CkNoC+UqTFa5tAyV/zKkHGBzDcnnHcNASAjlJyJZDCZr1el9cT6OScXWSIx7P6mcY7mYRYZXVIz0Q2lMkuRZkMZdWVQE+/kFCtLD2lKgFZ9w88Tw1yinvJRY7rOrQWrGFp/klfHUq5XO0J4d8OsW6nC3Fq7dg+I1couZTYa1eCdPuZ1SGtCaAEoGuUXQnqdWklRRrBMg89DasxzJlc5A3zd131mR7/SNlmptUetixurO26eoHaQr4Q+qBdW57Q19LZZ77sn7jIK1FGw1L9Y1WC9MtlowV3HXWBYZTNlkKf9XrMQ/WkmSyKm2I/MyfQm4BtOwA6QFYlWErA/zEunhIND+WVjxIZVgj5lgEB6BOyKsEMApSgeEoTcLl17VIYVhBQAlBJsirByQQoQfGUIuCGyxe2Z7D9B5QAVBIoAQAAVB0oAQAAVB0oAQAAVB0oAQAAVB0oAQAAVB0oAQAAVB0oAQAAVB0oAQAAVJ3SKcFBAAAAnaV0SgAAAKDDlE4Juj1JAgCAygElAACAqgMlAACAqgMlAACAqgMlAACAqgMlAACAqgMlAACAqgMlyAWz4Xubsy/phlmGrcqSveMrQgstVDlf9QdtueW5biP1h8Bz9P0BO0pPKEG4i6Io0lVJEdYSuqgEUV8p1AtSIZIpnVeC0BQ9c99lD7cA6V6pOUMJ+pvAc5Tbq4lbXg8mKUrQ5Jawxru1GUqvBL4rRT7fLeBm8t2kiMBzLG2St1vkbGJTnFH7ZyFeqPuu1J+kQtu1fXH2fALPEY7jKBWNOn+7lSDOj3aFtHNB3xF4juPIPTS+5TN2XTaYpHQb8nPmG8R2tzZDyZUg7cZsC4GnxhsjXVGCzmwiz7k6OdYdJXA95fTAcxzPa3M0pl5Psw9K0M+EkUC+ye1KoA0c+WDSohLow1P73doM5VYCmwPpnD6uf+hHZXYmT8uZPE0uTPJpXEE7if6rctBLLIzOSLmEH+3ahYrMEKWpqB8dd/2kBIOdQXyRuQezjlX6bW6HMLbLFXN92a7wi3pI7wa+S0ozuJrOM033IdsBSD2kfkePaWvAjhcYfMXPu5LPxPPpTgOt0LjT1A4WdkP2Ds0Wo9lu02hi+f7PVkrK3doMPaoE8tRIHrpKITH8TPLhR/VRayizQn2kGF9t+lWxl97cxkuk8MAujKsPlkhvcvV1DbKSHtZLHdNwlqRMRwyOtedpd0jK8JveKNqtQ5SV6wZkSTGJycLwikQAABaASURBVKaTTc8JjDXScuZaIbm6ca3kK84SsxK0f5UO6Ej9iq4X5pkT1E3BROs2JL/cc4ICFg96UwnU41LAIr6gN3AcDoy+kp7fa0rdGC0kAUH9lbFWbu3US9j68pOYpBbaIFHpx9rnrMbXyXzE4Fg5QuZzSHSNaRQjtamUm/5BvUQJ4vpAr64EZiYuGzuAlrO9FfS+abLENieIT7Y7DTSP4bYxKAHfPRLkPwbiuk0WJTCVknK3NkO5lcAkBcy9ZA1YjTMyiGYjEhjnX+zNbDKWb23jJVknfQ0zAs+JOwcf2QxKwJeS/TkBpwR5HUKOGBbFJNclTwdsSqD/YFEC9rZK9RJ7S+utEJ2aFGNTAjU0mJXA7jTQNPoiTXw35ZwTyHkahyatzAlS7tZmKLkSSHdZWNt4WMvN4wP1713oF8d1Wc2U/EzDDF23UbqF6ddkwOupN3fqJWpdjU7gBIlUNk0JeEu0Uqy+5FaHcjok8Dzbkoc+e9CX2UzdgB25m042zAmMNbJpjK3LWVaHkmGM3o9l56Q4DTSLGkZpEM+jBMZg0l4lUDuR3POaoexK0KizrNPGo4HnCNd19bN111HI1N627CItyzC/0oM0vApyq1vqYf2rGGqikCNPeMR1s84JTJaopVBTDI5Vh7H5HOJr+SmmyO2aRGUlcmu5mNZw0nuSZArfAfSc2Vaoq3enWgemxDgjko8aGqxOA02ij6fJ4gB3L0cwMZoLJtmVIGspakktTxB7QQlyYBsoGVaaQAtgYApAt2l5PlCvV0gJELMKgKxnAAC6RzxVbDbIVUIJ5GVm0A6ingenAtAP9JkSAAAAyA2UAAAAqg6UAAAAqg6UAAAAqg6UAAAAqg6UAAAAqg6UAAAAqg6UAAAAqg6UAAAAqg6UoGjIS+sKyr6k73swvN+jFG+oKK/XWqaFqpWiacpDW+5crjkkP8sbGXSPkisB/wbOcpDxpZBdVAL+Fattxv760s4rQaYXNLZFCUybBPhuu/uq9LbUlJyhBM2hv8atiTtXjwkpSpD3dWjKO1OVFgu/5jO5QQ8ogfQm365LZ4Syr4B9t4pcRufsG6YbX+3Y0cYObcb2kvR2vfMvTz5Z7WmbEjiOuuUF91bhVlHeLW51Rx9Pd4ok8BzH0d7/bdmZQIeNCSnNkbYzge0CfSzSStv3khIUPbzOQZB9n7iuKEFn3ryaa5uzpsmeT3Z72qYErqdYF3iOdZ+JplDfXw8laDfhDS3fq/n3qEnZ5I4h9x410izAd4XrSlumNN/0PaQEykyI7vBC9p7yo8WBaJMJdT6t7xCiLdqR/bDM03HTyIy1itmfxFARLzHPZoa8t4pun71LmDZgyew6ZmcwyQPJ/i2ur82XDRu2ZHSIaYudNHt8OR/fpXnz2wbR+5Nd8Ilqom6cE5aWZS+dhgHW/qnUTIkXhrtAr5rqOK7bp+6lo96ONFAmLrK1UUkJuC1OwztX6Tn0EqV2bEzgmqPhOvk2zliKvMGN66vt0KwLekAJOA+xgyRyu9L3UCcOktcO6P506qpdhkEY81pmk1X6PFGyWY4wpqGrdIl0v7Ir1eoTKeIOV19oyOI6zZKU6UhYMKlKcrhZh9j7egZ7qDXaSIC1R64Fm7M+7UhyMnQ5owHsyabnBOa7QM2Za3S926feKWYlaP+iYCeR2ksaceeYE9RNMUFrDn63sqylqJElINuztuD4HlCCpG+y45Xk7lBaUfusRgot7st3k1GnFfuEdHdzVpnzZIKX3E1SL2HDH3NQ6ibaqC2D6zIZXycdU+nZWrhpwiHRNYbWyGGPEkPNdbQFNkktJOP1D+olBgP4k7Whqq2XcjnH2bGNrmulyRLbnIA2g+WOKSOG3m9QgrTgIMUEtjmyKIGllCgb2rHNt2NmekYJ1DFSypJcRiWQRgLq96w+bBhmtIq9u0wV4buJ8ZJ0V8hmBF6ybz0farK4Tq44fyyDEuR1CDlimApltCdLIDaVzv3kR2sAav8xdrmMSsD2x9RGYUOP3uhat7cpgSaLKasSpjYqIVrQTW6KnHMCOU+j5Lc2J4gMIyqvfm+KHlICurSpzBCyhTN9ziu1kevKW59r+ct2SfKd5M9Zxc5q9IO+p95tqZfQW1xznKoYas8MPCfrnMDgELUUkqPxi3Gal8EhgedZ1yBS7bEpAW9PNiWIoomevanLGQ1g+yc/J0i/CxiNUV1Cu71ldSiZVhHVYANlWhuVDnX8QIN4HiUwxoS2K0Hdd4XrulIDSd+boZeUQOt+koJnCGd1Wf+pi6UbxJC/Zpl+Am+VFA7Nl9DwKsi9p12SVML6ZyrURCGHgvCI62adE1gcIpVCTQk8R7iuq16kjivzOcTX8rPWWlvjEPoiFBlMMfZkVAL5ixa5NaNNazh8/5RHreoNIR9lc2Ybva52e7UOTIlxRiQf1UXpbVQm9IkkmeNzt2QEE6O5mJBdCbKW0jBRW5FrzdslVwLQd/TISBGASgElAB2FLDAAAMoClAB0imjVABMCAEoHlAAAAKoOlAAAAKoOlAAAAKoOlAAAAKoOlAAAAKoOlAAAAKoOlAAAAKoOlAAAAKoOlAAAAKpOjypBK+/ibvrFN/StomX+j7LyC9LbQHEVt5va2VcUtfh+dwB6mZ5QAvJaROYVfnnJGF+0t5OmBETbS/M7GWIKCJ9ZKt7M2yfTTC2JEvTWuzUBaIbSK4HyvlXftWzSkY1s8SXwHMfR3rabEhAdR90tgnvTbLEUMLRNrTh9q3O+LX6sZ5dBCZTdIKAFoD8puRJwu1BFx4tVgjC8yZEvXQlcT8k78BzrFgIF0E0lyFl6DyhBqztBAdAblFsJbBN2x/NcbdJO93AJDAelPbAM25Uzmz1lUgJfuyLUkyz7ljSqw1qesh0Oc0Gy+ZR2cmiqYdnKttlOdiXQi1CbRjXVuEsMsziTso2Qaf+WFA+zUzfLWES5iD2SUqi6S4mpRgAUTO8qAd28jN0oLt6CTsmj8ZP+C1OusoFXuhKQ0EGOmPYypPGaqQ53ctpAWd70kC3OKID1euC5+g6eTawOKUWwTSPviMaUK2eS1QOmKvAelvboYrsD8zJt/Vxj38vUS7F7D+g2vasE3GatMuo2hfX4/HBXReO9Z9i/MZsSxDd9fKX+Qb3EUB3jyfzwVTXYmENqKFXGp9mfGDPhvl43NI1moFYus3dpFg8YqpDmYetalfRHTvqZfAUz99IMNQKgUMqtBMa7M0voNGUQeI4QjmN+tqndrJkDIv3LJk+PyExoZseJJiXQwya/nGFWgmTAzitBQLaEl8buWVeHGG8wlmiH+XJNSmD1gLEKLSlB4wxlkme/NnMvtdcIgOIpuRJI93W9Xq8zfztE4ymd7CfLAvH6gkefE+h/Jtq4Ul8KaAxFsylBpCXSGjW/OsTEbKk6zMmB5/l6iZK5xtUhLUBaLibuaVkJ+KbhHUDKlVoo+WL3gLEK9g6jdrSkHoyg6Z3K1Pey9dK0NgWgaMquBPW6PEbXYoi2Ti2fKB3UR5pyyI4PyfciGQpmVAL5izQMZCpjrA5/MjlqeJRpeCLKW6fXIlq1cN22zQnqfNOoQVstN17Hy+UBUxU4DycZGf/Eiy5+mTuV+TF1tl5qb1MAiqYXlAAAAECRQAkAAKDqQAkAAKDqQAkAAKDqQAkAAKDqQAkAAKDqQAkAAKDqQAkAAKDqQAkAAKDqQAkAAKDqQAkAAKDqQAkAAKDqVEEJ2PemFYH9TW3lQXrZfjsoruJ2U0uwvSUAfUHJlYC+CLLpN7cXFJf1t1pn2dGF3UKhoy+lLyB8Zt/KJl/JaaaWRAnwIlHQ8/SAEkhv7m3mVitGCQLPcRw5EKUHRMdR3+AchckOKkEBQ9vMr61ONnHMmq/17DIogbLJAbQA9CS9pATNhvRClCAMb3LWGTYw8JTYFXiO8c34BdFNJchZeg8oAbs7AwC9Rg8pgTKepJuMBORkfapOwhO7lQ2TlX5Egd2MMNNWNuoVoZ5k2crGczWT+K1s+FqqFyR7umknE0/ym9CYPJxdCfQiVJ+rpjLlmlrc5gFzFVI9bNot1LRjUGqnSi9U2hjaUiMAWqMHlIC7C5XdoGiooNuRKeEp8Fy6G1gSCuUbnM1cht94MtumZknR5Ihpe0sar5OLDNtbJm6wBQvb9pZ020g+E5MP864OKUXwPpc2NWPKNbR4igeM3YD1sLQ4yY4LoritrBNm6VSmQrUzsaklKJgeUILkTmX2+qMqYdoAXQpP6thKn/LzmdeVU2j4J4E1y/aWjZs+vlL/wFQhdW90Ob6Yl1V4FdMstIZSZXya/YmxQWINPlcM1Mq1tLjNA4YqpHnYulYl/ZFT1k5lKJQ/M6VGALRCzyiBpAX8PZmmBHTTcjbGxuWk3HHazZo5IFL7PT0iM6GZHSealEAPm/xyhlkJkgE7rwSsD/OsDjHeYCzRDvPlmlrc6gFjFVpSgsYZyiTPfm2WZtVMhx6AAughJaAPCpQZAlkrkJ4IyOFJWmugvyZi4zXGX1rmBHVlOP6eWQkiLZHWqPnVISZmU3ngTg48z9dLlMw1rg5pAdJyMePhppXA4HPWAaRcQ4vbPWCsAu9hKXu2HoygZexUqYU2zkxrUwBapJeUQA8CdEAeney66uEkPCXXOK4rP4rWc1JziVGFQBoKZlQC+Ys0DKQTDtMyOl2a0k8mR7mYIQ862Rws4Yb1YetKwPtcDdpquaYWt3vAVAXOw0lGxj/xootf3CqkpVMZCjW4wtKmALRIyZUgFxguAQBAM0AJAACg6kAJAACg6vSTEgAAAGgGKAEAAFQdKAEAAFQdKAEAAFQdKAEAAFQdKAEAAFQdKAEAAFSdzinBuyefjIRU8dTt+x0AHigBElLn0kEASgmUAAmpc+k9AEpJF5TAdAKeE4B+Je783TYEAB4oAQCFAyUAJQdKAEDhQAlAyYESAFA4UAJQcqAEABQOlACUHCgBAIUDJQAlB0oAQOFACUDJgRL0DoHnsFuqF5Ibuze9vAd767Q3txIDJQAlpyeUwHdFg67vTtm24JVUKmudmlUC35XKiLKBEnQQKAEoOaVXAt+VYqXvFh86rPshtyd40eAceE679M1guRT0M1YAStBOoASg5JRcCZThbGcoXgkCzykkAposJ1KQ1X4oQTuBEoCSU24lsEUKsmSUxKwwFPquEMLxAvWrdBXJmB70kmzZoqlJgedIFkhj7+SLelrdrHCKebL9SZwnx5NsiUN0yyOziVRIqqG7hSoBdbXBLXwO7KKeKTe2afoEKAEoOT2qBL6rxpAkRCrCIKSIJgXqOIDKhWScEwSeS1Zc4sziX52GPOin1eO4p4ZI3RJpGYmtplx9g+WB5wjXI3OR5FyTW+JfZU1gWkQ/bGogU26sDf0DlACUnN5UAvU4CbtSEJG/yoPRaOzJFJFjdUgb7jd+lvNgZgX0uB6QWUvUOUFq9TXLBZcb65ZYCRSr2BbRD5oayJQbb0P/ACUAJafcSmCSAibQJAsxNiXIEsWs8VQZl6sTgEZ+yYMAw2myBVyU1C9oUQmUpX+qBPwwv71K0NAXkxL0WeyXgRKAklNyJZACab0e/+2QtvjAx1rlq7I0oa9X+J4+ntfM0dczAs+R1nAc141XYdjTpD8XkgbGNksUFaKLRumrQ3WjEhjdov+qtgbJWbHc1ECm3Fgb+gcoASg5ZVeCet306NHyxDi+UouM7DJNcpA8TNVWKLSF/eQyx3Ud2YbU04ghFkuscwLXNWZgfLhi8A3/TFt5pCGiB+ps5poPjU+MTbmZVtD6AigBKDm9oARApQ+fqfY3UAJQcqAEvQiUoMeAEoCSAyXoRaAEPQaUAJQcKAEAhQMlACUHSgBA4UAJQMmBEgBQOFACUHKgBAAUDpQAlBwoAQCFAyUAJQdKAEDhQAlAyYESAFA4UAJQcqAEABQOlACUnC4oARJSZdNBAEoJlAAJqXPpPQBKCZQACalzqdtrAADwdE4JUsFzAgAA6ApQAgAAqDpQAgAAqDpQAgAAqDpQAgAAqDpQAgAAqDr9pwSNrdgDzzHs7A4AAIDSC0oQeI6ISQ3u7VICqVSBzSIBAP1L6ZXAd6XoH3hOSlRuKEGryHsF+24p1QAbGgMA2kDJlcB39fjLHZN/LkAJuAMloIw2AQB6jnIrge9yCzzxUd8Vjue58rIRXR0KgyR7Wj0a5xuXnPQgS48k18qyJOdJr1Ds8aPFJ9dPLrLapteC2OB4gbSeBXUAAOSgF5UgjqlkySZ5KsAqAXtanDU7srYogbxilcxRlJWsulkJRGKFZBuRCtU2thakAEwPAADN0qNKwEZzixJop9ExPT8tYJWgcS0b73VrLXOCQK9h4zNvG1tZfZqCP5cCAOSm3EqQ8pygNSVIiZmaEsiLUrISGPJsWglsa2J1gxIkxUAPAAC5KLkShIHN9LdDLSiBrDG+q6+r6H87REO2vDoUfaF5+l70nCD6jRiepgS8bWlKEHiepjkAAJCFsitBvW75/wStKEHqA1b5/xOog2zDE+PkIrJ6H2bgulnnBLxtfC2iE5VVJegAACAPvaAEAAAAigRKAAAAVQdKAAAAVQdKAAAAVQdKAAAAVQdKAAAAVQdKAAAAVQdKAAAAVQdKAAAAVQdKAAAAVQdKAAAAVQdKAAAAVadflaBde1gCAED/U2olUHYnIO94Zr7KdEsJ8D5QAEDvUWolkPdsUfdgsW420xUloMoVeA60AADQG5RbCaRhv+8K13VpqLXszNUNJbBbBAAAZaXcSkC33/Jd4frJd2ljrmRNphGKqRKwv+r7zPiucDw/2iIm2pdY3aVGz4rC7bXJXBWaTva157NlzXY8T7cKAABaouRKkAT8KLRrW5Npm3lJp6s7TepHpF2RBdk+UmiSwxYkE0Vv+otuQLjMJSsQYz97kFoFLQAAtIeyK0Ej9NOdex0vUDYPlmjs5KhF1BBmP3r9VMNG80xBDNGOkrp8qCU2stezNVaK24YTAABao/RKEK8KSes+8ncmJOZSgngikKYEOWJvY66RRQn0bI2VghIAANpP+ZUgelIsreeo3+lSSzwUT9Z84k3hvcbYnvsLpNSN5tmCCNKfC7FXhQYoK0sm+9mDUAIAQPvpASWgy+Ps98ZyDF2hJ0+Mk1+ZZ8iG9XrDZ6YgCfI7OUE1QHvGwGbLVwpKAABoP72gBAAAAIoESgAAAFUHSgAAAFUHSgAAAFUHSgAAAFUHSgAAAFUHSgAAAFWnJSUAAADQN0AJAACg6uRWAgAAAP1HDiVQGB4ertVq06ZNmzRp0oQJE04EAFSACRMmHHXUUcccc8wxxxxz1FFHjZ/xoXEzlyL1ejph7rLJzpoZSz4798yvDuRSAsdxBgcHZ82aNW3atJMAANVg6tSpRx999Lhx48aNG3f00UdPHlw2cehcpF5Pk501J536iVmnf3Husq/lU4L58+cPDw8PDg7WarW5AIBqUKvVxo0bN2nSpEmTJo0bN27maedPX/QZpF5PM5Z8dtbpX5xz5sW1s/5ZkYEUJQjFwHGcYQBAZZg/f/6JJ544derUqVOnnnjiiQMf+9ycMy9G6vU098yvzl12Se2sf9YnBOlKQCUBAFAFFixYMHHixOnTp0+fPn3ixInzlv1T7ez1SL2eBsKkaUA+JQAAVISFCxdSJRg660um8IHUNwlKAACQgBJUMEEJAAASUIIKpv8PrOBKlqwqt4IAAAAASUVORK5CYII=" alt="" />

以上这一段过时,新版本已经没有这个问题,请看其他文章介绍

---------------------------------------------------------------------------

下面讲一讲原理。

当我们在 C# 中使用 MonoBehaviour.StartCoroutine 函数时,传递给他代表协程函数的 IEnumerator(后面简称 IE)。之后是由 Unity 内部决定何时调用 IE.MoveNext()。而这部分的源代码我们是无法得到的。

我是学习了本文开始处第一个链接的内容,在 JavaScript 端写了一个模拟 Unity 功能的协程管理器。文件是:

StreamingAssets/JavaScript/Manual/UnityEngine_MonoBehaviour.javascript

(后面简称 B)。

这里顺便提一下,当你导出 MonoBehaviour 类时,会产生

StreamingAssets/JavaScript/Generated/UnityEngine_MonoBehaviour.javascript

文件,简称A。B 和 A 的关系是,在includes.javascript 中,包含顺序是先 A 后 B,B重写了一些 A 的函数,并增加了一些内部函数。目前重写的函数只有 StartCoroutine$$IEnumerator 和 StartCoroutine$$String。增加的函数有 $UpdateAllCoroutines,$updateCoroutine等等,这些就是协程管理器的内容。以下贴出代码(可能不是最新的):

 _jstype = undefined;
for (var i = ; i < JsTypes.length; i++) {
if (JsTypes[i].fullname == "UnityEngine.MonoBehaviour") {
_jstype = JsTypes[i];
break;
}
} if (_jstype) {
_jstype.definition.StartCoroutine$$String = function(a0/*String*/) {
if (this[a0])
{
var fiber = this[a0].call(this);
return this.$AddCoroutine(fiber);
}
}
_jstype.definition.StartCoroutine$$IEnumerator = function(a0/*IEnumerator*/) {
return this.$AddCoroutine(a0);
} //
// Coroutine Scheduler
//
// REFERENCE FROM
//
// Coroutine Scheduler:
// http://wiki.unity3d.com/index.php/CoroutineScheduler
//
// JavaScript yield documents:
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield
// // fiber 类似于 C# 的 IEnumerator
_jstype.definition.$AddCoroutine = function (fiber) {
var coroutineNode = {
$__CN: true, // mark this is a coroutine node
prev: undefined,
next: undefined,
fiber: fiber,
finished: false, waitForFrames: , // yield null
waitForSeconds: undefined, // WaitForSeconds
www: undefined, // WWW
waitForCoroutine: undefined, // Coroutine
}; if (this.$first) {
coroutineNode.next = this.$first;
this.$first.prev = coroutineNode;
}; this.$first = coroutineNode;
// NOTE
// return coroutine node itself!
return coroutineNode;
} // this method is called from LateUpdate
_jstype.definition.$UpdateAllCoroutines = function (elapsed) {
// cn is short for Coroutine Node
var cn = this.$first;
while (cn != undefined) {
// store next coroutineNode before it is removed from the list
var next = cn.next;
var update = false; if (cn.waitForFrames > ) {
cn.waitForFrames--;
if (cn.waitForFrames <= ) {
waitForFrames = ;
this.$UpdateCoroutine(cn);
}
}
else if (cn.waitForSeconds) {
if (cn.waitForSeconds.get_finished(elapsed)) {
cn.waitForSeconds = undefined;
this.$UpdateCoroutine(cn);
}
}
else if (cn.www) {
if (cn.www.get_isDone()) {
cn.www = undefined;
this.$UpdateCoroutine(cn);
}
}
else if (cn.waitForCoroutine) {
if (cn.waitForCoroutine.finished == true) {
cn.waitForCoroutine = undefined;
this.$UpdateCoroutine(cn);
}
}
else {
this.$UpdateCoroutine(cn);
}
cn = next;
}
} _jstype.definition.$UpdateCoroutine = function (cn) { // cn is short for Coroutine Node
var fiber = cn.fiber;
var obj = fiber.next();
if (!obj.done) {
var yieldCommand = obj.value;
// UnityEngine.Debug.Log$$Object(JSON.stringify(yieldCommand));
if (yieldCommand == null) {
cn.waitForFrames = ;
}
else {
if (yieldCommand instanceof UnityEngine.WaitForSeconds.ctor) {
cn.waitForSeconds = yieldCommand;
}
else if (yieldCommand instanceof UnityEngine.WWW.ctor) {
cn.www = yieldCommand;
}
else if (yieldCommand.$__CN === true/*yieldCommand.toString() == "[object Generator]"*/) {
cn.waitForCoroutine = yieldCommand;
}
else {
throw "Unexpected coroutine yield type: " + yieldCommand.GetType();
}
}
}
else {
// UnityEngine.Debug.Log$$Object("cn.finished = true;");
cn.finished = true;
this.$RemoveCoroutine(cn);
}
} _jstype.definition.$RemoveCoroutine = function (cn) { // cn is short for Coroutine Node
if (this.$first == cn) {
this.$first = cn.next;
}
else {
if (cn.next != undefined) {
cn.prev.next = cn.next;
cn.next.prev = cn.prev;
}
else if (cn.prev) {
cn.prev.next = undefined;
}
}
cn.prev = undefined;
cn.next = undefined;
}
}

目前支持的 yield return 后面可接的类型有:

  1. yield return null; // 下一帧调用 MoveNext()
  2. yield return new WWW(...); // WWW
  3. yield return new WaitForSeconds(...); // 等待一定时间
  4. yield return new StartCoroutine(...); // 串连另一个协程

C# 协程和 JavaScript 协程有一个区别:C#是协程初始就调用了 MoveNext(),JavaScript 需要初始调用 next() 才能和 C# 匹配(现在没有调用,因为一帧的时间也挺快的,效果差不多一样)。

另外,看前面的 C# 代码有这样的代码:

 void LateUpdate()
{
jsimp.Coroutine.UpdateMonoBehaviourCoroutine(this);
}

现在因为我们自己要管理协程,所以需要有一个 Update 入口。如果想让 JavaScript 协程正常工作,必须在某个地方调用协程管理器的 Update。现在我是把他放在 LateUpdate 函数中,如果你想换地方,也是可以的。

在 C# 中,jsimp.Coroutine.UpdateMonoBehaviourCoroutine 函数并不做任何事情,只有当运行 JavaScript 版本时,才有做事情。JavaScript 的实现是在这个文件中:

StreamingAssets/JavaScript/JSImp/Coroutine.javascript

 if (typeof(JsTypes) == "undefined")
var JsTypes = [];
var jsimp$Coroutine = {
fullname: "jsimp.Coroutine",
baseTypeName: "System.Object",
staticDefinition: {
UpdateMonoBehaviourCoroutine: function (mb){
mb.$UpdateAllCoroutines(UnityEngine.Time.get_deltaTime());
}
},
assemblyName: "SharpKitProj",
Kind: "Class",
definition: {
ctor: function (){
System.Object.ctor.call(this);
}
}
}; // replace old Coroutine
jsb_ReplaceOrPushJsType(jsimp$Coroutine);

这个文件同样在 includes.javascript 中进行了包含。

看第8行,调用了 $UpdateAllCoroutines 函数更新协程管理器。

对于 WaitForSeconds 类,C#中并没有暴露任何接口。我们无法判断一个 WaitForSeconds 是否时间已到。所以我又自定义了这个类,来达到这个目的。

文件是:StreamingAssets/JavaScript/Manual/UnityEngine_WaitForSeconds.javascript

 _jstype = undefined;
for (var i = ; i < JsTypes.length; i++) {
if (JsTypes[i].fullname == "UnityEngine.WaitForSeconds") {
_jstype = JsTypes[i];
break;
}
} if (_jstype) { _jstype.definition.ctor = function(a0) {
this.$totalTime = a0;
this.$elapsedTime = ;
this.$finished = false;
} _jstype.definition.get_finished = function(elapsed) {
if (!this.$finished) {
this.$elapsedTime += elapsed;
if (this.$elapsedTime >= this.$totalTime) {
this.$finished = true;
}
}
return this.$finished;
}
}

这个文件也很简单,只是记录初始时的时间,后面更新时时间进行递增。get_finished() 函数被协程管理器用于判断时间是否已到。

整个过程差不多就是这样,有想到什么再增加吧。

返回:Unity代码热更新方案 JSBinding + SharpKit 首页

上一篇:java获取当前年份、月份和日期字符串等


下一篇:Calculus on Computational Graphs: Backpropagation