Unity 中动态加载的 3D 人物模型大小的设置

在 Unity 中动态加载的 3D 人物模型大小的设置,通常涉及到模型的缩放(Scale)调整,因为加载的模型可能是从外部资源(如 AssetBundle、文件路径等)导入的,其原始尺寸可能与你的场景需求不匹配。以下是一些具体步骤和方法,帮助你在动态加载时设置 3D 人物模型的大小:



 1. 理解模型的加载方式
动态加载 3D 模型时,通常会使用以下方式:
 Resources.Load:从 Resources 文件夹加载预制体(Prefab)。
 AssetBundle:从外部资源包加载模型。
 FBX/OBJ 等文件加载:通过脚本运行时导入。

无论哪种方式,加载后你都会得到一个 GameObject,然后可以调整它的缩放。



 2. 调整模型的缩放(Scale)
加载模型后,可以通过脚本修改其 Transform.localScale 属性来设置大小。例如:

csharp
// 示例代码:加载并调整模型大小
GameObject model = Instantiate(Resources.Load<GameObject>("CharacterPrefab")); // 加载预制体
model.transform.localScale = new Vector3(2f, 2f, 2f); // 设置缩放为原始大小的 2 倍


 localScale 是一个 Vector3,分别表示 X、Y、Z 轴的缩放比例。
 如果模型太大,设为小于 1 的值(例如 0.5f 表示缩小到一半);如果太小,设为大于 1 的值。



 3. 根据场景需求动态计算缩放
如果你希望模型大小与场景中的某个参考对象匹配,可以通过计算比例来设置。例如:
 假设场景中标准人物高度是 1.8 单位(Unity 默认单位为米),而加载的模型高度是 18 单位。
 计算缩放比例:目标高度 / 模型高度 = 1.8 / 18 = 0.1。
 然后应用缩放:

csharp
GameObject model = Instantiate(Resources.Load<GameObject>("CharacterPrefab"));
float targetHeight = 1.8f; // 目标高度
float modelHeight = model.GetComponent<Renderer>().bounds.size.y; // 获取模型实际高度
float scaleFactor = targetHeight / modelHeight; // 计算缩放因子
model.transform.localScale = new Vector3(scaleFactor, scaleFactor, scaleFactor);




 4. 在 Inspector 中预设缩放(可选)
如果模型是预制体(Prefab),可以在加载前手动调整预制体的缩放:
 将模型拖入场景,调整 Transform 的 Scale。
 保存为预制体后,加载时会保留这个缩放值。
 但如果是运行时加载的外部模型(例如 FBX),只能通过脚本动态调整。



 5. 注意模型的比例和动画
 非均匀缩放:如果 X、Y、Z 的缩放值不同(例如只放大高度),可能会导致模型变形或动画失真。
 动画适配:如果模型带有动画,建议保持均匀缩放(X=Y=Z),否则可能需要调整动画控制器。
 导入设置:在 Unity 中导入模型时,可以在 Model 选项卡中设置 Scale Factor,但这只影响静态模型,动态加载仍需脚本调整。



 6. 示例完整代码
以下是一个动态加载并设置模型大小的完整示例:

csharp
using UnityEngine;

public class LoadModelExample : MonoBehaviour
{
    void Start()
    {
        // 动态加载模型
        GameObject modelPrefab = Resources.Load<GameObject>("CharacterPrefab");
        if (modelPrefab != null)
        {
            GameObject model = Instantiate(modelPrefab, Vector3.zero, Quaternion.identity);
            
            // 设置目标大小(例如高度 1.8 单位)
            float targetHeight = 1.8f;
            float currentHeight = model.GetComponent<Renderer>().bounds.size.y;
            float scaleFactor = targetHeight / currentHeight;
            
            model.transform.localScale = new Vector3(scaleFactor, scaleFactor, scaleFactor);
            Debug.Log("模型已加载并缩放至目标大小");
        }
        else
        {
            Debug.LogError("未找到模型预制体");
        }
    }
}




 7. 调试与优化
 检查模型边界:使用 Renderer.bounds.size 查看加载后模型的实际尺寸,确保计算正确。
 单位一致性:确认模型的单位与 Unity 场景一致(默认 1 单位 = 1 米)。
 性能考虑:频繁加载和调整模型大小时,避免不必要的重复计算。



通过以上方法,你可以灵活地设置动态加载的 3D 人物模型大小。