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 может стать истинной. Это может быть причиной того, что ваш цилиндр продолжает вращаться.

Другое решение: вы можете создать анимацию вашего цилиндра, а затем взять секундомер. Так что через некоторое время вы можете остановить анимацию, используя время секундомера

Другие вопросы по тегам