65 lines
5.4 KiB
C#
65 lines
5.4 KiB
C#
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<MeshRenderer>(); // 조건이 맞으면 실행할거에요 -> 렌더러가 비어있으면 자식에서 자동으로 찾기
|
|
|
|
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를 |