GameObject не движется как задумано - PullRequest
2 голосов
/ 21 мая 2019

У меня есть этот код, чтобы переместить мой грузовик в моей сцене в Unity:

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

public class TruckMovement : MonoBehaviour
{
Coroutine TruckC;
bool forward = false;
Rigidbody2D truck;
bool collisionTruck = false;

void Start()
{
    truck = GetComponent<Rigidbody2D>();
    TruckC = StartCoroutine(Truck());
}

void OnDestroy()
{
    StopCoroutine(TruckC);
}




IEnumerator Truck()
{
    while(true)
    {
        if(forward)
        {
            truck.velocity = Vector3.right;
        }
        else
        {
            truck.velocity = Vector3.left;
        }
        yield return new WaitUntil(() => collisionTruck != true);
        forward = !forward;
    }
}

void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.collider.tag.Equals("Bound"))
    {
        collisionTruck = true;
    }
}

void OnCollisionExit2D(Collision2D collision)
{
    if (collision.collider.tag.Equals("Bound"))
    {
        collisionTruck = false;
    }
}
}

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

enter image description here

Моя сцена довольно странная, поэтому я рисую ужасную картину, подобную этой.

Кроме того, изображение со сцены:

enter image description here

Проблема в том, что грузовик не движется и вибрирует.

Как я могу решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 21 мая 2019

Почему вы даже используете сопрограмму для этого?

На самом деле вы можете просто сделать это прямо в простой метод, не имея дело с флагами или ждать, как это:

public class TruckMovement : MonoBehaviour
{
    private bool forward = false;
    private Rigidbody2D truck;

    private void Awake()
    {
        truck = GetComponent<Rigidbody2D>();
    }

    private void Start()
    {
        // Start moving at the beginning
        ChangeDirection();
    }

    private void ChangeDirection()
    {
        forward = !forward;

        truck.velocity = forward ? Vector2.right : Vector2.left;      
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.collider.tag.Equals("Bound"))
        {
            ChangeDirection();
        }
    }
}
3 голосов
/ 21 мая 2019

Я думаю, что ваша проблема будет решена, если вы инициализируете collisionTruck как истину:

bool collisionTruck = true;

Сейчас вы инициализируете ее как false, и каждый раз, когда она false, она будет менять направление:

yield return new WaitUntil(() => collisionTruck != true);
forward = !forward;

Лично я бы изменил имя переменной на shouldChangeDirection, чтобы ваш код выглядел примерно так:

/* More stuff */

bool shouldChangeDirection = false;

/* More stuff*/

IEnumerator Truck()
{
    while(true)
    {
        if (forward)
        {
            truck.velocity = Vector3.right;
        }
        else
        {
            truck.velocity = Vector3.left;
        }
        yield return new WaitUntil(() => shouldChangeDirection);
        forward = !forward;
    }
}

void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.collider.tag.Equals("Bound"))
    {
        shouldChangeDirection = true;
    }
}

void OnCollisionExit2D(Collision2D collision)
{
    if (collision.collider.tag.Equals("Bound"))
    {
        shouldChangeDirection = false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...