unity学习笔记-

  • 读写文件遇到的问题
  • 实现的功能
  • 遇到的问题
  • 解决办法


读写文件遇到的问题

实现的功能

给文件名加密,读写的时候都通过这个加密的文件名进行访问写入,通过filestream进行音频的写入,通过www进行文件的访问,通过audioclip.getaudiocompressed、getaudioclip都可以获得audio格式的数据并在unity场景中进行播放

遇到的问题

当文件名称过长时,总会报错

unity游戏的save文件修改_sed


类似这样的问题,在网上搜索也基本和我的问题大相径庭,过程尝试过更换读写的格式以及逻辑的检查,发现都没有什么问题

解决办法

后面试着将文件名强行写成1,想着先解决写入的问题,再去解决读取的问题
然后发现这样一来音频就可以写入了,思考了一番之后感觉可能是文件名称过长导致的,所以试着对文件名进行剪切,然后运行,不报错,也能正常读写和播放。问题解决

下面这是写入本地音频的方法,首先是对名称进行加密和剪切,然后才是写入

public void WriteAudio(byte[] audiodata,string audioName)
    {
        //对文件名进行加密
        audioName = EncAndCut(audioName);
        string path = Application.persistentDataPath + "/" + audioName + ".mp3";
        FileStream sf = new FileStream(path, FileMode.Create,FileAccess.Write);//打开文件流
        sf.Write(audiodata, 0, audiodata.Length);//写入文件
                                                   //关闭文件流
        sf.Close();
        sf.Dispose();
    }

下面这是读取的方法,同样的先用加密的方式获得文件名称,然后用www进行访问,然后直接调用他的getaudioclipcompressed的方法获得unity支持的音频数据格式,传给audioclip。进行播放即可~

public void ReadLocalAudio(string audioName)
    {
        StartCoroutine(RLATimeDelta(audioName));
    }
    IEnumerator RLATimeDelta(string audioName)
    {
        string path = "";
        //对文件名进行加密
        string encFileName = EncAndCut(audioName);
        if (Application.platform == RuntimePlatform.Android)
        {
            path = "file://" + Application.persistentDataPath + "/" + encFileName + ".mp3";
        }
        else if (Application.platform == RuntimePlatform.WindowsEditor)
        {
            path = Application.persistentDataPath + "/" + encFileName + ".mp3";
        }
        WWW test = new WWW(path);
        yield return test;

        GameObject.Find("Music").GetComponent<AudioSource>().volume = 0.01f;
        player.clip = test.GetAudioClipCompressed();
        player.Play();
        yield return new WaitForSeconds(player.clip.length * 1.5f);
        GameObject.Find("Music").GetComponent<AudioSource>().volume = 0.164f;
    }

更新
刚才试了一下, 发现不是文件名称过长导致的,而是在给文件名称加密的时候出现了斜杠,程序对名称进行识别的时候有斜杠的话好像会有歧义,导致无法识别,记录一下

更新解决办法
对加密的数据在进行编码,把斜杠等特殊符号转换成非特殊符号

public static string EncryptDES(string encryptString, string key = 32位的key)
    {
        Debug.Log(SystemInfo.deviceUniqueIdentifier);
        if (string.IsNullOrEmpty(encryptString)) return null;
        Byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptString);

        RijndaelManaged rm = new RijndaelManaged
        {
            Key = Encoding.UTF8.GetBytes(key),
            Mode = CipherMode.ECB,
            Padding = PaddingMode.PKCS7
        };

        ICryptoTransform cTransform = rm.CreateEncryptor();
        Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        string convertStr = Convert.ToBase64String(resultArray, 0, resultArray.Length);
        //上面获得转换成base64编码的加密信息
        //下面再对漆进行编码转换即可
        string strTemp = "";
        byte[] bTemp = Encoding.Default.GetBytes(convertStr);
        for (int i = 0; i < bTemp.Length; i++)
        {
            strTemp += bTemp[i].ToString("X2");
        }
        return strTemp;
        //return StrToHex;


    }