#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
соответственно ожидаемому абсолютному значению в секунду.