1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class backgroundLoop : MonoBehaviour{
public GameObject[] levels;
private Camera mainCamera;
private Vector2 screenBounds;
public float choke;
public float scrollSpeed;
void Start(){
mainCamera = gameObject.GetComponent<Camera>();
screenBounds = mainCamera.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, mainCamera.transform.position.z));
foreach(GameObject obj in levels){
loadChildObjects(obj);
}
}
void loadChildObjects(GameObject obj){
float objectWidth = obj.GetComponent<SpriteRenderer>().bounds.size.x - choke;
int childsNeeded = (int)Mathf.Ceil(screenBounds.x * 2 / objectWidth);
GameObject clone = Instantiate(obj) as GameObject;
for(int i = 0; i <= childsNeeded; i++){
GameObject c = Instantiate(clone) as GameObject;
c.transform.SetParent(obj.transform);
c.transform.position = new Vector3(objectWidth * i, obj.transform.position.y, obj.transform.position.z);
c.name = obj.name + i;
}
Destroy(clone);
Destroy(obj.GetComponent<SpriteRenderer>());
}
void repositionChildObjects(GameObject obj){
Transform[] children = obj.GetComponentsInChildren<Transform>();
if(children.Length > 1){
GameObject firstChild = children[1].gameObject;
GameObject lastChild = children[children.Length - 1].gameObject;
float halfObjectWidth = lastChild.GetComponent<SpriteRenderer>().bounds.extents.x - choke;
if(transform.position.x + screenBounds.x > lastChild.transform.position.x + halfObjectWidth){
firstChild.transform.SetAsLastSibling();
firstChild.transform.position = new Vector3(lastChild.transform.position.x + halfObjectWidth * 2, lastChild.transform.position.y, lastChild.transform.position.z);
}else if(transform.position.x - screenBounds.x < firstChild.transform.position.x - halfObjectWidth){
lastChild.transform.SetAsFirstSibling();
lastChild.transform.position = new Vector3(firstChild.transform.position.x - halfObjectWidth * 2, firstChild.transform.position.y, firstChild.transform.position.z);
}
}
}
void Update() {
Vector3 velocity = Vector3.zero;
Vector3 desiredPosition = transform.position + new Vector3(scrollSpeed, 0, 0);
Vector3 smoothPosition = Vector3.SmoothDamp(transform.position, desiredPosition, ref velocity, 0.3f);
transform.position = smoothPosition;
}
void LateUpdate(){
foreach(GameObject obj in levels){
repositionChildObjects(obj);
}
}
}
|