스크립트 캐싱(저장)하는 방법

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에서 데이터 편집 가능하고 여러 오브젝트 간 데이터 공유에 효과적이지만 복잡한 데이터 로직에는 적합하지 않음.

추천상황

- 게임 상태나 설정 데이터 공유.