using UnityEngine;
namespace Northbound
{
///
/// Simple test script to verify ghost materials work.
/// Attach to any GameObject with a Renderer to see the ghost effect.
///
public class GhostMaterialTest : MonoBehaviour
{
[Header("Test Settings")]
public Color ghostColor = new Color(0, 1, 0, 0.5f);
public bool applyOnStart = true;
private void Start()
{
if (applyOnStart)
{
ApplyGhostMaterial();
}
}
[ContextMenu("Apply Ghost Material")]
public void ApplyGhostMaterial()
{
Material ghostMat = CreateGhostMaterial(ghostColor);
Renderer[] renderers = GetComponentsInChildren();
foreach (var renderer in renderers)
{
Material[] mats = new Material[renderer.materials.Length];
for (int i = 0; i < mats.Length; i++)
{
mats[i] = ghostMat;
}
renderer.materials = mats;
renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
renderer.receiveShadows = false;
}
Debug.Log($"Applied ghost material to {renderers.Length} renderers");
}
private Material CreateGhostMaterial(Color color)
{
// Try to find appropriate shader for current render pipeline
Shader shader = Shader.Find("Universal Render Pipeline/Lit");
if (shader == null)
shader = Shader.Find("Standard");
if (shader == null)
shader = Shader.Find("Diffuse");
Material mat = new Material(shader);
// Set base color
if (mat.HasProperty("_BaseColor"))
mat.SetColor("_BaseColor", color); // URP
else if (mat.HasProperty("_Color"))
mat.SetColor("_Color", color); // Standard
// Enable transparency
if (mat.HasProperty("_Surface"))
{
// URP Transparency
mat.SetFloat("_Surface", 1); // Transparent
mat.SetFloat("_Blend", 0); // Alpha
mat.SetFloat("_AlphaClip", 0);
mat.SetFloat("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
mat.SetFloat("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
mat.SetFloat("_ZWrite", 0);
mat.renderQueue = 3000;
mat.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
mat.EnableKeyword("_ALPHAPREMULTIPLY_ON");
}
else
{
// Standard RP Transparency
mat.SetFloat("_Mode", 3); // Transparent mode
mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
mat.SetInt("_ZWrite", 0);
mat.DisableKeyword("_ALPHATEST_ON");
mat.EnableKeyword("_ALPHABLEND_ON");
mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
mat.renderQueue = 3000;
}
Debug.Log($"Created ghost material with shader: {shader.name}");
return mat;
}
}
}