Unity 5.6 - Ошибка при вызове функции Unity из WebGL SendMessage

Вызов SendMessage:

gameInstance.SendMessage("MessageReceiver", "Test", "This is a message", "myname");

Сообщение об ошибке:

Не удалось вызвать функцию Test класса MessageReceiver

Вызов функции Test с 1 параметром, но для функции требуется 2.

(Имя файла: Строка: 810)

И определение функции:

public void Test(string message, string name) {
    // If the call from JavaScript succeeds, an alert will show up on the page
    Application.ExternalEval("alert('it works')");
}

Первый параметр «MessageReceiver» - это игровой объект Unity, к которому прикреплен скрипт.

Второй, «Test», - это имя вызываемой функции.

Остальные параметры передаются вызываемой функции, в моем случае «Test».

Как видите, я передаю 2 строковых параметра, что и получает "Test". Почему же тогда появляется сообщение о том, что я вызываю функцию с 1 параметром? Любая помощь будет оценена.


person SoKeT    schedule 27.04.2017    source источник
comment
Что такое gameInstance?   -  person Programmer    schedule 27.04.2017
comment
@Programmer Необходимо, чтобы игра запускалась в сети: var gameInstance = UnityLoader.instantiate("gameContainer", "Build/WebGL.json");   -  person SoKeT    schedule 27.04.2017
comment
Похоже, функция выпуска 5.6. Что происходит, когда вы используете ' вместо " ?. Например gameInstance.SendMessage('MessageReceiver', 'Test', 'This is a message', 'myname');. Не совсем уверен, что это полезно, но также попробуйте добавить еще один параметр и посмотреть, что произойдет. Попробуйте вызвать функцию вообще без параметра. Проведите эксперимент и сообщите нам, где он ломается. Может, вообще выйдет из строя без параметров ....   -  person Programmer    schedule 27.04.2017
comment
@Programmer Я вчера заставил его работать на консоли Chrome с помощью ", так что это не должно быть проблемой. Вызов работает хорошо, когда у принимающей функции один параметр или нет, но он терпит неудачу, если у него 2 или более параметров, даже если вы передаете больше параметров при вызове.   -  person SoKeT    schedule 27.04.2017


Ответы (1)


Вы не можете сделать это ни с текущей версией Unity (v2018.4.8f1), ни с любыми предыдущими версиями.

Вы можете проверить, что делает gameInstance.sendMessage:

На самом деле он просто вызывает gameInstance.Module.SendMessage:

function ƒ() {
  if (a.Module.SendMessage)
    return a.Module.SendMessage.apply(a.Module, arguments)
}

Что игнорирует несколько параметров:

function SendMessage(gameObject, func, param) {
  if (param === undefined) Module.ccall("SendMessage", null, ["string", "string"], [gameObject, func]);
  else if (typeof param === "string") Module.ccall("SendMessageString", null, ["string", "string", "string"], [gameObject, func, param]);
  else if (typeof param === "number") Module.ccall("SendMessageFloat", null, ["string", "string", "number"], [gameObject, func, param]);
  else throw "" + param + " is does not have a type which is supported by SendMessage."
}

Обычно разработчики Unity WebGl2 действительно используют несколько методов на стороне C #. Однако в некоторых случаях невозможно использовать несколько методов на стороне C #, поэтому они придерживаются строки для нескольких параметров (потому что, как вы можете видеть, в JS поддерживаются только числа и строки).

Вы можете отправить несколько параметров из C # в JS.

Вы можете отправить только один параметр из JS в C #.

В обоих случаях вы можете отправлять только строки или числа (int, float, double).

person RajmondX    schedule 18.10.2019