/// <summary>
        /// AssetBundleの読み込みと展開
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name"></param>
        /// <param name="assets"></param>
        /// <param name="action"></param>
        /// <param name="progress"></param>
        /// <returns></returns>
        public static IEnumerator AssetBundleFile <T>(string name, string[] assets, Action <T[]> action, Action <float> progress = null) where T : UnityEngine.Object
        {
            byte[] data = null;
            Debug.Log("Load File");
            yield return(FileIOControl.ReadBytesFile(name, (d) => data = d));

            Debug.Log("Load AssetBundle");
            yield return(assetBundleData <T>(data, assets, action, progress));

            Debug.Log("Load Complete");
        }
        /// <summary>
        /// Photoフォルダから画像ファイルを取得
        /// </summary>
        /// <param name="name"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public static IEnumerator LoadPhoto(string name, Action <Texture2D> action)
        {
            Texture2D tex = null;

            byte[] data = null;
#if UNITY_UWP
            uint w = 0, h = 0;
            var  task = Task.Run(async() =>
            {
                var file = await KnownFolders.CameraRoll.GetFileAsync(name);
                if (file != null)
                {
                    var img     = await file.OpenReadAsync();
                    var decoder = await BitmapDecoder.CreateAsync(img);
                    var pixel   = await decoder.GetPixelDataAsync();
                    var bytes   = pixel.DetachPixelData();
                    w           = decoder.PixelWidth;
                    h           = decoder.PixelHeight;
                    data        = new byte[bytes.Length];
                    // 取得データは上下が反転している
                    for (var i = 0; i < h; i++)
                    {
                        for (var j = 0; j < w; j++)
                        {
                            data[(w * (h - 1 - i) + j) * 4 + 0] = bytes[(w * i + j) * 4 + 0];
                            data[(w * (h - 1 - i) + j) * 4 + 1] = bytes[(w * i + j) * 4 + 1];
                            data[(w * (h - 1 - i) + j) * 4 + 2] = bytes[(w * i + j) * 4 + 2];
                            data[(w * (h - 1 - i) + j) * 4 + 3] = bytes[(w * i + j) * 4 + 3];
                        }
                    }
                }
            });
            yield return(new WaitWhile(() => task.IsCompleted == false));

            tex = new Texture2D((int)w, (int)h, TextureFormat.BGRA32, false);
            tex.LoadRawTextureData(data);
#elif UNITY_EDITOR || UNITY_STANDALONE
            tex = new Texture2D(1, 1);
            yield return(FileIOControl.ReadBytesFile(FileIOControl.LocalFolderPath + "\\" + name, (b) => data = b));

            tex.LoadImage(data);
#endif
            tex.Apply();
            yield return(null);

            if (action != null)
            {
                action.Invoke(tex);
            }
        }
        /// <summary>
        /// Photoフォルダにpng画像ファイルを保存
        /// </summary>
        /// <param name="name"></param>
        /// <param name="tex"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public static IEnumerator SavePhoto(string name, Texture2D tex, Action action)
        {
            var data = tex.EncodeToPNG();

#if UNITY_UWP
            var task = Task.Run(async() =>
            {
                var file = await KnownFolders.CameraRoll.CreateFileAsync(name + ".png", CreationCollisionOption.ReplaceExisting);
                await FileIO.WriteBytesAsync(file, data);
            });
            yield return(new WaitWhile(() => task.IsCompleted == false));
#elif UNITY_EDITOR || UNITY_STANDALONE
            yield return(FileIOControl.WriteBytesFile(FileIOControl.LocalFolderPath + "\\" + name + ".png", data));
#endif
            yield return(null);

            if (action != null)
            {
                action.Invoke();
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// WAVファイルでAudioClipデータを保存する
        /// </summary>
        /// <param name="audioClip"></param>
        /// <param name="name"></param>
        /// <param name="complete"></param>
        /// <returns></returns>
        public static IEnumerator CreateWAVData(AudioClip audioClip, string name, Action complete)
        {
            // 周波数
            var frequency = audioClip.frequency;
            // チャンネル
            var channels = (short)audioClip.channels;
            // 再生時間
            var audiolength = audioClip.length;
            // 音声データ
            var bufdata = new float[frequency * channels * (int)audiolength];

            audioClip.GetData(bufdata, 0);
            // WAV保存データ
            var alldata = new byte[frequency * channels * 2 * (int)audiolength + 44];

            // 保存処理は非同期で行う
#if UNITY_UWP
            Task task = Task.Run(() =>
            {
#elif UNITY_EDITOR || UNITY_STANDALONE
            Thread thread = new Thread(() =>
            {
#endif
                // WAV header
                var riff = Encoding.UTF8.GetBytes("RIFF");
                Array.Copy(riff, 0, alldata, 0, 4);
                var alllength = BitConverter.GetBytes((int)alldata.Length - 8);
                Array.Copy(alllength, 0, alldata, 4, 4);
                var wave = Encoding.UTF8.GetBytes("WAVE");
                Array.Copy(wave, 0, alldata, 8, 4);
                var fmt = Encoding.UTF8.GetBytes("fmt ");
                Array.Copy(fmt, 0, alldata, 12, 4);
                var format = BitConverter.GetBytes((int)16);
                Array.Copy(format, 0, alldata, 16, 4);
                var code = BitConverter.GetBytes((short)1);
                Array.Copy(code, 0, alldata, 20, 2);
                var channel = BitConverter.GetBytes(channels);
                Array.Copy(channel, 0, alldata, 22, 2);
                var sample = BitConverter.GetBytes(frequency);
                Array.Copy(sample, 0, alldata, 24, 4);
                var second = BitConverter.GetBytes(frequency * channels * (int)audiolength * 2);
                Array.Copy(second, 0, alldata, 28, 4);
                var block = BitConverter.GetBytes((short)(16 * channels / 8));
                Array.Copy(block, 0, alldata, 32, 2);
                var bit = BitConverter.GetBytes((short)16);
                Array.Copy(bit, 0, alldata, 34, 2);
                var data = Encoding.UTF8.GetBytes("data");
                Array.Copy(data, 0, alldata, 36, 4);
                var alllength2 = BitConverter.GetBytes((int)alldata.Length - 44);
                Array.Copy(alllength2, 0, alldata, 40, 4);

                // WAV Raw
                var vdata = new byte[frequency * channels * 2 * (int)audiolength];
                for (var i = 0; i < bufdata.Length; i++)
                {
                    var buf     = (short)(bufdata[i] * 32767);
                    var bytearr = new byte[2];
                    bytearr     = BitConverter.GetBytes(buf);
                    bytearr.CopyTo(vdata, i * 2);
                }
                Array.Copy(vdata, 0, alldata, 44, vdata.Length);
                //
#if UNITY_UWP
            });
            yield return(new WaitWhile(() => task.IsCompleted == false));
#elif UNITY_EDITOR || UNITY_STANDALONE
            });
            thread.Start();
            yield return(new WaitWhile(() => thread.IsAlive == true));
#endif
            // LocalFolderに保存
            yield return(FileIOControl.WriteBytesFile(FileIOControl.LocalFolderPath + "\\" + name, alldata));

            if (complete != null)
            {
                complete.Invoke();
            }
        }