Search Unity

  1. We would like to hear your feedback about Unity and our products. Click here for more information.
    Dismiss Notice

Need Help With Looping Background

Discussion in '2D' started by XloneProX, May 19, 2019.

  1. XloneProX

    XloneProX

    Joined:
    May 19, 2019
    Posts:
    1
    I am working on a space game on which you can land on planets. I have the script done for the actual looping but I'm trying to figure out how I could set it to a limit of distance. When the player reaches the edge of the map I need it to continue from the opposite side like you were on a planet flying around it fully. If you have and experience, tips or ideas with this type of thing please let me know.


    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);
    }
    }
    }
     
  2. GameDevCouple_I

    GameDevCouple_I

    Joined:
    Oct 5, 2013
    Posts:
    1,539
    If you put that code inside code tags it will make it easier to read and you will be far more likely to get help quickly as opposed to with the current unformatted code