Объекты очень быстро перемещаются в игре unity2d, когда они создаются и запускаются как .exe - PullRequest
0 голосов
/ 11 февраля 2019

В игре у меня есть спрайт, который перемещается между двумя точками Transform с.

В редакторе спрайт перемещается между точками нормально и с постоянной медленной скоростью.

Однако, когда я собираю игру в файл .exe и запускаю его, спрайт очень быстро перемещается между двумя точками.

Вот соответствующий код для контроллера спрайта:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class MonsterController : MonoBehaviour
{
    public Transform pointOne;
    public Transform pointTwo;
    public float speed;
    private bool pointA;
    private bool goingRight;
    private Animator anim;
    public string animLeft;
    public string animRight;

    void Start()
    {
        pointA = true;
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        if (pointA)
        {
            if (transform.position == pointOne.transform.position)
            {
                pointA = false;
            }
            transform.position = Vector2.MoveTowards(transform.position, pointOne.position, speed * Time.fixedDeltaTime;);
            goingRight = true;
        }
        else
        {
            if (transform.position == pointTwo.transform.position)
            {
                pointA = true;
            }
            transform.position = Vector2.MoveTowards(transform.position, pointTwo.position, speed * Time.fixedDeltaTime);
            goingRight = false;
        }

        if (goingRight)
        {
            anim.Play(animRight);
        }
        else
        {
            anim.Play(animLeft);
        }
    }
}

Как видно, если спрайт достигнет этой точки, он переместится в другую точку, используя Vector2.MoveTowards().Любые советы и помощь приветствуются.

1 Ответ

0 голосов
/ 11 февраля 2019

Как упомянуто в комментариях, вы должны либо использовать

FixedUpdate или Time.deltaTime .


  • Обновление вызывается каждый кадр

  • FixedUpdate вызывается через определенный интервал реального времени (по умолчанию обычно 0.02 seconds)

Соответствующие Time значения

  • Time.deltaTime : время, прошедшее с момента последнего отображенияframe

  • Time.fixedDeltaTime : Интервал реального времени, в котором вызываются физические методы и, например, FixedUpdate (как сказано по умолчанию 0.02 seconds или 50 разв секунду)

Поэтому, как только ваше приложение будет работать с частотой кадров > 50, вы получите большее значение от Time.fixedDeltaTime (= 0.02), чем от Time.deltaTime (например,для 60 кадров в секунду = 0.017)


Поэтому использование Time.fixedDeltaTime в методе Update может привести к получению более значительных значений / движений, чем ожидалось, если скорость очень высокая.В редакторе частота кадров медленнее, чем в сборке, потому что в приложении для сборки вы избавляетесь от всех накладных расходов UnityEditor.


, так что это должно быть лучше (также просто немного if-else, используявстроенный ? -оператор для лучшей читаемости)

private void Update()
{
    var targetPosition = pointA ? pointOne.position : pointTwo.position;

    if (transform.position == targetPosition)
    {
        // invert pointA
        pointA = !pointA;
        // also update the targetPosition
        targetPosition = pointA ? pointOne.position : pointTwo.position;
    }

    // move towards the target using Time.deltaTime
    transform.position = Vector2.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);

    // actually you could get rid of this flag as well
    // since it always has the same value as pointA
    goingRight = pointA;

    anim.Play(goingRight ? animRight : animLeft);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...