diff --git a/Assets/uDesktopMascot/Scripts/Utility/LoadFBX.cs b/Assets/uDesktopMascot/Scripts/Utility/LoadFBX.cs index 41b6b65..2a6d518 100644 --- a/Assets/uDesktopMascot/Scripts/Utility/LoadFBX.cs +++ b/Assets/uDesktopMascot/Scripts/Utility/LoadFBX.cs @@ -23,10 +23,13 @@ public static class LoadFBX /// 指定されたパスのFBXモデルを非同期的に読み込み、GameObjectを返します。 /// /// モデルファイルのパス(StreamingAssetsからの相対パス) - /// + /// テクスチャファイルのパスのリスト /// /// 読み込まれたモデルのGameObjectを返すUniTask - public static async UniTask LoadModelAsync(string modelPath, List texturePaths, CancellationToken cancellationToken) + public static async UniTask LoadModelAsync( + string modelPath, + List texturePaths, + CancellationToken cancellationToken) { // モデルファイルのフルパスを作成 string fullModelPath = ResolvePath(modelPath); @@ -48,7 +51,9 @@ public static async UniTask LoadModelAsync(string modelPath, List LoadModelAsync(string modelPath, List() }; + // テクスチャパスが一つのみの場合、その一つを全てのマテリアルに適用する + bool isSingleTexture = texturePaths != null && texturePaths.Count == 1; + // マテリアルを処理 int textureIndex = 0; + int textureCount = texturePaths != null ? texturePaths.Count : 0; + foreach (var assimpMaterial in scene.Materials) { string texturePath = null; - if (texturePaths != null && textureIndex < texturePaths.Count) + + if (texturePaths != null && textureCount > 0) { - texturePath = texturePaths[textureIndex]; - textureIndex++; + if (isSingleTexture) + { + // テクスチャパスが一つだけの場合、全てのマテリアルにそのテクスチャを適用 + texturePath = texturePaths[0]; + } + else + { + if (textureIndex < textureCount) + { + texturePath = texturePaths[textureIndex]; + } + else + { + // テクスチャの数がマテリアルの数より少ない場合、最後のテクスチャを使用 + texturePath = texturePaths[textureCount - 1]; + } + } } else { - Log.Warning("[LoadFBX] テクスチャパスが不足しています。マテリアル '{0}' にテクスチャが割り当てられません。", assimpMaterial.Name); + Log.Warning("[LoadFBX] テクスチャパスが指定されていません。" + + "マテリアル '{0}' にテクスチャが割り当てられません。", assimpMaterial.Name); } + textureIndex++; + var materialData = await ProcessMaterialAsync(assimpMaterial, texturePath); data.Materials.Add(materialData); } @@ -133,7 +162,9 @@ public static async UniTask LoadModelAsync(string modelPath, List /// AssimpのマテリアルをMaterialDataに非同期で変換する /// - private static async UniTask ProcessMaterialAsync(AssimpMaterial assimpMaterial, string texturePath) + private static async UniTask ProcessMaterialAsync( + AssimpMaterial assimpMaterial, string texturePath) { MaterialData materialData = new MaterialData(); @@ -290,12 +323,13 @@ private static async UniTask ProcessMaterialAsync(AssimpMaterial a } else { - Log.Warning("[LoadFBX] テクスチャパスが指定されていません。マテリアル '{0}' にテクスチャが割り当てられません。", assimpMaterial.Name); + Log.Warning("[LoadFBX] テクスチャパスが指定されていません。" + + "マテリアル '{0}' にテクスチャが割り当てられません。", assimpMaterial.Name); } return materialData; } - + /// /// パスを解決してフルパスを返す /// @@ -308,10 +342,7 @@ private static string ResolvePath(string path) return null; } - var fullPath = - // 絶対パスの場合、そのまま使用 - Path.IsPathRooted(path) ? path : - // 相対パスの場合、StreamingAssets フォルダを基準とする + var fullPath = Path.IsPathRooted(path) ? path : Path.Combine(Application.streamingAssetsPath, path); return fullPath; @@ -329,32 +360,36 @@ private static async UniTask ReadAllBytesAsync(string path) } // Unity 2017 以前の場合 - await using FileStream sourceStream = new FileStream( - path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true); - long fileLength = sourceStream.Length; - byte[] result = new byte[fileLength]; + using (FileStream sourceStream = new FileStream( + path, FileMode.Open, FileAccess.Read, FileShare.Read, + bufferSize: 4096, useAsync: true)) + { + long fileLength = sourceStream.Length; + byte[] result = new byte[fileLength]; - int totalBytesRead = 0; + int totalBytesRead = 0; - while (totalBytesRead < fileLength) - { - var bytesRead = await sourceStream.ReadAsync(result, totalBytesRead, - (int)(fileLength - totalBytesRead)); - if (bytesRead == 0) + while (totalBytesRead < fileLength) { - break; // ストリームの終端に達した場合 + var bytesRead = await sourceStream.ReadAsync( + result, totalBytesRead, + (int)(fileLength - totalBytesRead)); + if (bytesRead == 0) + { + break; // ストリームの終端に達した場合 + } + + totalBytesRead += bytesRead; } - totalBytesRead += bytesRead; - } + if (totalBytesRead != fileLength) + { + Log.Warning("[LoadFBX] 予期しないEOFによりファイルの読み込みが完了しませんでした: {0}", path); + // 必要に応じて、部分的に読み込んだデータを処理するか、エラーを返す + } - if (totalBytesRead != fileLength) - { - Log.Warning("[LoadFBX] 予期しないEOFによりファイルの読み込みが完了しませんでした: {path}", path); - // 必要に応じて、部分的に読み込んだデータを処理するか、エラーを返す + return result; } - - return result; } ///