Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using UnityEngine.UI;
- using System.Collections.Generic;
- using UniRx;
- namespace AnimalSimulator.PaintMode.UI.ColorPanel
- {
- public class CirclePanel : MonoBehaviour
- {
- [SerializeField] private float _sensitivity = 2f;
- [SerializeField] private bool _invert;
- [SerializeField] private FloatReactiveProperty _angle = new FloatReactiveProperty(10f);
- [SerializeField] private float _radius = 340f;
- [SerializeField] private float _itemSize = 50f;
- [SerializeField] private Transform _contentContainer;
- [SerializeField] private DragHandler _dragHandler;
- [SerializeField] private GridLayoutGroup.Axis _axis;
- private readonly List<Transform> _objects = new List<Transform>();
- [SerializeField] private float _debugAngle = 45f;
- private void OnEnable()
- {
- _angle.TakeUntilDisable(this).Subscribe(f => CalculatePositions());
- _dragHandler.OnDrag.TakeUntilDisable(this).Subscribe(data => Rotate(data.delta));
- }
- public void AddObject(GameObject @object, bool reCalculatePositions = false)
- => AddObject(@object.transform, reCalculatePositions);
- public void AddObject(Transform @object, bool reCalculatePositions = false)
- {
- @object.parent = _contentContainer;
- _objects.Add(@object);
- if (reCalculatePositions)
- CalculatePositions();
- }
- public void CalculatePositions()
- {
- Quaternion rotationStep = Quaternion.Euler(0, 0, _angle.Value);
- Vector3 localPosition = rotationStep * Vector3.up * _radius;
- foreach (Transform child in _contentContainer)
- {
- localPosition = rotationStep * localPosition;
- child.localPosition = localPosition;
- }
- }
- private void Rotate(Vector2 delta)
- {
- bool isHorizontal = _axis == GridLayoutGroup.Axis.Horizontal;
- float angle = isHorizontal ? delta.x : delta.y;
- int invert = _invert ? -1 : 1;
- angle *= _sensitivity * invert;
- var position = transform.position;
- transform.RotateAround(position, Vector3.forward, angle);
- }
- private void OnDrawGizmos()
- {
- Gizmos.color = Color.red;
- var position = transform.position;
- Vector3 offsetPosition = Quaternion.Euler(0, 0, z: _debugAngle) * Vector3.up * _radius;
- Vector3 targetPosition = position + offsetPosition;
- Gizmos.DrawLine(position, targetPosition);
- Gizmos.color = Color.green;
- Gizmos.DrawWireSphere(targetPosition, _itemSize);
- }
- }
- }
Add Comment
Please, Sign In to add comment