Unity Shader学习:卡通瓶纸
关于切面填充的做法很巧妙,如果液体需要透明理论上可以用模板测试来做。
原文链接:http://walkingfat.com/liquid-bottle-%E6%B6%B2%E4%BD%93%E7%93%B6%E5%88%B6%E4%BD%9C/
c#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Wobble : MonoBehaviour {
private Renderer rend;
private Vector3 lastPos;
private Vector3 velocity;
private Vector3 lastRot;
private Vector3 angularVelocity;
public float maxWobble = 0.03f;
public float WobbleSpeed = 1f;
public float Recovery = 1f;
private float wobbleAmountX;
private float wobbleAmountZ;
private float wobbleAmountToAddX;
private float wobbleAmountToAddZ;
private float pulse;
private float time = 0.5f;
void Start () {
rend = GetComponent<Renderer>();
}
// Update is called once per frame
void Update () {
time += Time.deltaTime;
//decrease wobble overt time
wobbleAmountToAddX = Mathf.Lerp(wobbleAmountToAddX, 0, Time.deltaTime * Recovery);
wobbleAmountToAddZ = Mathf.Lerp(wobbleAmountToAddZ, 0, Time.deltaTime * Recovery);
//make a sine wave of the decreasing wobble
pulse = 2f * 3.1415926f * WobbleSpeed;
wobbleAmountX = wobbleAmountToAddX * Mathf.Sin(pulse * time);
wobbleAmountZ = wobbleAmountToAddZ * Mathf.Sin(pulse * time);
//send to shader
rend.material.SetFloat("_WobbleX", wobbleAmountX);
rend.material.SetFloat("_WobbleZ", wobbleAmountZ);
//velocity
velocity = (lastPos - transform.position) / Time.deltaTime;
angularVelocity = transform.rotation.eulerAngles