@iwashin (iwa shin)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

UnityのC#でJavaScriptを呼び出して、JavaScriptからUnityのC#に値を持ってきたい。

解決したいこと

UnityのC#でJavaScriptを呼び出して、JavaScriptからUnityのC#に値を持ってきたい。

該当するソースコード

Atsumaru.gift.total(this.gameObject.name,((Action<string>) this.test).Method.Name);

と書き実行しました。
testメソッドは下のようにし、

public void test(string a){
         Text testn = test.GetComponent<Text> ();
         testn.text = a;
    }

Atsumaruクラスは、

public static class Atsumaru
{
  public static class gift
      {
#if UNITY_WEBGL && !UNITY_EDITOR
         [DllImport("__Internal")]
         private static extern string AtsumaruGiftTotal(string objectName,string objectMethod);
#endif 

    public static void total(string objectName,string objectMethod)
         {

#if UNITY_WEBGL && !UNITY_EDITOR
                 AtsumaruGiftTotal(objectName,objectMethod);         
#endif
           }
}

こう書きました。
jslibは、

AtsumaruGiftTotal:function(objectName,objectMethod){
     window.RPGAtsumaru.gift.getTotalPoints().then(function(v) {unityInstance.SendMessage(objectName,objectMethod,v);});
   }

としました。
しかし、なにも起こりませんでした。
どこが間違っているのかさっぱりです。
どなたかお助けください。

0 likes

1Answer

     window.RPGAtsumaru.gift.getTotalPoints().then(function(v) {unityInstance.SendMessage(objectName,objectMethod,v);});

ここで v の型は Number ですが、この値を C# 側で受け取る

public void test(string a){
         Text testn = test.GetComponent<Text> ();
         testn.text = a;
    }

では a の型が string になっています。何も起こらなかったのであれば Number から string には自動的に変換されないということかもしれません。 anull か空文字列がセットされているか、 test() 自体が呼び出されていないのでは。

数値で受け取るために test(int a) にするか、文字列を送るために unityInstance.SendMessage(objectName, objectMethod ,v.toString()) にしてみてください。

1Like

Comments

  1. @iwashin

    Questioner

    どちらも行ってみましたが、結果は変わらず何も起こりませんでした。
    それどころか
    public void test(string a){
    Text testn = test.GetComponent<Text> ();
    testn.text = "aaa";
    }
    としても何も起こりませんでした。
    test()自体が呼び出せれていないようです。
    どうすればtest()が呼び出されるようになりますか。
  2. @iwashin

    Questioner

    MonoBihaviorを継承したクラスになっています。
  3. 申し訳ないですがちょっと原因が分からないです。
    AtsumaruGiftTotal: function(objectName,objectMethod){
    unityInstance.SendMessage(objectName,objectMethod,"x");
    }
    としてみて test() が呼ばれるか確かめる、また .then(function(v) { console.log("called") }) としてコールバックが呼ばれるか確かめるともう少し問題が切り分けられるかもしれません。
  4. @iwashin

    Questioner

    長い間、親切に答えてくださってありがとうございます。
    .then(function(v) { console.log("called") }) とするとコンソール画面に"called"と表示されました。また、
    .then(function(v) {unityInstance.SendMessage(objectName,objectMethod,v);});
    とすると、object not foundと表示されていました。もっとこのことに早く気付くべきでしたすみません。
    ただ、なぜobject not found になるのかはよくわからず、もしわかるのであれば教えていただきたいです。
  5. プロジェクトを見てみないとなんとも……ですが、 console.log(objectName); でオブジェクト名を表示して、そのオブジェクトがシーンに存在するか、そのオブジェクトに test() を含むスクリプトがアタッチされているかをもう一度確認してみてください。
  6. @iwashin

    Questioner

    そのオブジェクトをクリックしたときをトリガーとしており、
    .then(function(v) { console.log("called") })
    とし、クリックしたとき"called"と呼ばれたため、オブジェクトはシーン内に存在していると思われます。そのオブジェクトにtest()を含むスクリプトもアタッチされていました。

    しかし、
    console.log(objectName);
    では、object not found  となってしまいました。
  7. AtsumaruGiftTotal: function(objectName,objectMethod){
    console.log(objectName);
    }

    これでゲームオブジェクト名ではなく object not found と表示されるということで間違いありませんか? 原因は分かりませんがゲームオブジェクト名が取得できていないようですね。とりあえず JavaScript 側でゲームオブジェクト名を文字列で書いて unityInstance.SendMessage("名前" ,objectMethod, v); とすればいいかもしれません。
  8. @iwashin

    Questioner

    unityInstance.SendMessage("オブジェクト名" ,"メソッド名", v);
    とするとうまくいきました。
    ありがとうございます!
  9. よかったです!

Your answer might help someone💌