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