Заставьте объекты оставаться прикрепленными к поверхности сферы, пока сфера сокращается - PullRequest
0 голосов
/ 08 февраля 2019

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

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

Вот как выглядит код сжатия моей планеты:

void Update()
{
    transform.localScale *= 1f - shrinkSpeed * Time.deltaTime;
}

Вот как выглядит код, который я пытался переместить внутрь препятствия с той же скоростью, что и процесс сжатия сферы (этот код также находится внутри функции обновления):

foreach (GameObject obstacle in GameObject.FindGameObjectsWithTag("Obstacle"))
{
    Vector3 shrinkDirection = obstacle.transform.position - myTransform.position;
    obstacle.transform.Translate(-shrinkDirection * (1f - shrinkSpeed * Time.deltaTime));
}

Просто препятствияулететь, и я также попробовал несколько вещей, таких как использование localPosition препятствия, но ничего не работает.Как я могу заставить препятствия прикрепляться к поверхности сферы, даже уменьшая ее?Примечание: препятствия не являются детьми сферы.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы должны хранить все ссылки на препятствия, когда вы порождаете их что-то вроде

private List<GameObject> obstacles = new List<GameObject>();

// ...

var obst = Instantiate(obstaclePrefab);
// do your translations and rotation etc

obstacles.Add(obst);

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

private Dictionary<GameObject, Vector3> obstacleOffsets = new Dictionary<GameObject, Vector3>();

// ...

obstacleOffsets.Add(obst, obst.transform.position - sphereTranform.position);

чем позже вы можете использовать это смещение для позиционирования препятствий

foreach (GameObject obstacle in obstacles)
{
    var originalOffset = obstacleOffsets[obstacle];
    obstacle.transform.position = transform.position + MergeVectors(originalOffset, transform.localScale);
}

Конечно, вы также можете использовать только Dictionary like

foreach (var kvp in obstacleOffsets)
{
    var obstacle = kvp.Key;
    var originalOffset = kvp.Value;
    obstacle.transform.position = transform.position + MergeVectors(originalOffset, transform.localScale);
}

Result (интересное сжатие GIF ^^)

enter image description here


Примечание

Не забывайте, что всякий раз, когда вы должны уничтожить препятствие, высначала удалите его из списка / словаря!

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