Advertisement
Muk99

Snap

Nov 20th, 2015
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.99 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6.  
  7. public class Snap : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler {
  8.  
  9.     public RectTransform sr;
  10.     public List<RectTransform> transforms = new List<RectTransform>();
  11.     public float snapOffset = 20f;
  12.     public float lerpSpeed = 20f;
  13.  
  14.     private RectTransform snappingTransform;
  15.     private bool canSnap;
  16.  
  17.     private void Start() {
  18.         if(GetComponent<ScrollRect>())
  19.             GetComponent<ScrollRect>().inertia = false;
  20.         else
  21.             Debug.LogWarning("Coloca no scroll rect");
  22.     }
  23.  
  24.     private void Update() {
  25.         if(!snappingTransform)
  26.             snappingTransform = transforms.FirstOrDefault();
  27.  
  28.         if(canSnap)
  29.             sr.position = Vector3.Lerp(sr.position, snappingTransform.position, lerpSpeed * Time.deltaTime);
  30.     }
  31.  
  32.     public void OnBeginDrag(PointerEventData eventData) {
  33.         canSnap = false;
  34.     }
  35.  
  36.     public void OnEndDrag(PointerEventData eventData) {
  37.         var offset = eventData.delta.x;
  38.  
  39.         if(Mathf.Abs(offset) > snapOffset) {
  40.             var currentIndex = transforms.IndexOf(snappingTransform);
  41.             currentIndex += (int)Mathf.Sign(offset);
  42.             currentIndex = Mathf.Clamp(currentIndex, 0, transforms.Count - 1);
  43.             snappingTransform = transforms[currentIndex];
  44.         }
  45.  
  46.         canSnap = true;
  47.     }
  48.  
  49.     public void OnDrag(PointerEventData eventData) {
  50.         var distances = new float[transforms.Count];
  51.  
  52.         for(int i = 0; i < distances.Length; i++)
  53.             distances[i] = Vector2.Distance(transforms[i].position, sr.position);
  54.  
  55.         var nearestDistance = Mathf.Min(distances);
  56.  
  57.         snappingTransform = (from rect in transforms
  58.                              where Mathf.Approximately(Vector2.Distance(rect.position, sr.position), nearestDistance)
  59.                              select rect).FirstOrDefault();
  60.     }
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement