- Home /
Question by
yusufdemir2012 · Sep 27, 2021 at 04:07 PM ·
transformscale
Adjusting custom 2D transform gizmos to work with rotated shapes
I am trying to coding 2D transform gizmos with Rotate and Scale options. There are only two button. One is for rotate the object and another one is for scale the object in local space:
https://gfycat.com/celebratedpleasantharborporpoise
If rotation z (angle) of the target shape is equal to 0, then there is no problem. But if I rotate the object, then local scaling is not working correctly (As you can see in gif).
My Code:
using UnityEngine;
public class Test : MonoBehaviour
{
//Shape
[Header("Shape")]
public Transform shapeTransform;
//Rotate
[Header("Rotate")]
public RectTransform rotateButtonRectTransform;
private Vector3 rotateButtonDragOffset;
private bool rotateButtonDown;
//Scale
[Header("Scale")]
public RectTransform scaleButtonOriginRectTransform;
public RectTransform scaleButtonRectTransform;
public float scaleMultiplier = 0.005f;
private Vector3 scaleButtonDragOffset;
private Vector3 oldScale;
private Vector3 scaleButtonPosition;
private bool scaleButtonDown;
//General
public RectTransform handleTransform;
public void OnRotateButtonDown()
{//Firing by EventTrigger
rotateButtonDragOffset = rotateButtonRectTransform.position - Input.mousePosition;
rotateButtonDown = true;
}
public void OnRotateButtonUp()
{//Firing by EventTrigger
rotateButtonDown = false;
}
public void OnScaleButtonDown()
{//Firing by EventTrigger
scaleButtonDragOffset = scaleButtonRectTransform.position - Input.mousePosition;
oldScale = shapeTransform.localScale;
scaleButtonPosition = scaleButtonRectTransform.position;
scaleButtonDown = true;
}
public void OnScaleButtonUp()
{//Firing by EventTrigger
scaleButtonDown = false;
scaleButtonRectTransform.position = scaleButtonPosition;
}
private void Update()
{
//Rotate
if (rotateButtonDown)
{
Vector3 targetPosition = Input.mousePosition + rotateButtonDragOffset;
Vector3 pos = Vector3.Normalize(targetPosition - handleTransform.position);
handleTransform.eulerAngles = new Vector3(0f, 0f, Mathf.Atan2(-pos.x, pos.y)) * Mathf.Rad2Deg;
//Set rotation of shape
var eulerAngles = shapeTransform.eulerAngles;
eulerAngles.z = handleTransform.eulerAngles.z;
shapeTransform.eulerAngles = eulerAngles;
}
//Scale
if (scaleButtonDown)
{
scaleButtonRectTransform.position = Input.mousePosition + scaleButtonDragOffset;
Vector3 dif = scaleButtonPosition - scaleButtonRectTransform.position;
Vector2 scale = new Vector2(
oldScale.x + (dif.x * scaleMultiplier),
oldScale.y + (-1f * (dif.y * scaleMultiplier))
);
//Set scale of shape
shapeTransform.localScale = new Vector3(scale.x, scale.y, 1f);
}
//Scale and rotate gizmo
ScaleAndRotateGizmo();
}
private void ScaleAndRotateGizmo()
{
var distance = Vector3.Distance(scaleButtonOriginRectTransform.position, scaleButtonRectTransform.position);
scaleButtonOriginRectTransform.localScale = new Vector3(1f, distance * 0.004f, 1f);
Vector3 targetPosition = scaleButtonRectTransform.position;
Vector3 pos = Vector3.Normalize(targetPosition - scaleButtonOriginRectTransform.position);
scaleButtonOriginRectTransform.eulerAngles = new Vector3(0f, 0f, Mathf.Atan2(-pos.x, pos.y)) * Mathf.Rad2Deg;
}
}
[1]: https://gfycat.com/celebratedpleasantharborporpoise
Comment
Your answer
Follow this Question
Related Questions
Problems with scale and rotation 2 Answers
Scale script don´t work 0 Answers
How do I set the global scale of an object in a transform hierachy? 3 Answers