Advertisement
Muk99

Snap

Nov 19th, 2015
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.04 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5.  
  6. public class Snap : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler {
  7.  
  8.     public RectTransform sr;
  9.     public List<RectTransform> transforms = new List<RectTransform>();
  10.     //Se o dedo mover mais de 20 pixels ele da snap direto
  11.     public float snapOffset = 20f;
  12.     //Velocidade do lerp, 20 pixels por segundo
  13.     public float lerpSpeed = 20f;
  14.  
  15.     //O recttransform que ta sendo movido
  16.     private RectTransform snappingTransform;
  17.     private bool canSnap;
  18.  
  19.     private void Update() {
  20.         if(!snappingTransform)
  21.             snappingTransform = transforms.FirstOrDefault();
  22.  
  23.         if(canSnap)
  24.             sr.position = Vector3.Lerp(sr.position, snappingTransform.position, lerpSpeed * Time.deltaTime);
  25.     }
  26.  
  27.     public void OnPointerDown(PointerEventData eventData) {
  28.         canSnap = false;
  29.     }
  30.  
  31.     public void OnPointerUp(PointerEventData eventData) {
  32.         var offset = eventData.delta.x;
  33.  
  34.         if(Mathf.Abs(offset) > snapOffset) {
  35.             var currentIndex = transforms.IndexOf(snappingTransform);
  36.             currentIndex += (int)Mathf.Sign(offset);
  37.             //Se o ultimo rect não estiver indo tira o "-1"
  38.             currentIndex = Mathf.Clamp(currentIndex, 0, transforms.Count - 1);
  39.             snappingTransform = transforms[currentIndex];
  40.         }
  41.  
  42.         canSnap = true;
  43.     }
  44.  
  45.     public void OnDrag(PointerEventData eventData) {
  46.         var distances = new float[transforms.Count];
  47.  
  48.         for(int i = 0; i < distances.Length; i++)
  49.             distances[i] = Vector2.Distance(transforms[i].position, sr.position);
  50.  
  51.         var nearestDistance = Mathf.Min(distances);
  52.  
  53.         //Aprendi isso essa semana, deve funcionar bem
  54.         snappingTransform = (from rect in transforms
  55.                              where Mathf.Approximately(Vector2.Distance(rect.position, sr.position), nearestDistance)
  56.                              select rect).FirstOrDefault();
  57.     }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement