Unity 实现一个揭面膜效果

在这里插入图片描述

源码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


/**
 * 
 * 掀面膜功能
 * 
 * @anchor: ChenJC
 * @time: 2023/03/15
 * 
 */
public class FacialMask : MonoBehaviour
{
   
    
    
    [SerializeField] Image maskPanel;


    #region Private member property

    private bool hasCaptureFingerDropPoint = false;
    private Vector2 beginTouch = Vector2.zero;
    public enum DragDir
    {
   
    
    
        None,
        TurnRight,
        TurnLeft
    }
    private DragDir lastDir = DragDir.None;
    private Vector3 maskPlaneOriginPos, backOriginPos;
    private Vector3 frontOriginPos, frontOriginEuler;
    private Vector2 dragVelocity = Vector2.zero;
    [SerializeField]
    private RectTransform front, back;
    private float hypot = 0f;
    private float _splayThresholdValue = 0.50f;
    private bool hasSplay = false;
    #endregion



    #region Public property

    /// <summary>
    /// 拉扯的力 当大于一定值时 我认为它会超过当前页面能承受的最大韧性 既自动翻开
    /// </summary>
    public float force
    {
   
    
    
        get
        {
   
    
    
            return dragVelocity.magnitude;
        }
    }


    /// <summary>
    /// 这个值保持在 0 ~ 1 之间  
    /// 0:掀开一点就会触发自动张开  1:只有全部掀开才会自动张开 0.5: 掀开一半就会自动张开
    /// </summary>
    [HideInInspector]
    public float splayThresholdValue
    {
   
    
    
        get
        {
   
    
    
            return _splayThresholdValue * front.rect.width;
        }
        set
        {
   
    
    
            _splayThresholdValue = value;
        }
    }

    /// <summary>
    /// 默认面膜左下角 这个值可以改变面膜的起始坐标
    /// </summary>
    public float orginOffsetRatio = 0.5f;


    /// <summary>
    /// 移动的阈值 大于这个值开始移动 过滤误触
    /// </summary>
    public float dragThresholdValue = Mathf.PI;

    /// <summary>
    /// 张开时 会触发
    /// 拖拽的方向
    /// </summary>
    [HideInInspector]
    public Action<Vector2> splayBeginHandler {
   
    
     set; get; }
    [HideInInspector]
    public Action<Vector2> splayHandler {
   
    
     set; get; }
    [HideInInspector]
    public Action<Vector2> splayProcess {
   
    
     set; get; }

    #endregion


    #region Public methods

    /// <summary>
    /// 设置面膜的前面图和后面图
    /// </summary>
    /// <param name="sprFront"></param>
    /// <param name="sprBack"></param>
    public void SetFrontBackSprite( Sprite sprFront, Sprite sprBack )
    {
   
    
    
        var imgFront = front.GetComponent<Image>();
        var imgBack = back.GetComponent<Image>();
        imgFront.sprite = sprFront;
        imgBack.sprite = sprBack;
        imgFront.SetNativeSize();
        imgBack.SetNativeSize();
    }

    #endregion




    #region Private methods


    private void RecordPosition(

猜你喜欢

转载自blog.csdn.net/qq_39162566/article/details/131657145
今日推荐