| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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<RectTransform>();
- if (!_image) _image = GetComponent<Image>();
- 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<RectTransform>();
- 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<RectTransform>();
- return Mathf.Abs(currentPosition.x - originalPosition.x) / (_rectTransform.rect.width - gapSize) < 0.0125;
- }
- }
- }
|