using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateAndScale : MonoBehaviour
{
public Transform target; // Target to scale
public Vector3 minScale; // Minimum scale value
public Vector3 maxScale; // Maximum scale value
public Vector3 minRotate; // Minimum rotate value
public Vector3 maxRotate; // Maximum rotate value
public float speed; // Scale and rotate speed
public bool interruptCoroutine = false; // Can interrupt coroutine in the middle
public bool randomRotDir = false; // If true object will rotate randomly or to left or to right
// Flag for blocking input until one routine is done
private bool isMoving;
// Flag for deciding in which direction to go next
// Via the Inspector set this to the direction it shall initially go towards
[SerializeField] bool towardsMaxMin;
private float t = 0.0f;
private void Start()
{
Init(towardsMaxMin);
}
void Update()
{
if (interruptCoroutine == true)
{
if (Input.GetKeyDown(KeyCode.C))
{
StopAllCoroutines();
StartCoroutine(DoMove());
}
}
else
{
if (!isMoving && Input.GetKeyDown(KeyCode.C))
{
StartCoroutine(DoMove());
}
}
}
// Once started via a StartCoroutine call this will be executed
// every frame until the next yield command
IEnumerator DoMove()
{
// Invert direction for the next time
towardsMaxMin = !towardsMaxMin;
if (interruptCoroutine == false)
{
// Just in case block concurrent routines
if (isMoving) yield break;
// Block input
isMoving = true;
}
// Decide if going to Max or min
var targetRot = Quaternion.Euler(towardsMaxMin ? minRotate : maxRotate);
var targetScale = towardsMaxMin ? minScale : maxScale;
// Store Start values
var startRot = target.localRotation;
var startScale = target.localScale;
var duration = 1 / speed;
var timePassed = 0f;
while (timePassed < duration)
{
t = timePassed / duration;
target.localScale = Vector3.Lerp(startScale, targetScale, t);
target.localRotation = Quaternion.Lerp(startRot, targetRot, t);
// Increase the time passed since last frame
timePassed += Time.deltaTime;
// This tells Unity to "pause" the routine here,
// render this frame and continue from here
// in the next frame
yield return null;
}
// Just to be sure to end with exact values apply them hard once
target.localScale = targetScale;
target.localRotation = targetRot;
if (interruptCoroutine == false)
{
// Done -> unlock input
isMoving = false;
}
}
private void Init(bool towardsMaxMin)
{
if (towardsMaxMin == true)
{
// True = min
transform.localScale = minScale;
transform.rotation = Quaternion.Euler(minRotate);
}
else
{
// False = max
transform.localScale = maxScale;
transform.rotation = Quaternion.Euler(maxRotate);
}
}
}
Я добавил для этого глобальный флаг: randomRotDir
Когда я нажимаю C, один раз он будет масштабироваться и поворачивать объект одновременно от минимума до максимума или от максимума до минимума. Но он всегда будет снова поворачиваться влево либо с минимума на максимум, либо с максимума на мин.
левая сторона. Я имею в виду, что он будет вращаться на Y от 0 до -180, например, но я хочу, чтобы, когда я нажимал на c, иногда это будет вращаться от 0 до -180, а иногда от 180 до 0 и то же самое от максимума до мин -180 до 0 или от 180 до 0.
Это рисование того, что я имею в виду случайным образом Y направления влево или вправо:
Некоторые скриншоты. При запуске игры объект для вращения и масштабирования NAVI в этом случае его вращение составляет 0,0,0
Следующий снимок экрана, который я сделал в посередине после нажатия C теперь вращение NAVI по Y равно -131,259
Когда сопрограмма будет завершена, вращение NAVI будет максимальным:
Теперь, если я снова нажму C, он будет вращаться и снова уменьшаться до минимума, он будет вращаться на Y влево. И я хочу, чтобы случайным образом при нажатии на C иногда он вращался слева, а иногда справа.
Это пример того, что я имею в виду вращение справа: теперь вращение NAVI в середине составляет 0,149,68,0
Раньше, когда он вращался слева, он был в середине отрицательным -131.259
Это то, что я имею в виду, чтобы случайно повернуть один раз слева один раз справа.