剔除物件可見性

以下指令碼說明了如何根據設定相機的可見性接收事件。

為簡潔起見,此指令碼使用了幾種效能較高的方法。

using UnityEngine;
using System.Linq;

public class CullingGroupCameraBehaviour : MonoBehaviour
{
    CullingGroup localCullingGroup;

    MeshRenderer[] meshRenderers;

    void OnEnable()
    {
        localCullingGroup = new CullingGroup();

        meshRenderers = FindObjectsOfType<MeshRenderer>()
            .Where((MeshRenderer m) => m.gameObject != this.gameObject)
            .ToArray();

        BoundingSphere[] cullingPoints = new BoundingSphere[meshRenderers.Length];
        Transform[] meshTransforms = new Transform[meshRenderers.Length];

        for (var i = 0; i < meshRenderers.Length; i++)
        {
            meshTransforms[i] = meshRenderers[i].GetComponent<Transform>();
            cullingPoints[i].position = meshTransforms[i].position;
            cullingPoints[i].radius = 4f;
        }

        localCullingGroup.onStateChanged = CullingEvent;
        localCullingGroup.SetBoundingSpheres(cullingPoints);
        localCullingGroup.targetCamera = Camera.main;
    }

    void CullingEvent(CullingGroupEvent sphere)
    {
        meshRenderers[sphere.index].material.color = sphere.isVisible ? Color.red : Color.white;
    }

    void OnDisable()
    {
        localCullingGroup.Dispose();
    }
}

將指令碼新增到場景並單擊播放。場景中的所有幾何體都將根據其可見性更改顏色。

http://i.stack.imgur.com/T28vl.gif

如果物件具有 MeshRenderer 元件,則可以使用 MonoBehaviour.OnBecameVisible() 方法實現類似的效果。當你需要剔除空的 GameObjects,Vector3 座標或者想要一種跟蹤物件可見性的集中方法時,請使用 CulingGroups。