2016-10-09 59 views
0

Я пробовал задавать этот вопрос на сайте ответов Unity, но поскольку я еще не получил ответа, я решил, что задаю этот вопрос и здесь. Я пытаюсь сделать 3D-версию игры «Змея», но у меня возникают серьезные проблемы, пытаясь сделать первый сегмент змей следующим за головой змеи. В GameObjects я использую сферы с жесткими компонентами, причем игрок имеет контроль только над «головой» змеи. Затем, по мере того как змея растет, добавляется больше сфер, которые должны следовать по пути, который делает основная сфера.Как заставить объект следовать по пути другого объекта в Unity3D?

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

Я также правильно прокомментировал код, чтобы вы могли понять, что я делаю при каждом предложении. Основная идея, которая сейчас частично работает, заключается в том, чтобы отправить информацию о сегментах змеи о том, где именно голова сделала поворот, так что, когда сегменты достигнут определенной точки поворота, они могут сделать поворот в направлении, повернутом головой. Проблема в том, что иногда сегмент проходит мимо точки, где он должен совершать поворот, и я не понимаю, связано ли это с точной проблемой (я делаю сравнения поплавка, чтобы определить, достиг ли сегмент определенной позиции где он поворачивается), или если это что-то еще.

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

public class ControladorSegmento : MonoBehaviour { 

    //This is a generic list of Objects that store both turning position and turning direction that the head has made 
    public List<PosicionCambioDireccion> listaPosicionesCambioDireccion; 

    //This would be the head in the case of only one segment that is following 
    public GameObject lider; 

    //Speed 
    public float rapidez; 

    //Direction 
    public Vector3 direccion; 

    //This is an index that is used to iterate over the list of turning points 
    private int indiceCambioDireccion; 

    // Use this for initialization 
    void Start() { 

     indiceCambioDireccion = 0; 

     listaPosicionesCambioDireccion = new List<PosicionCambioDireccion>(); 

     //First find the Head of the snake so that we can access its position in order to determine segment spawning position 
     lider = GameObject.Find("Cabeza"); 

     //Set the position of the new segment 2 units right behind the head 
     transform.position = lider.GetComponent<Transform>().position - lider.GetComponent<ControladorCabeza>().direccion * 2f; 

     //Get the current direction of the head so that the segment inmediately moves in its direction 
     direccion = lider.GetComponent<ControladorCabeza>().direccion; 
    } 

    void LateUpdate() { 

     //Check if there has been a change in direction that the segment has to follow 
     if ((listaPosicionesCambioDireccion.Count > 0) && (listaPosicionesCambioDireccion.Count > indiceCambioDireccion)) { 

      //Compare how close we are to the turning position. If we are sufficiently close, change segment direction 
      if (Mathf.Abs(transform.position.x - listaPosicionesCambioDireccion[indiceCambioDireccion].posicion.x) < 0.0999999 && 
       Mathf.Abs(transform.position.z - listaPosicionesCambioDireccion[indiceCambioDireccion].posicion.z) < 0.0999999) { 

       //Change segment direction at the current position 
       direccion = listaPosicionesCambioDireccion[indiceCambioDireccion].direccion; 

       //Increment turning positions list index so that we get the next turning point in the list (if there is any) 
       indiceCambioDireccion++; 
      } 
     } 
    } 

    void FixedUpdate() { 


     //Change the velocity 
     GetComponent<Rigidbody>().velocity = direccion * rapidez; 

    } 
} 

Я по-прежнему очень активно работаю с Unity, и, похоже, мне еще многое предстоит узнать. И снова, если у вас есть более элегантное решение того, что я пытаюсь достичь, пожалуйста, дайте мне знать. Правильно знаю, что я знаю, что эта реализация может вызвать утечку памяти в том смысле, что до тех пор, пока голова будет меняться, список точек поворота, которые хранятся, будет продолжать расти и расти, что, очевидно, избежать.

ответ

0

Вы можете записать положение каждого сегмента в последнем кадре в списке (включая голову), на следующем кадре, создать вектор из текущей позиции сегмента головы в последнюю позицию, записанную последним кадром. Затем поместите расстояние от суммы головы & радиуса первого сегмента от текущего положения головы и разместите там свой первый сегмент. Повторите эти шаги для всех остальных сегментов, которые состоят из вашей змеи. Надеюсь, это может вам помочь.

+0

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

+0

Вы можете перемещать голову по скорости физики, но обновлять другие сегменты в окне «Обновить»() каждый кадр, это сделает их текучими. – ruisen