Что уменьшит нервное поведение кусочков тетромино в этой функции? - PullRequest
0 голосов
/ 17 октября 2018

Я занимаюсь разработкой игры Unity на C #.Каждое тетромино имеет уникальный ярлык или изображение и уникальное место для посадки.Если он приземляется не в том месте, я использую следующее, чтобы переместить его в нужное место перед тем, как создать следующий фрагмент:

void MoveMisplacedShapeToCorrectLocation(Shape shape, Vector3 vector3)
{
    float speed = 15;
    Vector3 targetPosition = m_gameBoard.m_dictionaryOfProperLocations[shape.name];
    Vector3 currentPosition = shape.transform.position;

    // First, check to see if the shape is close enough to the target
    if (Vector3.Distance(currentPosition, targetPosition) > .02f)
    {
        Vector3 directionOfTravel = targetPosition - currentPosition;

        // Normalize the direction, since we only want the direction information, not the magnitude.
        directionOfTravel.Normalize();

        // Scale the movement on each axis by the directionOfTravel vector components
        shape.transform.Translate(
            (directionOfTravel.x * speed * Time.deltaTime),
            (directionOfTravel.y * speed * Time.deltaTime),
            (directionOfTravel.z * speed * Time.deltaTime),
            Space.World);
    }
    else 
    {
        isMisplaced = false;
    }

}

В моей функции обновления у меня есть следующее:

// Update is called once per frame
void Update () {

    PlayerInput();

    if (isMisplaced == true)
    {
        MoveMisplacedShapeToCorrectLocation(m_activeShape, transform.position);
    }
}

Это работает довольно хорошо, но некоторые формы энергично колеблются в течение нескольких секунд, когда они достигают своего места, прежде чем обосноваться, в то время как другие располагаются так же плавно, как если бы они щелкнули в .Я не понимаю почему.Я изменил скорость, и это, кажется, не имеет большого эффекта.Я также изменил расстояние (0,02 выше) в условии if, и это имеет некоторый эффект.Но я хочу, чтобы это расстояние было небольшим (> = 0,03), в противном случае, когда все фигуры находятся на своих местах, слишком много выглядит «зазубренным».

Есть ли что-нибудь, что можно сделать, чтобы подавитьдрожит?

ОБНОВЛЕНИЕ, поскольку я попытался последовать совету Рона в первоначальном комментарии :

Следуя совету Рона в первоначальном комментарии ниже, вот что я попробовалиспользуя Vector3.MoveTowards:

    void MoveMisplacedShapeToCorrectLocation(Shape shape)
{
    float speed = 15;
    float step = speed * Time.deltaTime; // The step size is equal to speed times the frame time.

    Vector3 targetPosition = m_gameBoard.m_dictionaryOfProperLocations[shape.name];
    Vector3 currentPosition = shape.transform.position;

    // Check if the shape is unacceptably far from the target position:
    if (Vector3.Distance(currentPosition, targetPosition) > .02f)
    {
        Debug.LogWarning("Vector3.Distance");
        Debug.LogWarning(Vector3.Distance(currentPosition, targetPosition));
        Debug.LogWarning("step");
        Debug.LogWarning(step);
        // Move our position a step closer to the target.
        currentPosition = Vector3.MoveTowards(currentPosition, targetPosition, step);
    }
    else 
    {
        isMisplaced = false;
    }

}

И я немного изменил свою функцию обновления следующим образом (сейчас я использую только одну пару параметр-аргумент, а не две. В моем первом посте второй параметрпара аргументов не нужна.):

// Update is called once per frame
void Update () {

    PlayerInput();

    if (isMisplaced == true)
    {
        MoveMisplacedShapeToCorrectLocation(m_activeShape);
    }
}

Однако это не работает.Неправильно приземленная фигура просто сидит там, где она приземлилась. Я был бы признателен за вашу помощь.Спасибо.

1 Ответ

0 голосов
/ 20 октября 2018

Я получил эту работу, используя Vector3.MoveTowards и не назначая shape.transform.position новой переменной «currentPosition» (в отличие от кода, который я разместил в ОБНОВЛЕНИИ для исходного вопроса выше), следующим образом:

    void MoveMisplacedShapeToCorrectLocation(Shape shape)
{
    float speed = 10;
    float step = speed * Time.deltaTime; // The step size is equal to speed times the frame time.

    Vector3 targetPosition = m_gameBoard.m_dictionaryOfProperLocations[shape.name];

    // Check if the shape is unacceptably far from the target position:
    if (Vector3.Distance(shape.transform.position, targetPosition) > .02f)
    {

        // Move our position a step closer to the target.
        shape.transform.position = Vector3.MoveTowards(shape.transform.position, targetPosition, step);
    }
    else 
    {
        isMisplaced = false;
    }

}

и

// Update is called once per frame
void Update () {

PlayerInput();

if (isMisplaced == true)
    {
        MoveMisplacedShapeToCorrectLocation(m_activeShape);
    }
}

Спасибо @Ron Beyer за ваш комментарий, который направил меня в нужном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...