Unity 3D Spinning игровой объект
Я пытаюсь раскрутить трехмерный игровой объект в единство. На самом деле это цилиндр с текстурой покерного фишки. Я хочу повернуть его на 360 градусов после того, как он столкнулся с радиопередачей. Он прекрасно работает в эмуляторе Unity, однако на самом устройстве микросхема останавливается после своего вращения, а затем продолжает вращаться в бесконечном цикле. Вот фрагмент кода, о котором идет речь. Спасибо за любую помощь заранее.
// Spin the chip
if (Animate) {
if (Speed > 0 && Chip.tag.Contains("Chip")) {
Chip.transform.Rotate(0, Speed*Time.deltaTime, 0);
Speed -= 3;
Debug.Log(Speed);
}
else {
// Reset
Animate = false;
Speed = 360;
Chip.transform.localRotation = Quaternion.Euler(0.0,0.0,0.0);
}
}
Чтобы суммировать это лучше всего, я могу назначить игровой объект чип, когда он сталкивается на радиопередаче как таковой
// Set the chip
Chip = hit.transform;
Все сделано в функции обновления. Как только Raycast попадает, он вызывает функцию ставок, а затем, после того, как она рассчитана, она меняет логическое значение Animate на true, вызывая вращение фишки.
4 ответа
Что-то настраивает Animate = true
в каком-то другом коде трудно сказать, что происходит, не видя всего остального.
Поместите некоторую отладку рядом с каждым местом, где Animate установлено в true, вы должны увидеть что-то еще, устанавливающее его, только возможное объяснение того, почему оно продолжает вращаться.
Другой вариант - использовать инструмент "Анимация", и вместо вращения вы просто воспроизводите анимацию, которая выполняет вращение за вас.
Редактировать: Скорее всего, это сенсорный код, потому что при отладке в редакторе вы используете нажатия клавиш. Готча, которую я испытал несколько раз.
var rotSpeed: float = 60; // degrees per second
function Update(){
transform.Rotate(0, rotSpeed * Time.deltaTime, 0, Space.World);
}
Вот код, который вращает ваш игровой объект, вы можете использовать его только с вектором 3:transform.Rotate(x, y, z);
или с пробелом transform.Rotate(x, y, z, Space.World);
rotSpeed
скорость вращения
Джеймс Грамосли прав в том, что какой-то другой код снова запускает анимацию, и это, скорее всего, ваш сенсорный код. Это общая проблема при перемещении между редактором и сенсорным устройством. Вы можете определить, так ли это, используя UnityRemote для проверки потока управления вашего кода.
Тем не менее, я бы изменил ваш код на следующий, который удаляет код вращения из цикла обновления, который выполняется каждый кадр. Это небольшая оптимизация, но в основном она очищает архитектуру и делает ее более модульной и немного более аккуратной.
Это не ясно из вашего фрагмента кода, но я предполагаю, что вы используете UnityScript.
В вашем скрипте, который обрабатывает сенсорный код при нажатии на чип, вставьте эту строку:
hit.transform.SendMessage("Spin", hit.transform, SendMessageOptions.DontRequireReceiver);
Поместите этот код в отдельный скрипт под названием "SpinChip", а затем добавьте скрипт в объект вашего чипа.
var StartSpeed = 360.0;
var Deceleration = 3.0;
function Spin()
{
if (Animating)
{
print("Chip is already spinning, not starting another animation");
return;
}
/*
This code isn't necessary if this exists in a separate script and is only ever attached to the clickable chip
if (!gameObject.tag.Contains("Chip"))
{
print("That wasn't a chip you clicked");
return;
}
*/
print("Chip has been told to spin");
StartCoroutine(SpinningAnimation);
}
function SpinningAnimation()
{
print("Chip spin start");
transform.localRotation = Quaternion.identity;
Speed = StartSpeed;
Animating = true;
while (Speed > 0)
{
transform.Rotate(0, Speed*Time.deltaTime, 0);
Speed -= Deceleration;
yield; // wait one frame
}
print("Chip has completed the spin");
Animating = false;
}
Этот код создает подпрограмму, которая запускается один раз за цикл обновления при активации, которая раскручивает чип для вас и не зависит от вашего фактического кода нажатия кнопки.
В вашей функции обновления. Переменная Bool Animate может стать истинной. Это может быть причиной того, что ваш цилиндр продолжает вращаться.
Другое решение: вы можете создать анимацию вашего цилиндра, а затем взять секундомер. Так что через некоторое время вы можете остановить анимацию, используя время секундомера