团结一致,我有一艘船unity3d - unity3d麻烦,船浮在水面上-LMLPHP

而且我也有水:unity3d - unity3d麻烦,船浮在水面上-LMLPHP

我想让船漂浮在水上,但是(当然)我得到的是:unity3d - unity3d麻烦,船浮在水面上-LMLPHP
有什么好的方法可以将水排除在船外?只是想让船上的水不显示。也许已经有人通过互联网回答了我的问题,但是我不知道我该在谷歌中确切键入什么...我也不知道这个问题的标题,所以请不要怪我标题不清晰。

不是这样的:
unity3d - unity3d麻烦,船浮在水面上-LMLPHP

我希望它看起来像这样:
unity3d - unity3d麻烦,船浮在水面上-LMLPHP

我在这里不使用任何物理学,船的y坐标是恒定的。

前往Doh09:
您的代码似乎有效,我得到的是:unity3d - unity3d麻烦,船浮在水面上-LMLPHP

但是当我运行游戏时,得到的却是:unity3d - unity3d麻烦,船浮在水面上-LMLPHP

最佳答案

http://wiki.unity3d.com/index.php?title=DepthMask

使用上面链接中的代码,我得到了您在以下图像中看到的结果。

unity3d - unity3d麻烦,船浮在水面上-LMLPHP

我使用下面的2个脚本来实现它。

SetRenderQueue对象在Awake方法期间设置渲染优先级。呈现队列中的数字越小,意味着它们的优先级越高。

在图片中,船有2500个,深度罩2700和水3000个。尽管我可能只需要设置深度罩,但可能是水域排队,但是您可以尝试一下。

着色器本身(底部脚本)应放在蒙版使用的材质上。然后,您可以将面罩设为船上的子对象,使其始终与之保持在一起,并使船上的水保持隐藏。

SetRenderQueue.cs

using UnityEngine;

[AddComponentMenu("Rendering/SetRenderQueue")]
public class SetRenderQueue : MonoBehaviour {

    [SerializeField]
    protected int[] m_queues = new int[] { 3000 };

    protected void Awake()
    {
        Material[] materials = GetComponent<Renderer>().materials;
        for (int i = 0; i < materials.Length && i < m_queues.Length; ++i)
        {
            materials[i].renderQueue = m_queues[i];
        }
    }
}

深度遮罩着色器

Shader "Custom/DepthMaskShader" {

    SubShader{

        Tags{ "Queue" = "Geometry+10" }
        // Don't draw in the RGBA channels; just the depth buffer

        ColorMask 0
        ZWrite On

        // Do nothing specific in the pass:

        Pass{}
    }
}

为了清楚起见,以下图像显示了层次结构以及没有着色器的蒙版对象。

unity3d - unity3d麻烦,船浮在水面上-LMLPHP

祝您游戏顺利。

09-20 14:56