84 lines
No EOL
2.8 KiB
C#
84 lines
No EOL
2.8 KiB
C#
using UnityEngine;
|
|
|
|
public class Tiling : MonoBehaviour
|
|
{
|
|
|
|
private const int LEFT = -1;
|
|
private const int RIGHT = 1;
|
|
|
|
public int offsetX = 2; // the offset so that we don't get any weird errors
|
|
|
|
// these are used for checking if we need to instantiate stuff
|
|
public bool hasARightBuddy;
|
|
public bool hasALeftBuddy;
|
|
|
|
public bool reverseScale; // used if the object is not tilable
|
|
|
|
private float spriteWidth; // the width of our element
|
|
private Camera cam;
|
|
private Transform myTransform;
|
|
|
|
void Awake () {
|
|
cam = Camera.main;
|
|
myTransform = transform;
|
|
}
|
|
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
SpriteRenderer sRenderer = GetComponent<SpriteRenderer>();
|
|
spriteWidth = sRenderer.sprite.bounds.size.x;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
// does it still need buddies? If not do nothing
|
|
if (!hasALeftBuddy || !hasARightBuddy) {
|
|
// calculate the cameras extend (half the width) of what the camera can see in world coordinates
|
|
float camHorizontalExtend = cam.orthographicSize * Screen.width/Screen.height;
|
|
|
|
// calculate the x position where the camera can see the edge of the sprite (element)
|
|
var position = myTransform.position;
|
|
float edgeVisiblePositionRight = (position.x + spriteWidth/2) - camHorizontalExtend;
|
|
float edgeVisiblePositionLeft = (position.x - spriteWidth/2) + camHorizontalExtend;
|
|
|
|
// checking if we can see the edge of the element and then calling MakeNewBuddy if we can
|
|
if (cam.transform.position.x >= edgeVisiblePositionRight - offsetX && !hasARightBuddy)
|
|
{
|
|
MakeNewBuddy (RIGHT);
|
|
hasARightBuddy = true;
|
|
}
|
|
else if (cam.transform.position.x <= edgeVisiblePositionLeft + offsetX && !hasALeftBuddy)
|
|
{
|
|
MakeNewBuddy (LEFT);
|
|
hasALeftBuddy = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// a function that creates a buddy on the side required
|
|
void MakeNewBuddy (int rightOrLeft) {
|
|
// calculating the new position for our new buddy
|
|
var position = myTransform.position;
|
|
Vector3 newPosition = new Vector3 (position.x + spriteWidth * rightOrLeft,
|
|
position.y, position.z);
|
|
// instantating our new body and storing him in a variable
|
|
Transform newBuddy = Instantiate (myTransform, newPosition, myTransform.rotation);
|
|
|
|
// if not tilable let's reverse the x size og our object to get rid of ugly seams
|
|
if (reverseScale)
|
|
{
|
|
var localScale = newBuddy.localScale;
|
|
localScale = new Vector3 (localScale.x*-1, localScale.y, localScale.z);
|
|
newBuddy.localScale = localScale;
|
|
}
|
|
newBuddy.parent = myTransform.parent;
|
|
if (rightOrLeft > 0) {
|
|
newBuddy.GetComponent<Tiling>().hasALeftBuddy = true;
|
|
}
|
|
else {
|
|
newBuddy.GetComponent<Tiling>().hasARightBuddy = true;
|
|
}
|
|
}
|
|
} |