using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace JCUnityLib.UI { [ExecuteAlways] [RequireComponent(typeof(Image))] public class ValidateJigsaw : MonoBehaviour { const string _SHADER_NAME = "JC/UI/ValidateJigsaw"; RectTransform _rectTransform; Image _image; public Color gapColor = Color.black; public Color gapBorderColor = Color.white; public float gapBorderWidth = 0.5f; public float gapSize = 20; public Vector2 originalPosition = new Vector2(40, 40); public Vector2 currentPosition = new Vector2(10, 40); void Update() { if (!_rectTransform) _rectTransform = GetComponent(); if (!_image) _image = GetComponent(); if (_image.material == null || _image.material.shader.name != _SHADER_NAME) _image.material = new Material(Shader.Find(_SHADER_NAME)); Material imageMaterial = _image.material; if (!imageMaterial) return; imageMaterial.SetFloat("_NodeWidth", _rectTransform.rect.width); imageMaterial.SetFloat("_NodeHeight", _rectTransform.rect.height); imageMaterial.SetColor("_GapColor", gapColor); imageMaterial.SetColor("_GapBorderColor", gapBorderColor); imageMaterial.SetFloat("_GapBorderWidth", gapBorderWidth); imageMaterial.SetFloat("_GapSize", gapSize); imageMaterial.SetVector("_OriginalPosition", originalPosition); imageMaterial.SetVector("_CurrentPosition", currentPosition); } public void SetCurrentPositionByPercent(float value) { currentPosition.x = (_rectTransform.rect.width - gapSize) * value; } public void InitRandomPosition() { if (!_rectTransform) _rectTransform = GetComponent(); float minX = _rectTransform.rect.width * 0.2f + gapSize; float maxX = _rectTransform.rect.width * 0.9f - gapSize; float minY = _rectTransform.rect.height * 0.1f; float maxY = _rectTransform.rect.height * 0.9f - gapSize; originalPosition.x = minX + (maxX - minX) * Random.value; originalPosition.y = minY + (maxY - minY) * Random.value; currentPosition.x = 0; currentPosition.y = originalPosition.y; } public bool IsFit() { if (!_rectTransform) _rectTransform = GetComponent(); return Mathf.Abs(currentPosition.x - originalPosition.x) / (_rectTransform.rect.width - gapSize) < 0.0125; } } }