Дрожание движения в игре 3D Snake с использованием списков в c# с unity3D - PullRequest
0 голосов
/ 02 мая 2020

Я испытываю дрожание в своем 3D-клоне змеи.

Это код:

//movement
private Rigidbody rb;
public float force;
public float turnspeed;

//spawning
public int spawndelay;
public GameObject segment;
private List<Vector3> lastpos = new List<Vector3>();
private List<Quaternion> lastrotation = new List<Quaternion>();
private List<GameObject> segments = new List<GameObject>();




private int i = 1;

private void Start()
{
    rb = GetComponent<Rigidbody>();
    StartCoroutine(spawnseg());
}

private void Update()
{
    lastpos.Insert(0, transform.position);
    lastrotation.Insert(0, transform.rotation);

    Move();

    UpdateSegments();

}

//removed move function(uses rb.addforce and rb.addrelativetorque

private void FixedUpdate()
{
    rb.velocity = (force * transform.forward * Time.deltaTime);
}

public void addnewSegment()
{
    GameObject newsegment = Instantiate(segment, lastpos[spawndelay * i], lastrotation[spawndelay * i]);
    segments.Add(newsegment);
    newsegment.GetComponent<SegmentScript>().spawnint = spawndelay * i;
    i++;

}

void UpdateSegments()
{

    foreach(GameObject intsegment in segments)
    {
        intsegment.transform.position = lastpos[intsegment.GetComponent<SegmentScript>().spawnint];
        intsegment.transform.rotation = lastrotation[intsegment.GetComponent<SegmentScript>().spawnint];
    }
}

private IEnumerator spawnseg()
{
    yield return new WaitForSeconds(3f);
    addnewSegment();
    StartCoroutine(spawnseg());
}

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

Спасибо

1 Ответ

0 голосов
/ 03 мая 2020

Я предполагаю, что вы записываете свою текущую позицию, добавляете силу в Move(); и затем устанавливаете позицию в UpdateSegemnts(){} обратно в сохраненную позицию. Это требует времени и может объяснить дрожание.

Честно говоря, довольно сложно дать вам четкий ответ с вещами, которые вы предоставили до сих пор.

Но для начала, пожалуйста, не вызывайте сопрограмму из сопрограммы. Используйте InvokeRepeating.

Я думаю, что вы используете 2 разных пути для создания такой игры одновременно. Путь физики и «поддельный путь». То есть вы можете использовать шарнирные соединения для go физическим способом и не сохранять какие-либо позиции и вращения вообще, или вы можете имитировать его и использовать анимацию для вращения и движения и записывать позиции.

Я ценю усилия по сжатию сценария для вашего вопроса, но это только усложняет ситуацию. Пожалуйста, используйте комментарии, особенно при доступе к другому сценарию, например <SegmentScript>, объясните, почему вы делаете то, что делаете, и включите функцию Move.

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