Доступ к списку C # из JavaScript - PullRequest
       8

Доступ к списку C # из JavaScript

0 голосов
/ 27 февраля 2019

В рамках нашей стажировки нам было поручено создать бизнес-приложение с использованием Unity WebGL.После прочтения взаимодействий между JS и кодом C # мы находимся в углу.
Мы пытаемся вернуть список из C #, чтобы заполнить Select на нашей веб-странице, и мы просто не знаем, как это сделать.Мы следовали документации Unity и можем легко общаться и возвращать данные для использования в нашем C # с нашей веб-страницы.
Однако мы не можем получить доступ к данным C # в нашем браузере.Метод SendMessage () не разрешает возврат.
Вот наш код на данный момент

index.html

          <select id="wallsSelect"></select>

jsfile

    function getWallsList() {
    //function is called at the creation of our object
    var wallsSelect = document.getElementById("wallsSelect");
    index = 0;
    var wallsList = gameInstance.SendMessage('WallCreator', 'GetGameObjects'); //would like to get back our list of walls and populate our Select with it

    for (item in wallsList) {
        var newOption = document.createElement("option");
        newOption.value = index;
        newOption.innerHTML = item;

        wallsSelect.appendChild(newOption);
        index++;
    }

C # код наконец

public List<string> GetGameObjects()
{
    List<string> goNames = new List<string>();
    foreach (var item in goList)
    {
        goNames.Add(item.name);
    }
    Debug.Log("Accessed GetGameObjects method. GameObject count = " + goNames.Count.ToString()); //The object is instanciated and return the right count number so it does work without a problem
    return goNames;

}

Да, мы проверили https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html, и я провел множество исследований и обнаружил некоторые интересные ресурсы, которые я не могу обернуть, будучи слишком неопытным, например http://tips.hecomi.com/entry/2014/12/08/002719

В заключение я хотел бы отметить, что это наш первый проект «в реальном мире», и Unity-WebGL - это очень полезный опыт, чтобы увидеть отсутствие документации.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Хорошо, после тщательного прочтения документа по Unity и некоторой помощи нашего технического лидера я нашел «достаточно хорошее» решение.

Unity дает вам возможность вызывать функции JS из кода C # для связи сВаша HTML-страница, на которой находится ваш модуль Unity.Мне пришлось создать «фиктивный» класс, который можно сериализовать и просто сохранить имя и координаты моего объекта.

C # код

 //We create a class with the Serializable attribute and stock the name and size of our GameObject 

[Serializable]
    public class SzModel
    {
        public string modelName;
        public Vector3 modelSize;
    }

//we have to import our .jslib method into our C# (see below)
    [DllImport("__Internal")]
    private static extern void UpdateModel(string model);

//We use our dummy class to create a JSON parseable list of those objects
    void WallsList()
    {
        List<SzModel> szModelList = new List<SzModel>();
        foreach (var item in goList)
        {
            SzModel newWall = new SzModel();
            newWall.modelName = item.Name;
            newWall.modelSize = item.Size;
            szModelList.Add(newWall);
        }

        UpdateModel(JsonHelper.ToJson<SzModel>(szModelList.ToArray(), true));
    }

//We create an helper class to be able to use JsonUtility on list
//code can be found here -> https://stackoverflow.com/a/36244111/11013226

После этого нам нужно проинформировать нашу HTML-страницу оновый объект, мы используем метод UpdateModel (), чтобы сделать это.Unity использует файлы .jslib для связи между C # (который преобразуется в код JS во время сборки) и нашим браузером.Таким образом, мы можем объявить функцию в этом файле .jslib.Эти файлы находятся в Asset / Plugins и автоматически конвертируются при сборке.Как вы можете видеть ниже, мы должны использовать метод Pointer_stringify, чтобы получить обратно наши данные json, а не только указатель на них.

.jslib file

mergeInto (LibraryManager.library, {

    UpdateModel : function(model){
        model = Pointer_stringify(model);
        updateModel(model);
    },
//rest of code
});

И, наконец, я могу использовать свойДанные json на моей веб-странице, в данном случае для отображения списка названий стен.

function updateModel(model) {
    var jsonWallsList = JSON.parse(model);
    var wallsList = document.getElementById("wallsSelect"),
        option,
        i = jsonWallsList.Items.length - 1,
        length = jsonWallsList.Items.length;

    for (; i < length; i++) {
        option = document.createElement('option');
        option.setAttribute('value', jsonWallsList.Items.modelName);
        option.appendChild(document.createTextNode(jsonWallsList.Items[i]['modelName']));
        wallsList.appendChild(option);
    }
}

, которые дают следующее при выборе на моей веб-странице a select from C# in Unity-webgl

0 голосов
/ 27 февраля 2019

Я думаю, вы должны попытаться использовать скрытые поля в вашем HTML, которые вы можете изменить с помощью C #.Затем вы можете получить доступ к этим данным с помощью JavaScript.Например:

HTML:

<input type="hidden" value="currentValue" id="hiddenField1">

C #:

private void changeHiddenField(){

    hiddenField1.Value = "differentValue";

}

JS:

var hiddenFieldVal = document.getElementById("hiddenField1").value;

Подробнее о скрытых полях в HTMLhttps://www.w3schools.com/tags/att_input_type_hidden.asp

Прошу прощения за любые синтаксические ошибки.

...