-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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