Почему скриптовое перемещение и вращение спрайта замедляются при сборке WebGL?

#c# #unity3d

#c# #unity3d

Вопрос:

Я начинающий разработчик Unity. Я создал это.

введите описание изображения здесь

Мастер в правом верхнем углу появляется из-за пределов экрана при запуске игры. Затем останавливается и бросает топор. Что в конечном итоге поражает детектива и заставляет его падать.

У мастера и топора есть свои скрипты. К мастеру не подключен компонент. Axe имеет жесткое тело (шкала тяжести установлена на 0) и прикрепленный коллайдер.

Сценарий мастера:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class WizardMover : MonoBehaviour
{
    public Vector3 move;
 
    // Start is called before the first frame update
    void Start()
    {
       
    }
 
    // Update is called once per frame
    void Update()
    {  
        // Wizard stops at at a specific postion
        if (transform.localPosition.x > 5.79)
        {
            transform.localPosition -= move;
        }
    }
}
 

И скрипт для axe:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class AxeFly : MonoBehaviour
{
    public Vector3 move;
    public Vector3 rotate;
 
    // Start is called before the first frame update
    void Start()
    {
       
    }
 
    // Update is called once per frame
    void Update()
    {
        transform.localPosition -= move;
 
        // Axe starts rotating when thrown
        if (transform.localPosition.x < 5.80)
        {
            transform.Rotate(rotate);
        }
    }
}
 

Все работает так, как ожидалось, когда я играю в Unity. Но скорость скриптового перемещения и вращения как мастера, так и топора значительно снижается при сборке WebGL. Почему это происходит?

Комментарии:

1. Я вижу, что вы не используете систему времени. Это может вызвать проблемы, когда FPS нестабилен, особенно при переключении на другой серверный сервер (WebGL здесь ). Я предлагаю использовать здесь velocity и обновлять позицию следующим образом transform.localPosition = velocity * Time.deltaTime

2. Вы уверены, что сделали это? А не скобки?

3. @Swagrim Да, я сделал это, используя 2D-мега-ресурсы Brackeyes. Почему это имеет значение?

4. О, не имеет значения. Извините..

Ответ №1:

Ваш код зависит от частоты кадров!

Это означает, что на более мощном устройстве, которое может работать с более высокой частотой кадров в секунду (кадров в секунду), ваш Update метод вызывается чаще в течение того же абсолютного реального времени, что и на слабом устройстве с более низкой частотой кадров в секунду.

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


Для непрерывной анимации в Unity вы всегда должны использовать Time.deltaTime

Интервал в секундах от последнего кадра до текущего (только для чтения).

(или иногда даже Time.unscaledDeltaTime в тех случаях, когда вы хотите игнорировать текущее Time.timeScale )

который в основном преобразует любое значение из value per frame в a value per second .

 transform.localPosition -= move * Time.deltaTime;
 

и

 transform.Rotate(rotate * Time.deltaTime);
 

отрегулируйте move и rotate соответственно ожидаемому абсолютному значению в секунду.