Я пробовал задавать этот вопрос на сайте ответов 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, и, похоже, мне еще многое предстоит узнать. И снова, если у вас есть более элегантное решение того, что я пытаюсь достичь, пожалуйста, дайте мне знать. Правильно знаю, что я знаю, что эта реализация может вызвать утечку памяти в том смысле, что до тех пор, пока голова будет меняться, список точек поворота, которые хранятся, будет продолжать расти и расти, что, очевидно, избежать.
Спасибо за ваш вклад. Я делал это, но если я прямо контролирую положение сфер, движение выглядит неуклюжим и уродливым. Я ищу решение, которое предполагает перемещение сфер, изменяя фактическую скорость твердого тела, поскольку движущаяся анимация более жидкая. Ваше рекомендуемое решение заставляет его смотреть, как сферы телепортируются. – Greg
Вы можете перемещать голову по скорости физики, но обновлять другие сегменты в окне «Обновить»() каждый кадр, это сделает их текучими. – ruisen