77 lines
2.0 KiB
C#
77 lines
2.0 KiB
C#
using UnityEngine;
|
|
|
|
public class HighlightOnApproach : MonoBehaviour
|
|
{
|
|
public Transform player;
|
|
public Renderer targetRenderer;
|
|
public Renderer[] targetRenderers;
|
|
public Material highlightMaterial;
|
|
public float radius = 2.6f;
|
|
|
|
private Material originalMaterial;
|
|
private Material[] originalMaterials;
|
|
private bool highlighted;
|
|
|
|
private void Start()
|
|
{
|
|
if (targetRenderers == null || targetRenderers.Length == 0)
|
|
{
|
|
targetRenderers = targetRenderer != null ? new[] { targetRenderer } : GetComponentsInChildren<Renderer>();
|
|
}
|
|
|
|
originalMaterials = new Material[targetRenderers.Length];
|
|
|
|
for (int i = 0; i < targetRenderers.Length; i++)
|
|
{
|
|
originalMaterials[i] = targetRenderers[i].sharedMaterial;
|
|
}
|
|
|
|
if (targetRenderers.Length > 0)
|
|
{
|
|
originalMaterial = originalMaterials[0];
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (player == null)
|
|
{
|
|
GameObject playerObject = GameObject.FindGameObjectWithTag("Player");
|
|
player = playerObject != null ? playerObject.transform : null;
|
|
}
|
|
|
|
if (player == null || highlightMaterial == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
bool shouldHighlight = Vector3.Distance(transform.position, player.position) <= radius;
|
|
|
|
if (shouldHighlight != highlighted)
|
|
{
|
|
// The scene builder assigns all statue renderers, so the whole object changes material together.
|
|
SetHighlighted(shouldHighlight);
|
|
}
|
|
}
|
|
|
|
private void SetHighlighted(bool value)
|
|
{
|
|
highlighted = value;
|
|
|
|
for (int i = 0; i < targetRenderers.Length; i++)
|
|
{
|
|
if (targetRenderers[i] == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
targetRenderers[i].sharedMaterial = value ? highlightMaterial : originalMaterials[i];
|
|
}
|
|
}
|
|
|
|
public Material GetOriginalMaterial()
|
|
{
|
|
return originalMaterial;
|
|
}
|
|
}
|