Cómo almacenar datos locales en minijuegos de Unity-to-WeChat

fondo del problema

Recientemente, al convertir Unity en un juego pequeño, descubrí que al leer y escribir archivos locales, el uso de la Application.persistentDataPathruta de caché para guardar el archivo fallaba debido a la limitación de la plataforma de WebGL. Por lo tanto, el código original para leer y escribir archivos locales debe modificarse según la plataforma.

Una de las formas más fáciles es almacenar PlayerPrefsel contenido almacenado originalmente en el archivo y usarlo en la plataforma WebGL. Por ejemplo, escribiendo así:

Hay PlayerPrefsun problema de lectura lenta por primera vez, puede usar el complemento de WeChat Mini Game para agregar la clave usada. Cómo usar: WeChat Mini Game -> PlayerPrefs Optimization:

Por lo tanto, cuando hay muchos archivos o datos para almacenar, todavía esperamos completar la lectura y escritura del archivo sin modificar la lógica original de lectura y escritura tanto como sea posible. Entonces WeChat nos lo proporcionó WX.env.USER_DATA_PATH.


Mini juego de WeChat para leer y escribir archivos locales

Después de que Unity se convierte en un minijuego de WeChat File.WriteAllTexty File.ReadAllTextdebido a problemas de ruta, no surte efecto.

En su lugar, utilice la ruta proporcionada por el complemento del mini juego de WeChat. El código del complemento:

El código de ejemplo es el siguiente:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using WeChatWASM;

public class SaveFile : MonoBehaviour
{
    
    
    // 文件类型
    private PlayerData m_PlayerData;

    // 文件名称
    private string fileName = "/PlayerData.txt";

    private void OnGUI()
    {
    
    
        if (GUI.Button(new Rect(100, 100, 200, 200), "读取文件"))
        {
    
    
            LoadPlayerData();
        }

        if (GUI.Button(new Rect(100, 400, 200, 200), "写入文件"))
        {
    
    
            WritePlayerData();
        }
    }

    /// <summary>
    /// 读取文件
    /// </summary>
    private void LoadPlayerData()
    {
    
    
#if UNITY_WEBGL
        WXFileSystemManager fs = WX.GetFileSystemManager();
        
        // 判断是否存在目录
        if (fs.AccessSync(WX.env.USER_DATA_PATH + fileName).Equals("ok"))
        {
    
    
            // 读取内容
            string playerDataString = fs.ReadFileSync(WX.env.USER_DATA_PATH + fileName, "utf-8");
            if (playerDataString != "")
            {
    
    
                m_PlayerData = LitJson.JsonMapper.ToObject<PlayerData>(playerDataString);
            }
        }

        Debug.Log($" 读取文件 姓名:{
      
      m_PlayerData.name} 年龄:{
      
      m_PlayerData.age}");
#endif
    }

    /// <summary>
    /// 写入文件
    /// </summary>
    private void WritePlayerData()
    {
    
    
        m_PlayerData = new PlayerData();
        m_PlayerData.name = "Czhenya";
        m_PlayerData.age = 18;
        Debug.Log($" 写入文件 姓名:{
      
      m_PlayerData.name} 年龄:{
      
      m_PlayerData.age}");

        string playerData = LitJson.JsonMapper.ToJson(m_PlayerData);
#if UNITY_WEBGL
        WXFileSystemManager fs = WX.GetFileSystemManager();
        fs.WriteFileSync(WX.env.USER_DATA_PATH + fileName, playerData, "utf-8");
#endif
    }
}

public class PlayerData
{
    
    
    public string name;
    public int age;
}

Resultado de la prueba:
el error de leer el archivo sin verificar si existe el directorio local:
puede ver que la siguiente lectura y guardado son exitosos:


PD: si solo necesita leer archivos, los archivos de la carpeta StreamingAssets se pueden UnityWebRequestleer en la plataforma WebGL.


Algunas limitaciones de la plataforma WebGL

Debido a las limitaciones de la plataforma, algunas funciones no son compatibles con WebGL:

  • No es compatible con subprocesos múltiples, porque JavaScript no es compatible con subprocesos múltiples, así que no use clases en el espacio de nombres System.Threading;
  • Socket no se puede usar directamente, incluido cualquier tipo en System.Net, algunos tipos en System.Net.Sockets y UnityEngine.Network. Si necesita usar funciones de red en la plataforma WebGL, puede usar WWW o UnityWebRequest, que se basan en el protocolo Http Si necesita un alto rendimiento en tiempo real, puede elegir WebSockets o WebRTC;
  • WebGL 1.0 se basa en OpenGL ES 2.0 y WebGL 2.0 se basa en OpenGL ES 3.0, por lo que existen las restricciones correspondientes;
  • WebGL es AOT (por adelantado, es decir, una plataforma de compilación estática, por lo que los tipos de System.Reflection.Emit no se pueden usar para la generación de código, y lo mismo ocurre con IL2CPP e iOS.

Error al ver el método compartido

Después de cambiar al minijuego, puede ver el registro de errores en el teléfono activando el modo de depuración. El registro de errores es el siguiente:

excepción lanzada: Runtiseerror: la función nula o la firma de la función no coinciden. Rurtimcerro: función nula o discrepancia de firma de función

Mini Progran Error función nula o firma de función no coincideRuntimeerror: función nula o firma de función no coincide

Estos dos párrafos de error se desencadenan por el mismo problema. La primera vez que vi este tipo de informe de error, estaba perdido y no sabía por dónde empezar. Después de mirar dos líneas, encontré la función que escribí yo mismo: el método en la ScreenRatiosFilterclase Fit. Ya ubiqué el método de informe de errores, por lo que no necesito hablar sobre los siguientes problemas.

Ahora que has visto esto, déjame decirte el secreto : realmente no puedo decir dónde se informó el error, y no se puede reproducir en el editor. Haz el registro y luego reproduce el error, de modo que puede localizar el error específico. Se informó el número incorrecto de líneas.

También encontré un problema extraño y lo grabé juntos. Espero que pueda inspirarte: una parte de la lógica del juego solo informa un error en el mini juego, y el editor y otros extremos están bien. Más tarde, agregué una try...catchcaptura una vez, no hice ningún otro procesamiento, y luego resultó ser fácil de usar...

Supongo que te gusta

Origin blog.csdn.net/Czhenya/article/details/129754007
Recomendado
Clasificación