Как осуществить сохранение данных в Unity с использованием VKBridge?

Здравствуйте! У VK Bridge имеются два метода для работы с данными: один предназначен для сохранения, а другой — для загрузки. Вот как они работают:

**Метод для сохранения:**
```javascript
bridge.send('VKWebAppStorageSet', { 
    key: 'example', 
    value: 'example_value' 
}).then((data) => { 
    if (data.result) { 
        // Значение переменной задано 
    } 
}).catch((error) => { 
    // Ошибка 
    console.log(error); 
}); 
```

**Метод для загрузки:**
```javascript
bridge.send('VKWebAppStorageGet', { 
    keys: [ 
        'example1', 
        'example2', 
        'example3' 
    ]
}).then((data) => { 
    if (data.keys) { 
        // Значения получены 
    } 
}).catch((error) => { 
    // Ошибка 
    console.log(error); 
}); 
```

У меня возникла проблема: я не понимаю, как передать нужные данные из Unity в методы VK Bridge для их сохранения и последующей выгрузки. 

В Unity я задаю данные для сохранения, используя переменную:
```csharp
public const string HIGH_SCORE_KEY = "HighScore";
```
При загрузке данных я использую метод в `Start` для получения лучшего результата:
```csharp
int highScore = PlayerPrefs.GetInt(HIGH_SCORE_KEY, 0);
```
В условии проверки на новый рекорд я перезаписываю данные:
```csharp
PlayerPrefs.SetInt(HIGH_SCORE_KEY, score);
```

В Unity WebGL это работает корректно, но мне необходимо использовать данный API, чтобы рекорд игрока сохранялся на его странице ВКонтакте, независимо от устройства (ПК, телефон и т.д.). 

Как мне передать необходимые значения из Unity в методы JavaScript?
  • 16 марта 2025 г. 11:04
Ответы на вопрос 1
Чтобы взаимодействовать между Unity и JavaScript, вы можете использовать механизм `Application.ExternalCall` или `Application.ExternalEval` для вызова JavaScript-функций из Unity.

Вот пошаговая инструкция по интеграции VK Bridge в ваш Unity проект:

### 1. Создайте JavaScript функции

Сначала создайте JavaScript функции, которые будут вызываться из Unity и будут взаимодействовать с VK Bridge. Добавьте следующий код в ваш HTML файл, где загружается ваш WebGL проект.

```html
<script>
    function saveToVK(key, value) {
        bridge.send('VKWebAppStorageSet', { key: key, value: value })
            .then((data) => {
                if (data.result) {
                    console.log("Данные сохранены успешно");
                }
            })
            .catch((error) => {
                console.error("Ошибка сохранения данных:", error);
            });
    }

    function loadFromVK(keys) {
        bridge.send('VKWebAppStorageGet', { keys: keys })
            .then((data) => {
                if (data.keys) {
                    console.log("Значения получены:", data.keys);
                    // Здесь вы можете вызвать метод Unity для передачи данных обратно
                    // Например, можно использовать: unityInstance.SendMessage("GameObjectName", "MethodInUnity", value);
                }
            })
            .catch((error) => {
                console.error("Ошибка загрузки данных:", error);
            });
    }
</script>
```

### 2. Вызов JS из Unity

Теперь вы можете использовать C# скрипты в Unity для вызова этих JavaScript функций:

```csharp
using UnityEngine;

public class VKStorageManager : MonoBehaviour
{
    private const string HIGH_SCORE_KEY = "HighScore";

    public void SaveHighScore(int score)
    {
        string jsonValue = JsonUtility.ToJson(new { score = score });
        Application.ExternalCall("saveToVK", HIGH_SCORE_KEY, jsonValue);
    }

    public void LoadHighScore()
    {
        Application.ExternalCall("loadFromVK", new string[] { HIGH_SCORE_KEY });
    }

    // Этот метод будет вызван из JavaScript, когда данные будут загружены
    public void ReceiveHighScore(string jsonValue)
    {
        // Обработка полученных данных
        var data = JsonUtility.FromJson<HighScoreData>(jsonValue);
        Debug.Log("Загруженный рекорд: " + data.score);
    }

    [System.Serializable]
    public class HighScoreData
    {
        public int score;
    }
}
```

### 3. Загрузка данных

Когда вы вызываете метод `LoadHighScore`, он отправит запрос на получение данных по ключу `HIGH_SCORE_KEY`. Когда данные будут получены, вы можете вызвать функцию `ReceiveHighScore`, чтобы обработать их в Unity.

### 4. Пример вызова сохранения

После того как игрок достиг нового рекорда, вы можете сохранить его следующим образом:

```csharp
int score = 100; // Пример текущего счета
SaveHighScore(score);
```

### Заключение

Вам необходимо убедиться, что ваши JavaScript функции находятся в контексте загруженной страницы и доступны для вызова. Таким образом, ваша игра в Unity будет записывать и получать данные из VK Bridge, что обеспечит сохранение рекордов на платформе ВКонтакте.
Похожие вопросы