Unity翻书效果


目前做的VR项目中需要一个翻阅魔法书的效果,考虑过使用UnityBookPageCurl-master插件,但是那个插件是纯UI显示的,只有二维效果,在VR里观感不佳,之后在网上找到一个写好的翻页shader,于是结合找到的shader写了一套多页翻书的代码。
shader如下:
http://www.45fan.com/article.php?aid=19113086500012186887046431

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Personal/PageTurning" {Properties{_Color("Color", Color) = (1,1,1,1)_MainTex("MainTex",2D) = "White"{}_SecTex("SecTex",2D) = "White"{}_Angle("Angle",Range(0,180)) = 0_Warp("Warp",Range(0,10)) = 0_WarpPos("WarpPos",Range(0,1)) = 0_Downward("Downward",Range(0,1)) = 0}SubShader{pass{Cull BackCGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"struct v2f{float4 pos : POSITION;float2 uv : TEXCOORD0;};fixed4 _Color;float _Angle;float _Warp;float _Downward;float _WarpPos;sampler2D _MainTex;float4 _MainTex_ST;v2f vert(appdata_base v){v2f o;v.vertex += float4(5,0,0,0);float s;float c;sincos(radians(-_Angle),s,c);float4x4 rotate = {c,s,0,0,-s,c,0,0,0,0,1,0,0,0,0,1};float rangeF = saturate(1 - abs(90 - _Angle) / 90);v.vertex.y += -_Warp * sin(v.vertex.x * 0.4 - _WarpPos * v.vertex.x) * rangeF;v.vertex.x -= rangeF * v.vertex.x * _Downward;v.vertex = mul(rotate,v.vertex);v.vertex += float4(-5,0,0,0);o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);return o;}fixed4 frag(v2f i) :COLOR{fixed4 color = tex2D(_MainTex,-i.uv);return _Color * color;}ENDCG}pass{Cull FrontCGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"struct v2f{float4 pos : POSITION;float2 uv : TEXCOORD0;};fixed4 _Color;float _Angle;float _Warp;float _Downward;float _WarpPos;sampler2D _SecTex;float4 _MainTex_ST;v2f vert(appdata_base v){v2f o;v.vertex += float4(5,0,0,0);float s;float c;sincos(radians(-_Angle),s,c);float4x4 rotate = {c,s,0,0,-s,c,0,0,0,0,1,0,0,0,0,1};float rangeF = saturate(1 - abs(90 - _Angle) / 90);v.vertex.y += -_Warp * sin(v.vertex.x * 0.4 - _WarpPos * v.vertex.x) * rangeF;v.vertex.x -= rangeF * v.vertex.x * _Downward;v.vertex = mul(rotate,v.vertex);v.vertex += float4(-5,0,0,0);o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);return o;}fixed4 frag(v2f i) :COLOR{float2 uv = i.uv;uv.x = -uv.x;fixed4 color = tex2D(_SecTex,-uv);return _Color * color;}ENDCG}}
}

注意,翻页的图片需要将“贴图间拼接模式”从“钳制”改为“重复”。

之后是功能逻辑块代码编写,目前的思路是书的左页和右页是静止不动的,翻页shader主要满足翻书动效,在翻书动画结束后则将翻书物体的shader关闭,之后替换书的左页图片和右页图片,层级目录如下:

功能代码如下:

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 打开书本及翻书功能
/// 1、打开书本和关闭书本
/// 书本由合着的状态变为打开的状态,打开后显示第一页
/// 2、翻页功能:
/// 从第一页翻到第二页
/// 在书本打开后,显示第一页,需要翻到第二页时,先将翻页物体的第一张和第二张贴图设置成第一页的后半张及第二页的前半张
/// 在翻页成功后,将书本的左页设置成第二页的前半张,书本的右页设置成第二页的后半张,之后将翻页物体隐藏
/// </summary>
public class Book_WSY : MonoBehaviour
{/// <summary>/// 首页/// </summary>GameObject FirstPage;/// <summary>/// 尾页/// </summary>GameObject LastPage;/// <summary>/// 翻页/// </summary>GameObject OverTurnPage;[Header("全部书页")]public List<Sprite> sprites = new List<Sprite>();[Header("翻页时间")]public float time = 1;/// <summary>/// 当前页数/// </summary>int initPageNum = 0;// Start is called before the first frame updatevoid Start(){FirstPage = transform.Find("首页").gameObject;LastPage = transform.Find("尾页").gameObject;OverTurnPage = transform.Find("翻页").gameObject;FirstPage.GetComponent<MeshRenderer>().material.SetTexture("_MainTex", sprites[initPageNum].texture);LastPage.GetComponent<MeshRenderer>().material.SetTexture("_MainTex", sprites[initPageNum + 1].texture);//关闭翻页物体OverTurnPage.gameObject.SetActive(false);}/// <summary>/// 打开书本/// </summary>void OpenBooKEvent(){}/// <summary>/// 关闭书本/// </summary>void CloseBookEvent(){}/// <summary>/// 翻转书本--正翻/// 从第一页翻到第二页/// 在书本打开后,显示第一页,需要翻到第二页时,先将翻页物体的第一张和第二张贴图设置成第一页的后半张及第二页的前半张/// 在翻页成功后,将书本的左页设置成第二页的前半张,书本的右页设置成第二页的后半张,之后将翻页物体隐藏/// </summary>void OverTurnBookEvent(){if(initPageNum+2>= sprites.Count||timer>Time.time){return;}timer = Time.time + JianGe;//打开翻页物体OverTurnPage.gameObject.SetActive(true);//设置翻页物体的贴图OverTurnPage.GetComponent<MeshRenderer>().material.SetTexture("_MainTex", sprites[initPageNum+1].texture);OverTurnPage.GetComponent<MeshRenderer>().material.SetTexture("_SecTex", sprites[initPageNum+2].texture);//先将尾页设置成当前页数+2LastPage.GetComponent<MeshRenderer>().material.SetTexture("_MainTex", sprites[initPageNum + 3].texture);//开始翻页int rotateVal = 0;DOTween.To(() => rotateVal, x => rotateVal = x, 180, 1).OnUpdate(delegate{OverTurnPage.GetComponent<MeshRenderer>().material.SetInt("_Angle", rotateVal);}).OnComplete(delegate{//翻页结束//将首页替换为当前页数+1FirstPage.GetComponent<MeshRenderer>().material.SetTexture("_MainTex", sprites[initPageNum + 2].texture);//关闭翻页物体OverTurnPage.gameObject.SetActive(false);initPageNum+=2;});}/// <summary>/// 逆翻书效果/// </summary>void OverTurnBookBackEvent(){if (initPageNum - 2 < 0||timer>Time.time){return;}timer = Time.time + JianGe;//打开翻页物体OverTurnPage.gameObject.SetActive(true);//设置翻页物体的贴图OverTurnPage.GetComponent<MeshRenderer>().material.SetTexture("_MainTex", sprites[initPageNum - 1].texture);OverTurnPage.GetComponent<MeshRenderer>().material.SetTexture("_SecTex", sprites[initPageNum].texture);//先将首页设置成当前页数-2FirstPage.GetComponent<MeshRenderer>().material.SetTexture("_MainTex", sprites[initPageNum - 2].texture);//开始翻页int rotateVal = 180;DOTween.To(() => rotateVal, x => rotateVal = x, 0, 1).OnUpdate(delegate{OverTurnPage.GetComponent<MeshRenderer>().material.SetInt("_Angle", rotateVal);}).OnComplete(delegate{//翻页结束//将未页替换为当前页数-1LastPage.GetComponent<MeshRenderer>().material.SetTexture("_MainTex", sprites[initPageNum - 1].texture);//关闭翻页物体OverTurnPage.gameObject.SetActive(false);initPageNum -= 2;});}float timer;float JianGe = 1.1f;// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.A)){OverTurnBookEvent();}if (Input.GetKeyDown(KeyCode.S)){OverTurnBookBackEvent();}}
}

示例项目工程地址如下:
https://gitee.com/wang-senyu/book-page-turning-effect/tree/master/

Unity 翻书效果相关推荐

  1. 【工具篇】Unity翻书效果的三种方式

    目录 一.工具介绍 1.基础说明 2.使用说明 二.模式一手动翻页(UGUI)

  2. Unity Shader - 翻书效果

    今天实现一个简单的翻书的效果,话不多说,先上一张效果图: 这里就随便用的一张纹理了,我们还是称为"翻木板"吧,哈哈. 实现过程: 其实这个效果实现起来还是挺简单的,大概思路其实就是 ...

  3. Unity3d实现翻书效果

    Unity3d实现翻书效果 此教程需要用到Book-Page Curl Pro插件,unity商店里有,需要插件和工程的话留邮箱 1.将插件中的bookPro复制成自己的prefab,将page0和p ...

  4. Unity3D UGUI实现翻书效果

    提示:素材来源网络,侵权必删 UI翻书效果 效果图 一.准备工作 1.新建Unity工程 2.新建Hierarchy面板 二.使用步骤 1.新建UIBook脚本,挂在UIBook上 2.新建BookM ...

  5. winform实现翻书效果_如何用PPT实现翻书效果?

    在PPT中,我们需要配合内容使用不同的动画效果,加深观众对内容的理解.当内容是讲述故事.过场片段,或是老师的课件讲解教材时,有一个实用好看的动画效果,就是"翻书效果"动画. 例如上 ...

  6. 自定义控件android特效,Android自定义控件eBook实现翻书效果实例详解

    本文实例讲述了Android自定义控件eBook实现翻书效果的方法.分享给大家供大家参考,具体如下: 效果图: Book.java文件: package com.book; import androi ...

  7. html5实现3d翻页效果,利用css3 3d transform制作超逼真翻书效果

    本教程给大家带来一个非常有创意的翻书效果,使用的是css 3D transforms属性和css transitions属性.这里将给你展示两种不同的图书设计:精装书和平装书.这两种设计只需要简单的改 ...

  8. settimeout怎么用_怎么实现一个3d翻书效果

    本篇主要讨论以下两种翻书动画的实现: 第一种是整页翻转的效果: 这种整页翻转的效果主要是做rotateY的动画,并结合一些CSS的3d属性实现. 第二种折线翻转的效果,如下图所示: 主要是通过计算页面 ...

  9. 前端学习(284):纯css实现翻书效果

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

最新文章

  1. 业界对生成图片缩略图的做法归纳
  2. 临床基因组学数据分析实战开课啦!!!
  3. 【原创】Kakfa utils源代码分析(二)
  4. windows 下 sublime Text3 做 Python 编辑器
  5. php代码优化 -- array_walk 和 foreach, for 的效率的比较
  6. 学习java的步骤_java学习的基本步骤
  7. git 和 github 关系?
  8. 维护索引——通过重组索引提高性能
  9. 命令获取计算机信息,教你怎么在windows上用命令查看系统信息
  10. 重新认识块级元素--DIV
  11. 使用AutoMake轻松生成Makefile
  12. C# 制作指示灯(经典)
  13. 用单片机测量流体流速的_流量测量的主要方法
  14. 属性拼接转换成字符串_使用一些可选的将字符串配置属性转换为其他类型
  15. 华为nova2s云相册在哪里_华为反人类的用户体验
  16. python 下载文件-python实现下载文件的三种方法_python
  17. 如何过滤掉xml中的转义字符_水肥一体化应用中如何选择过滤器?
  18. C语言小案例_OA大典故障案例摘录【第1395篇】故障案例: 输稿器卡纸 合集 | 理光黑白复印机 彩色复印机...
  19. 通过IP地址连接两台电脑
  20. 电脑如何截长图?如何用电脑截取长图——规划全景

热门文章

  1. BZOJ 4668 冷战(按秩合并并查集+LCA)
  2. SpringCloud五大神兽之Eureka服务注册(一)
  3. 通过SSH远程控制服务器
  4. 3D游戏编程与设计作业一
  5. plt.scatter 中cmap参数详解
  6. Android6.0运行时权限(危险权限列表)
  7. 你还在担心黑客攻击吗?所有程序员都应该掌握的基础网络安全知识,快进来看看吧
  8. 基于SSM的仓储管理系统
  9. 使用Exchange获取邮件内容
  10. 第十一章 图形视图、动画和状态机框架——Qt