Applicaton.ExternalEval(string脚本)

我想知道,如果Application.ExternalEval(String script); 在Unity3D中可以返回一些东西。

喜欢:
String playerName = Application.ExternalEval("prompt("Please enter your name", "player1")");

先谢谢你!

我不认为。 但是你可以尝试像这样调用一个javacript(使用Application.ExternalEval(..):

 <script type="text/javascript" language="javascript"> <!-- //initializing the WebPlayer var u = new UnityObject2(); u.initPlugin(jQuery("#unityPlayer")[0], "Example.unity3d"); function SaySomethingToUnity() { u.getUnity().SendMessage("MyObject", "MyFunction", "Hello from a web page!"); } --> </script> 

谁发送消息回到团结..检查这一点 ,让我知道..

免责声明。 我的第一个意图是更新现有的答案,但后来我明白我完全重写了它。 这就是为什么我正在创造一个新的。


是的,这是可能的。 在浏览器和双向的统一之间进行通信是可能的。 在统一文件中,这个主题是很好的描述。 所以有可能创建一个通用函数,允许你从c#调用javascript代码,并在c#中得到它的评估结果。 请记住,它只能在WebPlayer或WebGL中使用,而不能在Editor中使用,因为Application.ExternalCallApplication.ExternalEval只会在Editor中login到编辑器控制台。

 public static void Evaluate(string js, System.Action<string> callback); 

所以实际上你需要在这里使用callback。 唯一的办法是以某种方式存储这些callback。 你可以通过使用和id来做一个肮脏的伎俩。 并将callback存储在密钥为id的字典中。 并将此id附加到jsstring中,所以在javascript中提取id,评估js ,然后将结果与附加的id一起发送。 然后在C#中,再次提取id并从callback字典中获取id的callback函数,并将结果调用callback函数。 听起来令人毛骨悚然 所以这很简单的实现将看起来像

 public class JSEvaluator : MonoBehaviour { private int id; Dictionary<int, Action<string>> callbacks; public static void Evaluate(string js, Action<string> callback) { ++id; callbacks[id] = callback; // ':' is separator to know where id ends Application.ExternalCall("evaluate", id.ToString() + ":" + js); } private void OnJSResult(string result) { var stringSeparators = new string[] {":"}; var res = source.Split(stringSeparators, StringSplitOptions.None); var i = Convert.ToInt32(res[0]); var cb = callbacks[i]; var rem = res[0] + ":"; cb(result.Remove(result.IndexOf(rem), rem.Length);); callbacks.Remove(i); } } 

几个在这里捕捉。 首先,我们增加id 。 对于每个Evaluate电话。 如果你做了很多。 在某些时候,你可能会遇到奇怪的结果。 通过很多我的意思是超过4294967296.我们也不检查有id的结果。

这里也是重要的事情。 OnJSResult不是static 。 你不能从JavaScript调用static方法。 由于SendMessage工作原理。 另外, JSEvaluator必须是MonoBehaviour

在JavaScript中会是这样的。

 function evaluate(input) { var inp = input.split(":"); var id = parseInt(inp[0]); inp.shift(); var arg = inp.join(":"); var result = eval(arg); // for UnityPlayer you need to u.getUnity().SendMessage SendMessage("GameObjectName", "OnJSResult", result); } 

只要不要忘记在场景中创建一个名为JSEvaluator的对象,并附加到它的JSEvaluator 。 我认为这是非常多的。 只要记住一般这个东西不是很好。 但我向你展示了一个交stream的例子。