2024. 11. 15. 23:46ㆍ카테고리 없음
스크립트 캐싱하는 방법
1. Inspector에서 Drag & Drop
- Public 또는 [SerializeField] 필드를 선언한 후, Inspector 창에서 다른 오브젝트를 직접 드래그 앤 드롭하여 연결한다.
코드
public GameObject target;
[SerializeField] private GameObject target;
특징
- 간단하고 직관적이지만 연결이 끊어질 수도 있다.
추천상황
- 소규모 프로젝트 또는 한 번 설정하면 잘 변하지 않는 경우.
2. GetComponent<T>()
- 코드에서 동적으로 컴포넌트를 가져오는 방법이다.
코드
void Start()
{
Rigidbody rb = GetComponent<Rigidbody>();
}
특징
- 코드만으로 연결 가능하고 동적 연결이 필요한 경우 유용하지만 성능 저하가 발생할 수 있음(매번 검색 필요)그리고 잘못된 타입을 찾으면 null 반환되서 널 오류가 뜰 수 있다.( 그래서 TryGetComponent를 사용하는걸 추천한다. )
추천상황
- 동적으로 생성된 오브젝트에서 특정 컴포넌트를 가져와야 할 때
3. Find()
- Hierarchy에서 오브젝트 이름으로 찾아 연결.
코드
void Start()
{
GameObject player = GameObject.Find("Player");
}
특징
- 간단한 구조의 프로젝트에서 빠르게 특정 오브젝트를 찾을 수 있지만 이름을 하드코딩하므로 유지보수가 어렵고 성능 저하가 심각하다.(매번 전체 검색)
추천상황
- 프로토타입 개발 또는 테스트 시 임시로 사용.
4. FindObjectOfType<T>()
- 특정 타입의 컴포넌트를 가진 오브젝트를 찾아 연결.
코드
void Start()
{
PlayerController player = FindObjectOfType<PlayerController>();
}
특징
- Hierarchy에 하나만 존재하는 오브젝트를 찾기 쉽지만 전체 탐색때문에 성능 저하가 일어나고 중복 타입이 존재하면 다른게 들어갈 수도 있다.
추천상황
- 싱글턴 오브젝트나 초기화 코드에만 사용.
5. 싱글턴 패턴 (Singleton Pattern)
- 전역적으로 접근 가능한 클래스 패턴.
코드
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
void Awake()
{
Instance = this;
}
}
특징
- 전역적으로 접근 가능해서 가져오기 편하지만 싱글턴 사용이 과도해지면 의존성이 높아져서 주의해야한다.
추천상황
- 게임 상태 관리, 오디오 관리처럼 하나만 있어야 하는 시스템에 사용.
6. Event와 Delegate
- 특정 이벤트 발생 시 여러 스크립트가 호출되도록 연결.
코드
public delegate void OnPlayerDie();
public static event OnPlayerDie onPlayerDie;
void Die()
{
onPlayerDie?.Invoke();
}
특징
- 이벤트 기반 시스템이여서 효율적이고 깔끔한 코드이지만 디버깅이 어렵고 관리가 복잡해질 수 있어서 사용에 주의해야한다.
추천상황
- UI 갱신, 상태 변경 알림 등 이벤트 중심 로직에 적합.
7. ScriptableObject로 데이터 공유
- ScriptableObject를 통해 데이터를 공유하고 스크립트를 연결.
코드
[CreateAssetMenu]
public class SharedData : ScriptableObject
{
public int playerScore;
}
특징
- Inspector에서 데이터 편집 가능하고 여러 오브젝트 간 데이터 공유에 효과적이지만 복잡한 데이터 로직에는 적합하지 않음.
추천상황
- 게임 상태나 설정 데이터 공유.