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