另一个游戏对象背后的粒子系统渲染

3

首先,我希望你能理解我的英语。

我使用源代码手动将相机的投影更改为正交投影。 请参阅下面的代码。

using UnityEngine;
using System.Collections;

public class CameraOrthoController : MonoBehaviour
{
    private Matrix4x4 ortho;

    private Matrix4x4 perspective;

    public float near = 0.001f;

    public float far = 1000f;

    private float aspect;

    public static CameraOrthoController Instance
    {
        get
        {
            return instance;
        }
        set { }
    }

    //-----------------------------------------------------
    private static CameraOrthoController instance = null;
    //---------------------------------------------------
    // Use this for initialization
    void Awake()
    {
        if (instance)
        {
            DestroyImmediate(gameObject);
            return;
        }

        //  이 인스턴스를 유효한 유일 오브젝트로 만든다
        instance = this;
    }

    private void Start()
    {
        perspective = Camera.main.projectionMatrix;
    }

    public void StartMatrixBlender(float OrthoSize)
    {
        aspect = (Screen.width + 0.0f) / (Screen.height + 0.0f);

        if (OrthoSize != 0f)
        {
            float vertical = OrthoSize;
            float horizontal = (vertical * 16f) / 9f;

            ortho = Matrix4x4.Ortho(-horizontal, horizontal, -vertical, vertical, near, far);

            BlendToMatrix(ortho, 1f);
        }
        else
        {
            BlendToMatrix(perspective, 1f);
        }
    }

//---------------------------------------
    private Matrix4x4 MatrixLerp(Matrix4x4 from, Matrix4x4 to, float time)
    {
        Matrix4x4 ret = new Matrix4x4();
        int i;
        for (i = 0; i < 16; i++)
            ret[i] = Mathf.Lerp(from[i], to[i], time);
        return ret;
    }

    IEnumerator LerpFromTo(Matrix4x4 src, Matrix4x4 dest, float duration)
    {
        float startTime = Time.time;
        while (Time.time - startTime < duration)
        {
            Camera.main.projectionMatrix = MatrixLerp(src, dest, (Time.time - startTime) / duration);
            yield return new WaitForSeconds(0f);
        }
        Camera.main.projectionMatrix = dest;
    }

//-------------------------------------------------
    private Coroutine BlendToMatrix(Matrix4x4 targetMatrix, float duration)
    {
        StopAllCoroutines();
        return StartCoroutine(LerpFromTo(Camera.main.projectionMatrix, targetMatrix, duration));
    }

//-------------------------------------------------
    public void OnEvent(EVENT_TYPE Event_Type, Component Sender, object Param = null, object Param2 = null)
    {
        switch (Event_Type)
        {

        }
    }
}

我这样使用代码。
CameraOrthoController.Instance.StartMatrixBlender(OrthographicSize);

到目前为止,一切都很顺利。但是,当我添加粒子系统以进行特效时,问题出现了。 问题发生的屏幕 在正常状态下,特效会出现在游戏对象的前面,就像上图底部的场景屏幕中所示。
但是,如果我使用上面编写的代码来操作摄像机,则该特效将始终被所有游戏对象遮挡,就像上图游戏屏幕上的情况一样。尽管特效位于游戏对象的前面。
起初,我认为可以通过层次排序来解决它,但我认为这不是层次问题,因为在正常摄像机条件下可见。
我想知道上述代码的问题在哪里,因为我必须使用它们。
如果您知道如何解决,请告诉我。
谢谢。

请查看此线程:链接 - Swift
@SwiftingDuster 这是针对旧的粒子系统,不适用于新的粒子系统。 - Programmer
1个回答

9
当您修改Camera.projectionMatrix时,相机将不再根据视野更新其渲染。直到您调用Camera.ResetProjectionMatrix()来结束设置Camera.projectionMatrix属性的效果之前,粒子将一直停留在GameObject后面。
如果这不起作用,可以使用多个摄像机使粒子系统始终出现在3D对象的顶部。基本上,您使用主摄像机渲染3D对象和其他对象,然后使用另一个摄像机渲染粒子系统。
图层: 1.创建新图层并将其命名为“Particle”。 2.将粒子系统图层更改为 Particle

enter image description here

主相机:

1.确保主相机的Clear Flags设置为Skybox

2.将Culling Mask更改为“Everything”。单击Culling Mask的设置项Everything,取消选择/取消选中Particle

enter image description here

3.确保其Depth设置为0

此时相机不应该渲染粒子系统。

新相机

1.创建新相机。确保它与主相机的位置/旋转相同。还要删除附加在其上的AudioListener

2.将Clear Flags更改为仅深度

3.将相机的Culling Mask更改为Particle,并确保在“Culling Mask”中没有选择其他内容。

enter image description here

4. 将深度更改为 1

这将使粒子系统始终显示在使用第一个或主相机渲染的每个对象的顶部。


如果你想让粒子系统出现在精灵/2D对象的顶部而不是网格/3D对象上方,则需要将粒子的RenderersortingOrder更改为大于SpriteRenderer的sortingOrder。默认值为0,因此将Particle的sortingOrder更改为1或2应该没问题。
particle.GetComponent<Renderer>().sortingOrder = 2;

我看到了你的答案并解决了它。非常感谢。 然而,主摄像机是“正交”的,而新摄像机是“透视”的,因此效果不在正确的位置。 - 정현우
我没有提到正确的位置。我只是说当您修改Camera.projectionMatrix时会发生什么。 - Programmer
如果我的回答解决了你的问题,请不要忘记接受它。这里是如何操作的。 - Programmer
这个技巧似乎在vuforia的AR相机上不起作用。我该如何在vuforia中解决它? - savram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接