Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- using UnityEngine.EventSystems;
- public class Snap : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler {
- public RectTransform sr;
- public List<RectTransform> transforms = new List<RectTransform>();
- //Se o dedo mover mais de 20 pixels ele da snap direto
- public float snapOffset = 20f;
- //Velocidade do lerp, 20 pixels por segundo
- public float lerpSpeed = 20f;
- //O recttransform que ta sendo movido
- private RectTransform snappingTransform;
- private bool canSnap;
- private void Update() {
- if(!snappingTransform)
- snappingTransform = transforms.FirstOrDefault();
- if(canSnap)
- sr.position = Vector3.Lerp(sr.position, snappingTransform.position, lerpSpeed * Time.deltaTime);
- }
- public void OnPointerDown(PointerEventData eventData) {
- canSnap = false;
- }
- public void OnPointerUp(PointerEventData eventData) {
- var offset = eventData.delta.x;
- if(Mathf.Abs(offset) > snapOffset) {
- var currentIndex = transforms.IndexOf(snappingTransform);
- currentIndex += (int)Mathf.Sign(offset);
- //Se o ultimo rect não estiver indo tira o "-1"
- currentIndex = Mathf.Clamp(currentIndex, 0, transforms.Count - 1);
- snappingTransform = transforms[currentIndex];
- }
- canSnap = true;
- }
- public void OnDrag(PointerEventData eventData) {
- var distances = new float[transforms.Count];
- for(int i = 0; i < distances.Length; i++)
- distances[i] = Vector2.Distance(transforms[i].position, sr.position);
- var nearestDistance = Mathf.Min(distances);
- //Aprendi isso essa semana, deve funcionar bem
- snappingTransform = (from rect in transforms
- where Mathf.Approximately(Vector2.Distance(rect.position, sr.position), nearestDistance)
- select rect).FirstOrDefault();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement