Skip to content

Instantly share code, notes, and snippets.

@Shaun-Meechan
Last active January 7, 2024 17:43
Show Gist options
  • Save Shaun-Meechan/bd6bfa5017fb5cbf64ad96ffff217836 to your computer and use it in GitHub Desktop.
Save Shaun-Meechan/bd6bfa5017fb5cbf64ad96ffff217836 to your computer and use it in GitHub Desktop.
Layer manager script from Shadow Play. This is used in a Unity scene to stop the player or other interactable objects from colliding with objects that aren't on their layer
using System;
using UnityEngine;
public class ActiveLayerManager : MonoBehaviour
{
[SerializeField]
int activeLayerID = 0;
[SerializeField]
GameObject player;
SpriteRenderer playerSpriteRenderer;
[SerializeField]
//TODO: This really should just be compiste colliders 2D
GameObject[] colliders;
// Start is called before the first frame update
void Start()
{
playerSpriteRenderer = player.GetComponent<SpriteRenderer>();
activeLayerID = playerSpriteRenderer.sortingOrder;
//for (int i = 0; i < colliders.Length; i++)
//{
// colliders[i].SetActive(false);
//}
//colliders[activeLayerID].SetActive(true);
}
public void IncrementActiveLayer()
{
throw new NotImplementedException();
colliders[activeLayerID].SetActive(false);
activeLayerID++;
colliders[activeLayerID].SetActive(true);
colliders[activeLayerID].GetComponent<CompositeCollider2D>().GenerateGeometry();
playerSpriteRenderer.sortingOrder = activeLayerID;
}
public void DecrementActiveLayer()
{
throw new NotImplementedException();
colliders[activeLayerID].SetActive(false);
activeLayerID--;
colliders[activeLayerID].SetActive(true);
colliders[activeLayerID].GetComponent<CompositeCollider2D>().GenerateGeometry();
playerSpriteRenderer.sortingOrder =activeLayerID;
}
public void IgnoreCollisionsBetweenInteractableObjectAndOtherCollisionLayers(InteractableObject gameObject)
{
Collider2D gameObjectCollider = gameObject.GetComponent<Collider2D>();
for (int i = 0; i < colliders.Length; i++)
{
if(i != gameObject.getLayer())
{
Physics2D.IgnoreCollision(gameObjectCollider, colliders[i].GetComponent<CompositeCollider2D>());
}
if(i == gameObject.getLayer())
{
Physics2D.IgnoreCollision(gameObjectCollider, colliders[i].GetComponent<CompositeCollider2D>(), false);
}
}
}
public void IgnoreCollisionsBetweenCharacterAndOtherCollisionLayers(Character gameObject)
{
Collider2D gameObjectCollider = gameObject.GetComponent<Collider2D>();
SpriteRenderer spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
for (int i = 0; i < colliders.Length; i++)
{
if(i != spriteRenderer.sortingOrder)
{
Physics2D.IgnoreCollision(gameObjectCollider, colliders[i].GetComponent<CompositeCollider2D>());
}
if(i == spriteRenderer.sortingOrder)
{
Physics2D.IgnoreCollision(gameObjectCollider, colliders[i].GetComponent<CompositeCollider2D>(), false);
}
}
if(spriteRenderer.sortingOrder != 0)
{
Physics2D.IgnoreLayerCollision(0, 8);
}
else
{
Physics2D.IgnoreLayerCollision(0, 8, false);
}
}
/// <summary>
///Use this function if you want to block collisions between a character and colliders but using a set layer that is different than it's sorting layer
/// </summary>
/// <param name="gameObject"></param>
/// <param name="customLayer"></param>
public void IgnoreCollisionsBetweenCharacterAndOtherCollisionLayers(Character gameObject, int customLayer)
{
Collider2D gameObjectCollider = gameObject.GetComponent<Collider2D>();
for (int i = 0; i < colliders.Length; i++)
{
if(i != customLayer)
{
Physics2D.IgnoreCollision(gameObjectCollider, colliders[i].GetComponent<CompositeCollider2D>());
}
if(i == customLayer)
{
Physics2D.IgnoreCollision(gameObjectCollider, colliders[i].GetComponent<CompositeCollider2D>(), false);
}
}
}
public bool IsColliderAboveObject(int layer, CompositeCollider2D colliderToCheck)
{
bool foundCollider = false;
int colliderIndex = int.MaxValue;
//Quick sanity check to ensure we actaully have stored that collider
for (int i = 0; i < colliders.Length; i++)
{
if (colliders[i].GetComponent<CompositeCollider2D>() == colliderToCheck)
{
foundCollider = true;
colliderIndex = i;
break;
}
}
if(!foundCollider)
{
Debug.LogError("ERROR: Collider was not found in layer manager!");
}
if(layer == colliderIndex)
{
return false;
}
if(layer < colliderIndex)
{
return true;
}
//If we hit this the collider must be below the object (unlikely to happen)
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment