Есть префаб
tri - треугольники по бокам куба, на них висит полигон коллайдер.
cube - квадрат с бокс коллайдером, дополнительно на нем висит скрипт вращения.
Синтаксис:
Используется csharp
transform.Rotate(Vector3.forward * -50 * Time.deltaTime, Space.World);
body - на нем висит бокс коллайдер.
Есть пустой объект с со скриптом пула этого префаба, активирует/деактивирует префабы за границами камеры и задает им скорость.
Этот скрипт проверяет нужно ли активировать префаб
Синтаксис:
Используется csharp
void func()
{
float t = 0;
yes = true;
float nullPoint = width/2;
for(int i =0; i<pooledObjects.Count;i++)
{
if (pooledObjects[i].activeInHierarchy)
{
float position = pooledObjects[i].transform.position.x;
float widthObject = pooledObjects[i].transform.GetComponent<BoxCollider2D>().size.x;
float startX = position - widthObject * 0.5f;
float endX = position + widthObject * 0.5f;
if (endX > width * 0.5f)
{
yes = false;
}
if (endX < -width * 0.5f)
{
pooledObjects[i].SetActive(false);
}
if (endX < width * 0.5f)
{
if (t < endX)
{
t = endX;
}
nullPoint = t;
}
pooledObjects[i].transform.Translate(Vector3.right * -3 * Time.fixedDeltaTime);
}
}
if(yes)
addObj(nullPoint);
}
{
float t = 0;
yes = true;
float nullPoint = width/2;
for(int i =0; i<pooledObjects.Count;i++)
{
if (pooledObjects[i].activeInHierarchy)
{
float position = pooledObjects[i].transform.position.x;
float widthObject = pooledObjects[i].transform.GetComponent<BoxCollider2D>().size.x;
float startX = position - widthObject * 0.5f;
float endX = position + widthObject * 0.5f;
if (endX > width * 0.5f)
{
yes = false;
}
if (endX < -width * 0.5f)
{
pooledObjects[i].SetActive(false);
}
if (endX < width * 0.5f)
{
if (t < endX)
{
t = endX;
}
nullPoint = t;
}
pooledObjects[i].transform.Translate(Vector3.right * -3 * Time.fixedDeltaTime);
}
}
if(yes)
addObj(nullPoint);
}
Если нужно, то вызываем
Синтаксис:
Используется csharp
void addObj(float zet)
{
for (int i = 0; i < pooledObjects.Count; i++)
{
if (!pooledObjects[i].activeInHierarchy)
{
float widthX = pooledObjects[i].GetComponent<BoxCollider2D>().size.x;
float EndX = widthX*0.5f;
zet = zet + EndX;
pooledObjects[i].transform.position = new Vector3(zet, 0, 0);
pooledObjects[i].SetActive(true);
break;
}
}
}
{
for (int i = 0; i < pooledObjects.Count; i++)
{
if (!pooledObjects[i].activeInHierarchy)
{
float widthX = pooledObjects[i].GetComponent<BoxCollider2D>().size.x;
float EndX = widthX*0.5f;
zet = zet + EndX;
pooledObjects[i].transform.position = new Vector3(zet, 0, 0);
pooledObjects[i].SetActive(true);
break;
}
}
}
Проблем в том что:
1) Движение по "x" размытое и немного резкое
2) Когда игрок сталкивается с "tri" то тайм скейл устанавливается в ноль и "cube" зaстывшие во время поворота очень низкого качества.
P.S. Столкновение вычисляется через дистанцию. Все функции вызываются в fixedupdate.