Движущийся объект в игре - PullRequest
       18

Движущийся объект в игре

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

У меня есть изображение, и я пытаюсь перемещаться, используя функцию:

public void MoveXY(Vector2 target)
{
    Vector2 startPosition = this.pos;
    Vector2 endPosition = target;
    float lerpAmount = 0.05f;
    this.pos = Vector2.Lerp(startPosition, endPosition, lerpAmount);
}

Я вызываю это в цикле обновления игры.

Я хочу сделать некоторую переменную bool moving , которая отслеживает, что мой объект перемещается, но у меня сложилось представление о том, как реализовать это в игровом цикле.

Мне нужно что-то вроде:

obj.MoveXY(target1);

Если команда первая завершена

obj.MoveXY(target2);

Как правильно это сделать?

Ответы [ 3 ]

0 голосов
/ 06 октября 2018
// Specify the targets in the inspector
// Make sure you have at least one target, otherwise, you will have an IndexOutOfRange Exception
public Transform[] TargetObjects;
public float MovementSpeed = 1;
private bool objectMoving= false;
private int currentTargetIndex;

public void MoveObjectToTarget(Transform objectToMove, Transform target, float maxDistanceDelta )
{
    objectToMove.position = Vector2.MoveTowards(objectToMove.position, target.position, maxDistanceDelta );
    return (objectToMove.position - target.position).sqrMagnitude < 0.01f;
}

void Update()
{
    if( Input.GetKeyDown( KeyCode.Space ) ) // Toggle whether the object will move to the target
        objectMoving = !objectMoving;

    if( objectMoving )
    {
        if( MoveObjectToTarget( transform, TargetObjects[currentTargetIndex], Time.deltaTime * MovementSpeed; ) )
        {
            Debug.Log( "Target reached" ) ;
            currentTargetIndex = (currentTargetIndex + 1) % TargetObjects.Length ;
        }
    }
}
0 голосов
/ 06 октября 2018

Сложность, с которой вы сталкиваетесь, типична для игровых приложений.В отличие от обычных приложений, вы не можете просто отразить последовательности действий с помощью последовательностей операторов, так как при каждом обновлении игрового цикла будет выполняться только крошечная их часть.

Вы должны помнить текущее состояние игры икаждое действие через обновления.Это может стать довольно сложным.Решение этой проблемы состоит в том, чтобы использовать конечный автомат , как описано здесь Шаблоны программирования игр / Шаблоны проектирования: состояние и здесь Машины конечного состояния разработки игр: теория иОсуществление .

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

Вы можете использовать этот простой код для перемещения объекта:

pulbic class ObjectMove : MonoBehaviour
{
    Vector2 targetPos;
    float lerpAmount = 0.05f;
    public bool moving = true;

    void Update()
    {
        transform.position = Vector2.Lerp(transform.position, targetPos, lerpAmount);

        if(transform.position == target.position)
           moving = false;
    }

    public void MoveXY(Vector2 target)
    {
        targetPos = target;
        moving = true;
    }
}

Затем в другом скрипте вы можете проверить, прибывает ли объект к цели, установить новую цель:

if(obj.moving == false)
   obj.MoveXY(newTarget);

Надеюсь, это поможет вам.

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