1

I have a simple script that detects the nearest interactable and highlights it by applying a shader with an outline. For some reason when the shader is applied it changes layer order and goes under the items above it. In both situations the sorting layer is set to 0 (default). How can I troubleshoot this situation further?

Example

Sprite over

Sprite over

Sprite under

Sprite under

Code

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheckInteractable : MonoBehaviour
{
    [SerializeField] private float range;
    [SerializeField] private Material outlineMat;
    private Material originalMat = null;
    private GameObject closestObject = null;
    void Update()
    {
        Collider2D[] colliderArray = new Collider2D[5];
        colliderArray = Physics2D.OverlapCircleAll(transform.position, range, LayerMask.GetMask("Interactable"));
        
        if(colliderArray.Length > 0)
        {
            if (colliderArray.Length == 1)
            {
                if(closestObject != colliderArray[0].gameObject)
                {                    
                    makeClosest(colliderArray[0].gameObject);
                }
                    
            }                
            else
            {
                foreach (Collider2D collider2D in colliderArray)
                {
                    float dist = Vector2.Distance(transform.position, collider2D.transform.position);
                    float closestDist;

                    if (closestObject != null)
                        closestDist = Vector2.Distance(transform.position, closestObject.transform.position);
                    else
                        closestDist = Mathf.Infinity;

                    if (dist < closestDist)
                        makeClosest(collider2D.gameObject);

                }
            }

            print("closest: " + closestObject.name + "\tDist: " + Vector2.Distance(transform.position, closestObject.transform.position));
        }      
        else if(closestObject != null) 
        {
            closestObject.GetComponent<SpriteRenderer>().material = originalMat;
            originalMat = null;
            closestObject = null;
        }
        
    }

    void makeClosest(GameObject obj)
    {
        if (closestObject != null)
            closestObject.GetComponent<SpriteRenderer>().material = originalMat;

        originalMat = obj.GetComponent<SpriteRenderer>().material;        
        obj.GetComponent<SpriteRenderer>().material = outlineMat;
        closestObject = obj;
    }
}
Jacksonkr
  • 31,583
  • 39
  • 180
  • 284
  • Hey Ronan, I see you're new so I clarified your question a bit and pulled the images directly into your question. Also, take a look at [this answer](https://stackoverflow.com/a/33368312/332578). Good luck! – Jacksonkr Dec 24 '21 at 00:52

0 Answers0