免费开源!细节拉满的一个2D实时水面反射效果Demo,基于Cocos Creator 3.5

引言:插件 Easy NavMeshBenchMark 性能检测的作者孙二喵,从开发者王师傅的论坛分享中获得启发,实现了 2D 实时水面反射效果,Demo 免费开源。

2D 实时水面反射

c6e1528a5ff41355fbc1e188857a69f1.gif

Demo 效果

前几天看到论坛大佬的 2D 水面 Shader 教程(注:后文有详细内容),效果挺好的,就跟着在 Cocos Creator 3.5.2 中做了一个,实现 2D 实时水面反射,并支持角色移动,开箱即用。

功能特点

整个方案使用了3个摄像机:

  • RT 摄像机负责所有游戏物体,它会获取 Rendertexture 渲染到地面和水面的2个精灵上。

a427070065e0f4132352349170e3c3e6.jpeg

  • FixCamera 是固定摄像机,只会拍摄地面和水面这2个精灵。

e348e8872d229e6c203e2e3f6e60f90f.jpeg

  • UI 相机负责 UI 层级。

最终的 DrawCall 为8个,包括1个基础 DC +1个背景+1个角色+2个技能特效+1个 UI+ 1个水面渲染+1个地面渲染。

b0e1238dce99606ca5f018e08f879645.jpeg

即使增加1个新的精灵类,我们整个 DrawCall 也只会增加1个。

87b94982b887f66c490ebb01e66361fc.jpeg

针对反射方案,第一个 RT 摄像机负责地面部分的截取,这里把 rect 设置成了 -0.37 , 只截取63%的上半部分屏幕。

878563186b70dbf9b53e8fd4d5c4e040.png

针对地面部分,我们使用了自定义 Shader,移植了默认的 Sample from RT,使用了和 Canvas 一样的尺寸,针对屏幕适配,Canvas 上的 rtAdapter 里有解决方案。

fd3341dcee2e7ad2611d2dbc662adf7e.png

水面部分只使用了一半的屏幕高度,这里加了 Tiling 的 Macro,设置了 UV。

f97105bf9c232834aa461ccfb992e52f.png

水浪效果,通过 update wavetexture 的 uv 得到一个偏移量 offset,并于原始图片的 uv 相加。

a0266c130a3ca7049f9ee41042836502.png

波浪效果有了,但是看起来比较单一,这里希望水面的颜色更有多彩,同时有一点邪恶的小紫色。

ea22153915d578749e113fc91f766332.jpeg

加了 casutic 效果后,水面有了焦散的流动。

0b68fab0482b34cdf2d79a4e8466dd82.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,要实现模拟书本翻页效果,可以采用 Cocos Creator 3.5 以上版本提供的 3D 功能,具体步骤如下: 1.创建一个 3D 场景,导入书本模型,并将其放置在场景中心位置。 2.创建一个相机,将其位置设置在书本正前方,使其能够看到整本书的正面。 3.创建一个 Plane 节点,用于显示书本的每一页内容。将 Plane 节点放在书本的左侧,并设置其大小和位置,使其与书本的一页大小和位置相同。 4.编写代码实现翻页效果。通过监听触摸事件或鼠标事件,获取用户翻页的方向,然后使用 Cocos Creator 提供的动画系统,将 Plane 节点绕 Y 轴旋转,从而实现翻页效果。 下面是一个简单的代码示例: ```javascript const {ccclass, property} = cc._decorator; @ccclass export default class Book extends cc.Component { @property(cc.Node) book: cc.Node = null; @property(cc.Node) page: cc.Node = null; private currentPage: number = 1; start () { this.node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this); } onTouchStart(event: cc.Event.EventTouch) { const delta = event.getDelta(); if (delta.x > 0 && this.currentPage < 10) { this.turnPage(1); } else if (delta.x < 0 && this.currentPage > 1) { this.turnPage(-1); } } turnPage(dir: number) { const animation = this.page.getComponent(cc.Animation); const clipName = dir > 0 ? 'turn_right' : 'turn_left'; animation.play(clipName); animation.once('finished', () => { this.currentPage += dir; this.page.getComponent(cc.Sprite).spriteFrame = this.getSpriteFrame(this.currentPage); animation.play('idle'); }); } getSpriteFrame(page: number) { // 根据页码获取对应的 SpriteFrame } } ``` 在上面的代码中,book 是书本模型节点,page 是用于显示每一页内容的 Plane 节点,currentPage 记录当前页码。当用户触摸屏幕并滑动时,会调用 onTouchStart 方法,根据滑动方向调用 turnPage 方法进行翻页。turnPage 方法使用动画系统播放翻页动画,并在动画播放完毕后更新当前页码和显示的内容。 希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值