1. Maikid 2020-04-19

    根据人走过去才动的草丛 2D要怎么做啊?

    • Onyx 2020-04-19

      @Maikid:如果要用着色器实现的话,我感觉可以加一个box collider触发器,再用脚本把着色器参数和触发器连在一起(不过那样的话可能就要为每个草丛单独建材质了..太麻烦)

    • 三页 2020-04-22

      @Onyx:不需要啊,一个材质就行了

    • Onyx 2020-04-22

      @三页:对,我刚才试着写了一下,Unity会在运行时创建副本,的确只用一个材质就够了。是我想当然了。

  2. erddddd 2022-05-17

    感谢分享
    我是把这个Material给了整个tilemap,我这个tilemap里面全是各种树木,问题来了,shader里最后的MainTex变量,如何取到每一种树木?示例里看起来是单个texture赋值的?

    • Onyx 2022-05-18

      @erddddd:Unity的Tilemap中,每个Tile的UV和局部空间都是单独计算的,所以如果一棵树木是多个Tile拼成的,那么用基于UV的材质就会每个Tile自己抖自己的,这个似乎是没什么办法。可以把需要类似特殊材质的东西单独分成完整的Sprite再应用不同的材质。

  3. erddddd 2022-05-21

    @Onyx:搞定了,MainTex变量的Reference属性写成 _MainTex 就行了,这好像是shader的内部变量名,会自动取到每一个贴图,不用手动赋值。

  4. erddddd 2022-05-21

    文中是顶部受风,底部保持不动。
    如果想改成外部受风,内部不动,应该怎么改?
    我尝试使用Ellipse圆形节点做差值依据(圆内的不动,圆外的动),但不能连接lerp的T输入,尝试用"菲涅尔"节点,能是能连,但效果不是想要的。

  5. Onyx 2022-05-22

    @erddddd:菲涅尔节点的核心算法是NdotV,就是法线方向点乘视线方向(或者你喂进去的其它矢量参数),两者夹角为0时点乘结果最小为0,夹角90度时点乘结果最大为1,而三维模型中模型外侧的法线与视线的夹角基本都会比内部大,所以就可以用菲涅尔来取到模型边缘的区域。
    而2D精灵本质是一个平面,它的法线只会朝一个方向,这种情况下菲涅尔就莫得用了。
    想要取到平面的中心区域可以通过UV计算出来。比较近似的方法可以是
    max(max(UV.x, 1-UV.x), max(UV.y, 1-UV.y)),之后通过power或者smoothstep来调整区域范围。

    • erddddd 2022-05-26

      @Onyx:尝试了一下,方案可行!实在是太感谢了!
      对菲涅尔节点的原理讲解帮助太大了,对于我这种初学shader的来说,最大的障碍就是不明白其中的原理,不知道“为啥不可以”,这解答对我帮助很大,再次感谢!

您需要登录或者注册后才能发表评论

前往登录页面