using UnityEngine; // 유니티 기본 기능을 쓰기 위해 불러올거에요 -> UnityEngine를 public class ItemHighlight : MonoBehaviour // 클래스를 선언할거에요 -> 아이템 하이라이트(발광 깜빡임) 담당 ItemHighlight를 { // 코드 블록을 시작할거에요 -> ItemHighlight 범위를 [Header("--- 참조 ---")] // 인스펙터에 제목을 표시할거에요 -> 참조 섹션을 [SerializeField] private MeshRenderer weaponRenderer; // 변수를 선언할거에요 -> 하이라이트 줄 렌더러를 weaponRenderer에 [Header("--- 하이라이트 설정 ---")] // 인스펙터에 제목을 표시할거에요 -> 하이라이트 설정 섹션을 [ColorUsage(true, true)] // 속성을 붙일거에요 -> HDR 색상도 고를 수 있게 [SerializeField] private Color highlightColor = Color.yellow; // 변수를 선언할거에요 -> 발광 색상을 노란색으로 [SerializeField] private float blinkSpeed = 2f; // 변수를 선언할거에요 -> 깜빡이는 속도를 2로 [SerializeField] private float minIntensity = 0.5f; // 변수를 선언할거에요 -> 최소 발광 세기를 0.5로 [SerializeField] private float maxIntensity = 3.0f; // 변수를 선언할거에요 -> 최대 발광 세기를 3.0으로 private Material _material; // 변수를 선언할거에요 -> 렌더러의 머티리얼을 담을 _material을 private static readonly int EmissionProperty = Shader.PropertyToID("_EmissionColor"); // 값을 캐싱할거에요 -> _EmissionColor 프로퍼티 ID를 private void Awake() // 함수를 선언할거에요 -> 오브젝트가 켜질 때 1번 실행되는 Awake를 { // 코드 블록을 시작할거에요 -> Awake 범위를 if (weaponRenderer == null) weaponRenderer = GetComponentInChildren(); // 조건이 맞으면 실행할거에요 -> 렌더러가 비어있으면 자식에서 자동으로 찾기 if (weaponRenderer != null) // 조건을 검사할거에요 -> 렌더러를 찾았는지 { // 코드 블록을 시작할거에요 -> 렌더러가 있을 때 처리 _material = weaponRenderer.material; // 머티리얼을 가져올거에요 -> 렌더러의 material을 _material에 _material.EnableKeyword("_EMISSION"); // 키워드를 켤거에요 -> 발광(Emission) 기능을 활성화 } // 코드 블록을 끝낼거에요 -> 렌더러 처리 } // 코드 블록을 끝낼거에요 -> Awake를 // ⭐ [추가] 부모 오브젝트(손)가 바뀌었을 때 실행됩니다. // 설명을 적을거에요 -> 부모 변경 이벤트 훅임을 private void OnTransformParentChanged() // 함수를 선언할거에요 -> 부모가 바뀌면 자동 호출되는 OnTransformParentChanged를 { // 코드 블록을 시작할거에요 -> OnTransformParentChanged 범위를 // 부모가 없다면 = 바닥에 떨어졌다면 // 설명을 적을거에요 -> 다시 주워지지 않은 상태라는 뜻 if (transform.parent == null) // 조건을 검사할거에요 -> 부모가 없는지 { // 코드 블록을 시작할거에요 -> 바닥에 떨어진 경우 처리 this.enabled = true; // 스크립트를 켤거에요 -> Update가 다시 돌게 } // 코드 블록을 끝낼거에요 -> 바닥 처리 } // 코드 블록을 끝낼거에요 -> OnTransformParentChanged를 private void Update() // 함수를 선언할거에요 -> 매 프레임 실행되는 Update를 { // 코드 블록을 시작할거에요 -> Update 범위를 if (_material == null) return; // 조건이 맞으면 종료할거에요 -> 머티리얼이 없으면 처리 불가 // 누군가 주운 상태(부모가 있음)라면 빛을 끄고 퇴근합니다. // 설명을 적을거에요 -> 손에 들린 상태면 하이라이트 중단 if (transform.parent != null) // 조건을 검사할거에요 -> 부모가 있는지(주워졌는지) { // 코드 블록을 시작할거에요 -> 주워진 경우 처리 StopHighlight(); // 함수를 실행할거에요 -> 하이라이트 끄기 return; // 함수를 끝낼거에요 -> 아래 발광 계산은 안 하게 } // 코드 블록을 끝낼거에요 -> 주워진 처리 float lerpValue = Mathf.PingPong(Time.time * blinkSpeed, 1f); // 값을 계산할거에요 -> 0~1로 왕복하는 값(깜빡임용)을 float intensity = Mathf.Lerp(minIntensity, maxIntensity, lerpValue); // 값을 계산할거에요 -> 최소~최대 사이 발광 세기를 _material.SetColor(EmissionProperty, highlightColor * intensity); // 값을 설정할거에요 -> 발광 색상을 (색 * 세기)로 } // 코드 블록을 끝낼거에요 -> Update를 public void StopHighlight() // 함수를 선언할거에요 -> 하이라이트를 끄는 StopHighlight를 { // 코드 블록을 시작할거에요 -> StopHighlight 범위를 if (_material != null) // 조건을 검사할거에요 -> 머티리얼이 있는지 { // 코드 블록을 시작할거에요 -> 머티리얼이 있을 때 처리 _material.SetColor(EmissionProperty, Color.black); // 값을 설정할거에요 -> 발광을 검정(=0)으로 만들어 끄기 this.enabled = false; // 컴포넌트를 끌거에요 -> Update를 멈추기 } // 코드 블록을 끝낼거에요 -> 머티리얼 처리 } // 코드 블록을 끝낼거에요 -> StopHighlight를 } // 코드 블록을 끝낼거에요 -> ItemHighlight를