【Unity】生成一个贴合动画的MeshCollider

单纯的MeshCollider只会根据mesh来生成对应的Collider,当动画发生变化之后MeshCollider读取的Mesh会不根据动画而产生变化,可以用SkinnedMeshRenderer下的BakeMesh来赋值,获取当前动画状态的Mesh,并赋予到MeshCollider上。但是生成出来的Mesh不会自己销毁。需要 Resources.UnloadUnusedAssets();否则会造成内存泄漏。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SkinMeshColliderHelper : MonoBehaviour
{
    public SkinnedMeshRenderer MeshRenderer;
    public MeshCollider Collider;

    /// <summary>
    /// 采样间隔
    /// </summary>
    public int FrameInterval;
    /// <summary>
    /// 释放资源间隔
    /// </summary>
    float _unloadResouceTime = 1.5f;
    float _unloadTimer;
    int _interval;

    private void Start()
    {
        if (MeshRenderer == null)
        {
            MeshRenderer = this.GetComponent<SkinnedMeshRenderer>();
            if (MeshRenderer == null)
            {
                DestroyImmediate(this);
                return;
            }
        }
        if (Collider == null)
        {
            Collider = MeshRenderer.GetComponent<MeshCollider>();
            if (Collider == null)
            {
                Collider = MeshRenderer.gameObject.AddComponent<MeshCollider>();

            }
        }
    }

    void Update()
    {
        if (FrameInterval <= _interval)
        {
            _interval = 0;
            Mesh colliderMesh = new Mesh();
            MeshRenderer.BakeMesh(colliderMesh); //更新mesh
            Collider.sharedMesh = null;
            Collider.sharedMesh = colliderMesh; //将新的mesh赋给meshcollider

            colliderMesh = null;


        }
        else
        {
            _interval += FrameInterval;
        }

        //定时释放资源,防止内存泄露
        if (_unloadTimer < _unloadResouceTime)
        {
            _unloadTimer += Time.deltaTime;

        }
        else
        {
            Resources.UnloadUnusedAssets();
            _unloadTimer = 0;

        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值