Unity 模型尺寸自适应

在开发过程中可能会因为美术资源规格不统一或者其他项目上的硬性需求遇到模型在被加载出以后大小不一的情况,基本的解决方案都是修改scale值进行直接的缩放,但是有时量级太多无法判定scale的数值时就需要针对模型的render进行调节,以下为详细的解决方案


一、计算模型的标准尺寸

在适配前,先对标准的尺寸进行计算,即选定想要适配的标准模型,对该模型进行参数的抽取作为标准参数。

    /// <summary>
    /// 获取标准模型参数
    /// </summary>
    /// <param name="gameObj">目标游戏物体</param>
    /// <returns></returns>
    private Vector3 GetNormalSize(GameObject gameObj)
    {
        Vector3 modelSize = Vector3.zero;
        allChild = gameObj.GetComponentsInChildren<Transform>();
        for (int i = 0; i < allChild.Length; i++)
        {
            if (allChild[i].GetComponent<SkinnedMeshRenderer>())
            {
                
                //获取模型的规格尺寸
                modelSize = allChild[i].GetComponent<SkinnedMeshRenderer>().bounds.size;                
            }

            if (allChild[i].GetComponent<MeshRenderer>())
            {                
                modelSize = allChild[i].GetComponent<MeshRenderer>().bounds.size;
                return modelSize;
            }
        }
        return modelSize;
    }

二、针对render类型对模型的Scale进行缩放

获取到标准模型参数后可以对需要做适配的模型进行数据的适配,具体的参数可以做限制,基本原理就是依据标准的模型参数数据做比值,依据比值进行scale的缩放,两层计算后就可以得到对应的适配效果。

    /// <summary>
    /// 设置模型尺寸
    /// </summary>
    /// <param name="gameObj">模型游戏物体</param>
    private void SetModelSize(GameObject gameObj)
    {
        allChild = gameObj.GetComponentsInChildren<Transform>();
        for (int i = 0; i < allChild.Length; i++)
        {
            if (allChild[i].GetComponent<SkinnedMeshRenderer>())
            {
                Vector3 modelSize;
                //获取模型的规格尺寸
                modelSize = allChild[i].GetComponent<SkinnedMeshRenderer>().bounds.size;
                //限定模型尺寸的规格
                if (modelSize.y < 2)
                {
                    gameObj.transform.localScale = Vector3.one * 10;
                }
                else
                {
                    gameObj.transform.localScale = new Vector3(
                       gameObj.transform.localScale.x / (modelSize.x / 1f),
                       gameObj.transform.localScale.y / (modelSize.x / 1f),
                       gameObj.transform.localScale.z / (modelSize.x / 1f)
                   );
                }
            }

            if (allChild[i].GetComponent<MeshRenderer>())
            {
                Vector3 modelSize;
                modelSize = allChild[i].GetComponent<MeshRenderer>().bounds.size;
                if (modelSize.y < 2)
                {
                    gameObj.transform.localScale = Vector3.one * 10;
                }
                else
                {
                    gameObj.transform.localScale = new Vector3(
                       gameObj.transform.localScale.x / (modelSize.x / 1f),
                       gameObj.transform.localScale.y / (modelSize.x / 1f),
                       gameObj.transform.localScale.z / (modelSize.x / 1f)
                   );
                }
                Debug.Log(modelSize);
                Debug.Log(gameObj.transform.localScale);
            }
        }
    }

【这种粗糙的计算方式会导致部分模型的缩放出现拉伸变形的效果,需要对模型进行细节上的计算来最大化保证模型的表现效果】

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值