Unity保留模型碰撞内容动态减少场景顶点数

Unity 的Verts会影响渲染性能。
这个项目需要使用模型的各种物理碰撞,但是因为场景里面顶多数比较多,所以又要进行减少Verts来提高性能
这里就可以把模型上的mesh renderer禁用,使Unity不进行渲染,但是保留模型物体在哪里保留碰撞和一写其他组件

在这里插入图片描述


禁用前:
在这里插入图片描述


禁用后:
在这里插入图片描述
在这里插入图片描述


一个相对于目标对象距离,过远则隐藏其子物体下的renderer mesh的脚本

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

public class ModelRendererHide : MonoBehaviour
{
  [Header("-------- Param -------")]
  public float nearDistance;
  public bool ignoreX;
  public bool ignoreY;
  public bool ignoreZ;
  [Header("-------- targets -------")]
  public Transform target;

  bool isShow = true;
  MeshRenderer[] meshRenderers;



  void Start()
  {
    InitMeshRenderer();
  }

  private void Update()
  {
    bool boolean = IsShowRenderer();
    RendererHide(boolean);
  }

  void InitMeshRenderer()
  {
    if (meshRenderers != null) return;
    List<MeshRenderer> tempList = new List<MeshRenderer>();
    foreach(MeshRenderer renderer in this.transform.GetComponentsInChildren<MeshRenderer>())
    {
      tempList.Add(renderer);
    }
    meshRenderers = tempList.ToArray();
  }

  public bool IsShowRenderer()
  {
    if (!target) return true;
    Vector3 targetPos = GetAxisPos(target.position);
    Vector3 pos = GetAxisPos(this.transform.position);

    float distance = Vector3.Distance(targetPos, pos);
    if (distance < nearDistance) return true;
    else return false;
  }

  public void RendererHide(bool show)
  {
    if (isShow == show) return;
    foreach(MeshRenderer renderer in meshRenderers)
    {
      if (renderer == null) continue;
      renderer.enabled = show;
    }
    isShow = show;
  }

  public Vector3 GetAxisPos(Vector3 pos)
  {
    if (ignoreX) pos.x = 0;
    if (ignoreY) pos.y = 0;
    if (ignoreZ) pos.z = 0;
    return pos;
  }


}

猜你喜欢

转载自blog.csdn.net/qq_33205561/article/details/88294477
今日推荐