【问题标题】:unity3d trouble with ship floating on waterunity3d 船漂浮在水面上的问题
【发布时间】:2018-02-12 19:01:20
【问题描述】:

团结一致,我有一艘船
我也有水:

我想让船漂浮在水面上,但是(当然)我得到的是:
有什么好办法让船不进水吗?
只是想让船内的水无法显示。
也许已经在互联网上回答了我的问题,但我不知道我在谷歌中究竟输入了什么......而且我也没有这个问题的标题的想法,所以请不要怪我标题不清楚。

不是这样的:

我希望它看起来像这样:

我这里没有使用任何物理,船的y坐标是恒定的。



到 Doh09: 您的代码似乎有效,我得到的是:

但是当我运行游戏时,我得到的是:

【问题讨论】:

  • 你能提供更多关于你如何得到这个结果的信息吗?是刚体偏移的问题吗?对撞机的问题?您的船舶 3d 模型的本地来源问题?
  • @Pierre Baret 不,刚体不会有任何问题,因为我在这里不使用刚体。你需要什么信息?我只有船和水,仅此而已。我只是想让船内的水无法显示。
  • 那么船是怎么漂浮的呢?它有固定的高度(固定的 y 坐标)吗?
  • 那么这是正常行为。所以如果你想保持这种状态,你可以探索像着色器这样的解决方案来计算你的水和你的船之间的交集,但我对着色器不太了解,抱歉。您可以查找诸如“删除交叉点”之类的内容
  • 你需要一个模板遮罩着色器。它们是复杂的野兽,虽然我对它们的构造有大致的了解,但我愿意为一个不属于我自己的项目付出更多的努力。

标签: unity3d 3d


【解决方案1】:

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

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

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

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

在图片中,船有 2500,depthmask 2700 和 water 3000。虽然我可能只需要设置 depthmask,可能是 water queue,但你可以尝试一下。

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

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

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

祝你的游戏好运。

【讨论】:

  • 谢谢,我明天再看看(现在在我的时区已经很晚了)
  • 让我知道如果在如何实现它方面有什么不清楚的地方。这里也晚了。睡个好觉。
  • 您的代码似乎有效,但仅在场景视图中有效。在运行时,遮罩变为黑色。 (见我的问题,我添加了它的图像)
  • 尝试使用标准着色器将水作为一个简单的平面,上面有基本的蓝色材质。只是为了排除你的水域材料在某种程度上弄乱了它。另外,您将船、深度蒙版对象和水分别设置为什么渲染队列级别?你还在 Awake 方法中设置渲染队列级别吗?我的测试是在运行时进行的,效果很好。
  • 在我的情况下,当我删除 SetRenderQueue 脚本时,一切都是正确的。
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
相关资源
最近更新 更多