[UNITY],[C#]/TIL : UNITY

[Unity]의존성 주입과 SO의 콜라보

네,가능합니다 2024. 11. 12. 22:51

매일 하나씩 배워간다는건 시작하기는 힘들지만 시작만 한다면 아주 두근거리는 일이다.

 

앞으로 내가 할 행동에 이 배운것들의 1%라도 첨가된다면, 배웠던 좋은것들이 모여서 100%가 되지 않을까..?

마치 진흙탕..

 

의존성 주입이란 ?

필요한 의존성을 외부에서 주입해주는 방식으로

객체가 직접적으로 다른 클래스와 연결되지 않고 필요한 객체가 교체가능하게 된다.

 

의존성 주입의 핵심 개념

1. 결합도 감소 : 위에 말했듯 해당 내용으로 인해 코드가 모듈화되어 결합도가 감소한다. 이로인해 유지보수성이 높아진다.

 

2. 유연성 증가 : 의존성 객체를 쉽게 교체가 가능하여 코드 재사용성이 용이하다.

 

3. 테스트 용이 : 객체의 의존성을 임시(모킹)로 주입할 수 있어 테스트가 쉬워진다.

 

그래서 어떻게 쓰면 되지 ?

나는 유니티를 배우고 있기 때문에, SO를 함께 사용하는 예제들을 보여주겠다.

(내가 나중에 보고 써야함)

 

예제로는 다양한 공격을 하는 Enemy에 SO를 이용하여 각각의 공격 방식을 정의해주고

이를 의존성 주입을 적용하여 적에게 주입해주는 예제를 보겠다.

 

이렇게 적용한다면, 나중에 공격방식을 교체하거나 확장이 매우 용이해진다.

 

예제를 보면서 여기서 새로운 공격을 추가하거나 마음에 들지 않는 부분을 수정할거라는 마음가짐으로 한번 보고

추후 어디에 적용할지 생각해보자

 

공격방식을 만들어주고

using UnityEngine;

// 추상 클래스(SO)
public abstract class AttackStrategy : ScriptableObject
{
    public abstract void Attack(Enemy enemy);
}

// 근접 공격
[CreateAssetMenu(fileName = "MeleeAttack", menuName = "ScriptableObjects/MeleeAttack")]
public class MeleeAttack : AttackStrategy
{
    public override void Attack(Enemy enemy)
    {
        // 근접 공격 로직
    }
}

// 원거리 공격
[CreateAssetMenu(fileName = "RangedAttack", menuName = "ScriptableObjects/RangedAttack")]
public class RangedAttack : AttackStrategy
{
    public override void Attack(Enemy enemy)
    {
        // 원거리 공격 로직
    }
}

 

Enemy에서 사용하면 끝이다.

Enemy는 어떤공격인지도 모른다 그냥 공격을 하는데 SO에 있는 공격을 한다.

using UnityEngine;

public class Enemy : MonoBehaviour
{
    // 공격방식을 SO로 받아옴
    public AttackStrategy attackStrategy;

    private void Update()
    {
        if (공격가능여부)
        {
            PerformAttack();
        }
    }

    public void PerformAttack()
    {
        if (attackStrategy != null)
        {
            attackStrategy.Attack(this);
        }
    }
}

 

이렇게되면 동적으로 마음껏 공격방식을 바꿀 수 있다.

상황에 따라서 바꿀수도 있다.

 

public class GameManager : MonoBehaviour
{
    public Enemy enemy; // Enemy참조
    public AttackStrategy meleeAttack; // 공격전략
    public AttackStrategy rangedAttack; // 공격전략

    private void Start()
    {
        // 초기설정으로 근접공격 해두기
        enemy.attackStrategy = meleeAttack;
    }

    private void Update()
    {
        if (근접공격해라)
        {
            enemy.attackStrategy = meleeAttack; // 전략을 근접 공격으로 변경
        }
        else if (원거리공격해라)
        {
            enemy.attackStrategy = rangedAttack; // 전략을 원거리 공격으로 변경
        }
    }
}

 

 

지금은 간단하게 작성했지만 벌써 너무 좋다

 

유니티의 스크립터블 오브젝트는 미친놈이다 엄청난 성능을 가지고 있는 것 같다.

 

아직도 더 SO에 대해서 공부할것이 많은것같아서 너무 기대된다.

 

하지만 그건 이번주 개인 과제를 끝내고 알아보자...................