🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Emscripten

Emscripten は JavaScript に変換するコンパイラです。 C/C++ から生成される LLVM ビットコードをJavaScript に変換します。

Q&A

1回答

4695閲覧

JS(.jslib)からUnityにデータ(TypedArray)の送信がうまくいきません。

turbgraphics200

総合スコア4269

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Emscripten

Emscripten は JavaScript に変換するコンパイラです。 C/C++ から生成される LLVM ビットコードをJavaScript に変換します。

0グッド

0クリップ

投稿2016/12/18 15:00

編集2016/12/18 22:17

###前提・実現したいこと
Unityで、UnityからJS(.jslib)とJSからUnityにデータ(TypedArray)を送信するテストコードを書いたのですが、UnityからJSへの送信はうまくいくのですが、JS(.jslib)からUnityへデータを送信するのが、文字列は送信できるのですがTypedArrayの送信がうまくいきません。
(.jslibとはこのページの「プラグインから JavaScript の関数を呼び出す」に書かれている.jslibのことを言います)

###該当のソースコード
ソースコードはGitHubにもあげてあります。
GitHub

文字数の制限で全体のコードは載せられませんが一応省略したコードを載せておきます。

C#

1// jslibbridge.cs 2using UnityEngine; 3using System.Runtime.InteropServices; 4using System; 5using AOT; 6using System.Collections.Generic; 7using System.Text; 8 9public class jslibbridge : MonoBehaviour { 10 11    delegate void dlgReceiveTextData(string txt, int len); 12 delegate void dlgReceiveByteArrayData(byte[] data, int length); 13 delegate void dlgReceiveSByteArrayData(sbyte[] data, int length); 14    delegate void dlgReceiveDoubleArrayData(double[] data, int length); 15 16 [DllImport("__Internal")] 17 static extern uint initCallback( 18 dlgReceiveTextData onText, 19 dlgReceiveSByteArrayData onSByteArray, 20 dlgReceiveByteArrayData onByteArray, 21        dlgReceiveDoubleArrayData onDoubleArray 22 ); 23 24 [MonoPInvokeCallback(typeof(dlgReceiveTextData))] 25 static void OnText(string txt, int len) 26 { 27 Debug.Log("recieve text: " + txt); 28 } 29 30 static void debuglogReceiveData<T>(string type, T[] data, int length) 31 { 32 var sb = new StringBuilder(); 33 sb.Append("Receive " + type + " array: (length: " + length + ") ["); 34 var spl = ""; 35 for (var i = 0; i < length; i++) 36 { 37 sb.Append(spl + data[i]); 38 spl = ", "; 39 } 40 sb.Append("]"); 41 Debug.Log(sb.ToString()); 42 } 43 44 [MonoPInvokeCallback(typeof(dlgReceiveSByteArrayData))] 45 static void OnSByteArray([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1, SizeParamIndex = 1)] sbyte[] data, int length) 46 { 47 debuglogReceiveData<sbyte>("sbyte", data, length); 48 } 49 50 [MonoPInvokeCallback(typeof(dlgReceiveByteArrayData))] 51 static void OnByteArray([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U1, SizeParamIndex = 1)] byte[] data, int length) 52 { 53 debuglogReceiveData<byte>("byte", data, length); 54 } 55 56    static void OnDoubleArray([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8, SizeParamIndex = 1)] double[] data, int length) 57 { 58 debuglogReceiveData<double>("double", data, length); 59 } 60 61 [DllImport("__Internal")] 62 private static extern void testSendDataToUnity(); 63 64 void Start() 65 { 66 initCallback(OnText, OnSByteArray, OnByteArray, OnDoubleArray); 67 68        testSendDataToUnity(); 69 } 70 71}

js

1// MyPlugin.jslib 2var MyPlugin = { 3 $cbobj: {}, 4 5    $sendDataToUnity: function(data, heap, callback) { 6 var writeData = typeof data === 'string' ? (new TextEncoder).encode(data + String.fromCharCode(0)) : data; 7 var buffer = _malloc(writeData.length * (data.BYTES_PER_ELEMENT || 1)); 8 debugger; 9 heap.set(writeData, buffer / (data.BYTES_PER_ELEMENT || 1)); 10 Runtime.dynCall('vii', callback, [buffer, writeData.length]); 11 _free(buffer); 12 }, 13 14 initCallback: function(onText, onByteArray, onSByteArray, onShortArray, onUShortArray, onIntArray, onUIntArray, onFloatArray, onDoubleArray) { 15 cbobj.onText = onText; 16 cbobj.onByteArray = onByteArray; 17 cbobj.onSByteArray = onSByteArray; 18 cbobj.onShortArray = onShortArray; 19 cbobj.onUShortArray = onUShortArray; 20 cbobj.onIntArray = onIntArray; 21 cbobj.onUIntArray = onUIntArray; 22 cbobj.onFloatArray = onFloatArray; 23 cbobj.onDoubleArray = onDoubleArray; 24 }, 25 26 sbyteArrayTest: function(ptr, size) { 27 receiveDataFromUnity('sbyte', HEAP8, ptr, size); 28 }, 29    doubleArrayTest: function(ptr, size) { 30 receiveDataFromUnity('double', HEAPF64, ptr, size); 31 }, 32 33 testSendDataToUnity: function() { 34 sendDataToUnity('hoge_fuga_piyo', HEAPU8, cbobj.onText); 35 sendDataToUnity(new Int8Array([1, 2, 3]), HEAP8, cbobj.onSByteArray); 36 sendDataToUnity(new Uint8Array([1, 2, 3]), HEAPU8, cbobj.onByteArray); 37        sendDataToUnity(new Float64Array([1, 2, 3]), HEAPF64, cbobj.onDoubleArray); 38 } 39}; 40 41autoAddDeps(MyPlugin, '$sendDataToUnity'); 42mergeInto(LibraryManager.library, MyPlugin);

いろいろと調べてはみたものの、どこが悪いのかがいまだに検討がつかないでいます。
もし、どこを修正すればいいのかわかる方がいらっしゃればご教授のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

emscripten-library-generatorコマンドをnpmでインストールすると通常のjsをjslibに自動変換できます。
emscripten-library-generator --unresolvedでどこが悪いのかをjsonで吐き出してくれる機能があるのでそれを使ってみるとよいでしょう。

投稿2017/01/13 07:45

GeneralD

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問