当脚本启动时,我用脚本附加到的对象的子项填充 List,然后在 Update 方法中我尝试找出 1 个元素是否已移到相机后面的左侧,然后检查它是否是正在绘制,之后我得到列表的最后一个元素,找出它的位置并传递 1 个已经离开相机的元素,场景中最后一个元素的位置,以便它出现在它后面,之后我删除 1元素并将其添加到列表的末尾。但是一切都不行,或许还有别的方法可以循环后台,请大家帮忙
public class LoopBackGround : MonoBehaviour
{
public Vector2 speed = new Vector2 (10, 10);
public Vector2 direction = new Vector2 (-1, 0);
private List<Transform> backgroundPart; // все дети которые пренадлежат элементe на который присоединил скрипт
public bool isLooping = false;
public bool isCamera = false;
private int steps = 0;
private void Start()
{
if (isLooping) // надо ли элемент зациклить
{
backgroundPart = new List<Transform>(); // инициализирую List
for (int i = 0; i < gameObject.transform.childCount; i++)
{
Transform child = transform.GetChild(i);// получая ребенка элемента
if (child.GetComponent<Renderer>() != null) // узнаю есть ли у него компонент рендера
{
backgroundPart.Add(child);// добавляю в List
}
}
backgroundPart = backgroundPart.OrderBy(t => t.position.x).ToList();
}
}
private void Update()
{
Vector3 move = new Vector3(speed.x * direction.x, speed.y * direction.y, 0); // задаю движение элементу
move *= Time.deltaTime; // Умножаю ее на скорость отрисовки кадра
transform.Translate(move); // Передвигаю элемент
if (isCamera) // Это камера ?
Camera.main.transform.Translate(move); // Если да то двигаю камеру
if (isLooping) // Элемент надо зациклить ?
{
/*Vector3 cam = Camera.main.transform.position;*/ // Узнаю координаты камеры
Transform firstChild = backgroundPart.FirstOrDefault(); // получаю 1 элемент
if (firstChild != null) // узнаю не пустой ли 1 элемент
{
for (int i = 0; i < backgroundPart.Count; i++)
{
if ((firstChild.position.x + 20) < Camera.main.transform.position.x) // проверяю ушел ли объект налево
{
if (firstChild.GetComponent<Renderer>().isVisible == false)
{
print(firstChild.gameObject.name);
Transform lastChild = backgroundPart.LastOrDefault(); // получаю последний объект List
print(lastChild.gameObject.name);
firstChild.transform.Translate(new Vector3(lastChild.position.x, lastChild.position.y, lastChild.position.z)); // получаю место нахождение последнего элемента и передаю его первому
backgroundPart.Add(firstChild); // добавляю в List первый элемент
backgroundPart.Remove(firstChild); // удаляю первый элемент что бы двигать список справо налево
//print(backgroundPart[i].gameObject.name);
//lastElem = new Vector3(gameObjects.LastOrDefault().transform.position.x + 40, 0, 0);
//Transform first = gameObjects.FirstOrDefault(); // передаю элемент который ушел налево
//gameObjects[i].transform.Translate(lastElem); // Переношу элемент направо
//gameObjects.Add(first); // Добавляю первый элемент в конец
//gameObjects.Remove(first); // Удаляю первый элемент
//Transform lastChild = backgroundPart.LastOrDefault();
//Vector3 lastPosition = new Vector3(lastChild.transform.position.x, lastChild.transform.position.y, lastChild.transform.position.z);
//Vector3 lastSize = (lastChild.GetComponent<Renderer>().bounds.max - lastChild.GetComponent<Renderer>().bounds.min);
//firstChild.position = new Vector3(lastPosition.x + lastSize.x, firstChild.position.y, firstChild.position.z);
//backgroundPart.Remove(firstChild);
//backgroundPart.Add(firstChild);
}
}
}
}
}
steps++;
print($"{steps}) Проверка порядка элементов!");
for (int i = 0; i < backgroundPart.Count; i++)
{
print(backgroundPart[i].gameObject.name);
}
// СПИСОК НЕ ОБНОВЛЯЕТСЯ, 1 ЭЛЕМЕНТ ПЕРЕНОСИТСЯ В КОНЕЦ ОСТАЛЬНЫЕ НЕ ПЕРЕНОСЯТСЯ
}
}
![[![][一]](https://isstatic.askoverflow.dev/qDj6F.png)
呼叫03!
如果
isLooping false同样成功,您可以愚蠢地禁用脚本。isCamera? 相机在这里做什么?剧本不是关于她的行为!再一次,同样的成功......我自己决定,我理解这个人的批评,我在单独的脚本中使用相机的运动。最后,我决定自己去挑战。谢谢您的帮助 !
这是代码: