Skip to content

Instantly share code, notes, and snippets.

@Lioncat2002
Last active December 12, 2023 15:56
Show Gist options
  • Save Lioncat2002/d8e0966c59e4636bf35ec3523aac246a to your computer and use it in GitHub Desktop.
Save Lioncat2002/d8e0966c59e4636bf35ec3523aac246a to your computer and use it in GitHub Desktop.
SpriteStacking in Unity
using UnityEngine;
public class SpriteStacking : MonoBehaviour
{
public Sprite[] spriteFrames;
public float layerSpacing = 0.01f;
public float offset = 0.01f; // Add an offset between sprite layers
public float parallaxSpeed = 5f;
void Start()
{
// Check if sprite layers need to be created
if (transform.childCount == 0)
{
CreateSpriteLayers();
}
}
private void Update()
{
// Move sprite layers continuously
MoveSpriteLayers();
}
void CreateSpriteLayers()
{
if (spriteFrames.Length == 0)
{
Debug.LogError("No sprite frames assigned!");
return;
}
float totalDepth = spriteFrames.Length * (layerSpacing + offset);
for (int i = 0; i < spriteFrames.Length; i++)
{
GameObject spriteLayer = new GameObject("SpriteLayer_" + i);
spriteLayer.transform.parent = transform;
SpriteRenderer spriteRenderer = spriteLayer.AddComponent<SpriteRenderer>();
spriteRenderer.sprite = spriteFrames[i];
spriteRenderer.sortingOrder= -i;
// Calculate depth position with offset
float depthPosition = i * (layerSpacing + offset);
spriteLayer.transform.position = new Vector3(transform.position.x, -depthPosition, transform.position.z);
}
}
void MoveSpriteLayers()
{
foreach (Transform layerTransform in transform)
{
// Move the layer continuously in the x-axis
layerTransform.Rotate(new Vector3(0,0,-parallaxSpeed * Time.deltaTime));
// Check if the layer is beyond the screen to the left, then reset its position
if (layerTransform.position.x < -10f) // Adjust this value based on your scene size
{
layerTransform.position += new Vector3((layerSpacing + offset) * spriteFrames.Length, 0f, 0f);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment