首先放上效果:
1.编写Shader
Shader "Custom/BookFlipShader"
{
Properties
{
_MainTex ("Page Texture", 2D) = "white" {} // 页面纹理
_FlipAngle ("Flip Angle", Range(0, 180)) = 0 // 翻页角度
_FoldSharpness ("Fold Sharpness", Range(0, 1)) = 0.5 // 折叠锐度
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float _FlipAngle;
float _FoldSharpness;
v2f vert (appdata v)
{
v2f o;
// 计算翻页效果
float angleRadians = radians(_FlipAngle);
float fold = sin(v.uv.x * 3.14159); // 根据UV的X坐标模拟折叠
float bend = fold * _FoldSharpness * angleRadians;
// 弯曲顶点
float4 pos = v.vertex;
pos.y += bend * (1.0 - v.uv.x); // 根据UV的X坐标调整弯曲
o.vertex = UnityObjectToClipPos(pos);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// 采样纹理
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
Shader参数说明
-
_MainTex:页面的纹理。
-
_FlipAngle:控制页面的翻转角度(0到180度)。
-
_FoldSharpness:控制折叠的锐度,值越大,折叠越明显。
然后创建材质,将shader给材质,并将材质赋予给书页上
2. 控制翻页动画
通过脚本控制Shader中的_FlipAngle
参数,实现翻页动画。
编写C#脚本
using UnityEngine;
public class BookFlipController : MonoBehaviour
{
public Material pageMaterial; // 页面材质
public float flipSpeed = 1.0f; // 翻页速度
private float flipAngle = 0.0f;
private bool isFlipping = false;
void Update()
{
if (Input.GetMouseButtonDown(0) && !isFlipping) // 检测鼠标左键点击
{
StartCoroutine(FlipPage());
}
}
System.Collections.IEnumerator FlipPage()
{
isFlipping = true;
while (flipAngle < 180.0f)
{
flipAngle += flipSpeed * Time.deltaTime * 100; // 更新翻页角度
pageMaterial.SetFloat("_FlipAngle", flipAngle);
yield return null;
}
flipAngle = 0.0f; // 重置角度
pageMaterial.SetFloat("_FlipAngle", flipAngle);
isFlipping = false;
}
}
3. 调整和优化
-
弯曲效果:
-
可以通过调整Shader中的
_FoldSharpness
参数来控制弯曲的锐度。 -
如果需要更复杂的弯曲效果,可以使用数学函数(如贝塞尔曲线)来模拟翻页的形状。
-
-
光照和阴影:
-
如果需要更逼真的效果,可以将Shader改为Surface Shader,并添加光照和阴影支持。
-
-
多页翻动:
-
如果需要实现多页翻动,可以为每一页单独设置材质,并分别控制它们的
_FlipAngle
。
-
4.总结
通过Shader实现翻书效果可以带来更高的灵活性和逼真度。可以通过调整Shader参数和脚本控制来实现不同的翻页效果。如果你想需要更复杂的效果,可以结合数学函数和光照模型来进一步优化,这里不展开写了。