-
유니티 쉽게 배우는 디자인 패턴 - 의존성 주입 패턴 / Unity Design Pattern - Dependency Injection Pattern유니티 2024. 2. 7. 11:28
의존성 주입 패턴이란?
해당 클래스에 필요한 인스턴스를, 외부로부터 생성자나 함수를 통해 주입받아 사용하는 패턴입니다.
동적으로 생성되는 오브젝트가 매니저급 클래스를 참조할 때 효율적입니다.
싱글톤은 어디서든 접근할 수 있는데 호출하는게 많을수록 의존성이 높아집니다.
그러면 사소한 것 하나를 바꾸려고 해도 얽힌게 많아 바꾸기 힘들 수 있습니다.
반면 의존성 주입은 필요한 상황에서만 인스턴스를 가져다 쓰기 때문에 의존성이 적은 장점이 있습니다.
동적생성 시 의존성 주입
GameManager가 하이어라키에 존재하고 Player 프리팹을 만들어 넣어둔 상황입니다.
Player 프리팹에는 Player 스크립트를 넣어두었습니다.
GameManager.cs
using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] GameObject playerPrefab; void Start() { Instantiate(playerPrefab).GetComponent<Player>().Inject(this); } public void Print() { print("GameManger Call"); } }
Start에서 playerPrefab을 동적으로 생성후, Player스크립트까지 접근해
Inject함수에 GameManager 자기자신을 넣어서 의존성을 주입해 주었습니다.
Player.cs
using UnityEngine; public class Player : MonoBehaviour { GameManager gameManager; public void Inject(GameManager gameManager) { this.gameManager = gameManager; } void Start() { gameManager.Print(); } }
Player는 생성이 되자마자 GameManager의 인스턴스를 가지고 있게 되었고,
필요할 때 GameManager의 공개된 함수를 사용할 수 있게 되었습니다.
넘겨줄 매개변수가 여러개라면?
AudioManager와 VibrationManager를 만들고 GameManager가 참조했습니다.
GameManager.cs
using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] AudioManager audioManager; [SerializeField] VibrationManager vibrationManager; [SerializeField] GameObject playerPrefab; void Start() { Instantiate(playerPrefab).GetComponent<Player>().Inject(this, audioManager, vibrationManager); } }
Player.cs
using UnityEngine; public class Player : MonoBehaviour { GameManager gameManager; AudioManager audioManager; VibrationManager vibrationManager; public void Inject(GameManager gameManager, AudioManager audioManager, VibrationManager vibrationManager) { this.gameManager = gameManager; this.audioManager = audioManager; this.vibrationManager = vibrationManager; } }
매개변수 개수를 늘려서 사용하시면 됩니다.
반드시 필요한 것만 의존성 주입을 해야 어디서 사용되는구나 파악하는게 명확해질 것입니다.
그래서 모든 매니저를 하나의 클래스로 감싸서 넘기는 것은 비추천합니다.
모두 사용하지 않기 때문입니다.
'유니티' 카테고리의 다른 글