Как одновременно масштабировать и вращать изображение пользовательского интерфейса и его дочерние элементы?C#

Место общения программистов C#
Ответить
Anonymous
 Как одновременно масштабировать и вращать изображение пользовательского интерфейса и его дочерние элементы?

Сообщение Anonymous »

Изображение пользовательского интерфейса является дочерним элементом холста, установленного в мировом пространстве.
У изображения пользовательского интерфейса есть некоторые дочерние элементы пользовательского интерфейса, такие как textmesh pro, которые я хочу масштабировать и вращать вместе с изображением.
скриншот настроек холста
Изображение
и скриншот изображения настройки
Изображение

пока он масштабируется и вращается, дочерние элементы изображения теряют выравнивание и выходят за пределы области границ изображения, а не уменьшаются, оставаясь привязанными к изображению.
также все это немного масштабируется до размера правильная точка, а не прямое масштабирование вниз, как будто он немного меняет положение.
Изображение

эффект, который я хочу сделать, — это анимировать сжатие главного меню, а затем изменение его размера обратно при нажатии клавиши S.
это скрипт, прикрепленный к пользовательскому интерфейсу изображения< /p>
using System.Collections;
using UnityEngine;

public class ScaleAndRotate : MonoBehaviour
{
public GameObject objectToScale; // Object to scale and rotate
public float duration = 1f; // Duration for scaling and rotating
public Vector3 minSize; // Minimum scale size
public Vector3 maxSize; // Maximum scale size
public bool rotateObject = false; // Toggle rotation during scaling
public float rotationSpeed = 360f; // Rotation speed in degrees per second

private bool scaleUp = false; // Determines the scaling direction
private Coroutine activeCoroutine; // Keeps track of the active coroutine
private Vector3 startScale;
private Quaternion initialRotation; // Stores the initial rotation

private void Start()
{
// Store the initial rotation of the object
initialRotation = objectToScale.transform.rotation;

// Determine initial scaling direction based on the current scale
Vector3 currentScale = objectToScale.transform.localScale;
scaleUp = Vector3.Distance(currentScale, minSize) < Vector3.Distance(currentScale, maxSize);
}

private void Update()
{
// Toggle scaling direction with 'S' key
if (Input.GetKeyDown(KeyCode.S))
{
if (activeCoroutine != null)
{
StopCoroutine(activeCoroutine);
}

// Reverse scaling direction and restart the scaling and rotation
Vector3 targetScale;
if (scaleUp)
{
targetScale = maxSize; // Scale up to maxSize
}
else
{
targetScale = minSize; // Scale down to minSize
}

// Toggle the direction for the next press
scaleUp = !scaleUp;

// Start the coroutine
activeCoroutine = StartCoroutine(ScaleAndRotateOverTime(objectToScale, targetScale, duration));
}
}

private IEnumerator ScaleAndRotateOverTime(GameObject targetObj, Vector3 toScale, float duration)
{
float counter = 0f;
startScale = targetObj.transform.localScale;

Quaternion startRotation = targetObj.transform.rotation;

while (counter < duration)
{
counter += Time.deltaTime;

// Smoothly scale the object
targetObj.transform.localScale = Vector3.Lerp(startScale, toScale, counter / duration);

// Rotate the object continuously while scaling
if (rotateObject)
{
float rotationStep = rotationSpeed * Time.deltaTime;
targetObj.transform.Rotate(Vector3.up, rotationStep, Space.Self);
}

yield return null;
}

// Ensure the scale reaches the exact target at the end
targetObj.transform.localScale = toScale;

// After scaling down, reset the rotation only when scaling to minSize
if (!scaleUp)
{
targetObj.transform.rotation = initialRotation;
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... s-children
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»