/// <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(); } }
/// <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(); } }