TIL - 8

Chu_uhC·2023년 9월 25일
0

TIL

목록 보기
8/16
post-thumbnail

📄 23.09.25 ✍ 전략 패턴 feat. Interface

✨ 전략 패턴(Strategy Pattern) : 특정 작업들을 인터페이스를 이용하여 캡슐화하여 로 동적으로 교체하는 패턴

📌 언제 사용할 수 있는가?

- 함수를 프로그램 시작후 동적으로 교체하고 싶을 때
class Unit
{
    public void AttackUnit()
        Console.WriteLine("MidAttack");
        
    // 프로그램이 실행되고 난 뒤면 AttackUnit()의 코드를 수정할 수 없다.
    // 그러므로, 추가로 다른 함수를 작성하던지 해야지 원하는 동작을 추가 할 수 있다.
}

🔨 전략 패턴으로 해결 방법

interface IAttack // 특정 작업을 담당할 인터페이스
{
    void AttackUnit() { }
}

class HighAttack : IAttack // 작업을 캡슐화한 클래스
{ 
    public void AttackUnit() 
        Console.WriteLine("HighAttack");
}

class MidAttack : IAttack // 작업을 캡슐화한 클래스2
{
    public void AttackUnit()
        Console.WriteLine("MidAttack");
}

class Unit // 상황에 따라 함수를 동적으로 할당할 클래스
{
    public IAttack Attack; // ✨ 인터페이스도 자료형으로써 사용할 수있다.
    public override AttackType(); // 기존에 사용한 방식
}

------------------------------------------------------
- 사용 방법
Unit unit = new Unit();

unit.Attack = new HighAttack();
unit.Attack.AttackUnit();
//output : HighAttack

unit.Attack = new MidAttack();
unit.Attack.AttackUnit();
//output : MidAttack

📌 이런 식으로 사용하면 플레이어는 Attack의 방식을 유연하게 관리할 수 있다.
     그 예로 새로운 방식을 추가할 땐 새로운 클래스를 작성하여 추가만 하면 된다.
     나머지는 인터페이스 클래스가 알아서 처리해 줄것이다.

📌 변수에 할당되는 것을 생각해보면, 런타임 중에서도 교체가 당연히 가능하다.

📌 Unit을 상속 받는 개체는 override를 하여 AttackType을 재정의할 수있다.
     하지만 상속 받는 다른 클래스도 함수를 똑같이 재정의해야한다면 같은 코드를
     똑같이 작성을 해야한다. 이런 비슷하거나 똑같은 함수들을 가진 클래스가 많을
     때 사용 하면 중복 코드를 확실히 줄여준다.

📌 상속하기에는 너무 애매한 경우 사용해도 좋다.

📌 조심해야 할 것은 예시처럼 4줄이면 끝나는 코드가 패턴을 사용하면 3배 가까이
     늘어났다.

🎉 한 장 요약



📄 23.09.26 ✍ 타워 디펜스 팀 프로젝트

✨ 맡은 역할 :
유닛이 타워 역할을 하고 나는 유닛을 보조하는 건물의 기능들과 플레이어의 재화 부분을 맡았다.

✨ 첫날을 마무리하고 남은 예상 작업들 :

📌 MVC패턴을 지키면서 기능의 완성부터 할 것
     추가로 캡슐화를 잘하여 나중에 디테일을 추가할 때를 대비할 것

📌 내일은 스프라이트를 찾고 실제로 건물을 세워볼 것
     애니메이션은 게임의 구조가 어느정도 확정되고 나서 추가할 것

📌 드래그 앤 드랍으로 설치하는 건 잘 만들어서 TIL 주제 확보 할 것 😋

🎉 한 장 요약



📄 23.09.27 ✍ 레이캐스트로 오브젝트 불러오기

✨ 레이캐스트에 대한 포스팅은 여러분 있었다.
하지만 실제 프로젝트에서 사용하지 못 했던 부분을 오늘로써 채워본다.

LayerMask layer; // 목표가 될 레이어
Vector2 mousePos; // 마우스의 스크린 좌표값

// 마우스의 포지션을 불러와줄 함수 (feat. InputSys)
void GetMousePos(InputAction.CallbackContext context)
{
    mousePos = context.ReadValue<Vector2>(); 
}
// 왼쪽 마우스 버튼을 클릭시 호출될 함수
void OnLeftClick(InputAction.CallbackContext context)
{
    if (!context.started // started : 키 다운, performed : 꾸욱, canceled : 키 업
    || EventSystem.current.IsPointerOverGameObject()) // 📌 #1
        return;

    Ray ray = Camera.main.ScreenPointToRay(mousePos); //📌 #2
    // 맞았으면 'true'와 'out' 를 리턴
    if (Physics.Raycast(ray, out RaycastHit target)) 
    {   // 목표 레이어와 타켓의 레이어를 비교, false = 리턴
        if (layer.value != (layer.value | 1 << target.transform.gameObject.layer))
            return;
		
        // 밑으로는 맞았을 때의 처리 방식
        BaseBuilding building = target.transform.GetComponent<BaseBuilding>();
        BuildingController.Instance.ActiveClickBuildingUI(building);
    }
}

ray = 광선(시작점과 방향), RaycastHit = 맞은 대상

📌 #1 : 마우스가 UI 위에 위치하냐'를 판단해주는 함수 true = UI의 위에 있다

📌 #2 : 스크린 좌표를 주면 해당하는 Ray를 반환해준다.

📌 UI를 예외 처리하지 않으면 UI를 클릭해도 오브젝트가 눌려질 수도 있다.
     

🎉 한 장 요약



📄 23.09.28~23.10.1 🌕 추석 연휴

🎉 추석이란 핑계로 TIL은 적지 않는다.

profile
ChuNyan

0개의 댓글