Unity_2기 내일배움캠프 TIL

Unity_2기 4주차 (231130)

잼잼재미 2023. 11. 30. 20:01

오늘은 드디어 팀 프로젝트에 대한 발제 강의가 있는 날이다. 팀 프로젝트는 주제는 추억의 게임을 선택해서 현대적인 버전으로 재현하는 것이다. 추억의 게임은 똥피하기, 닷지, 벽돌깨기가 있으며 충돌처리 구현에 중점을 두고 필수요구구현 위주루 팀 프로젝트를 진행하면 되는 것이다. 우선, 회의를 통해 벽돌깨기를 만들기로 했다. 그리고 역할 분담을 해서 오늘까지는 간단한 기능만 구현하고, 깃허버의 하나의 브랜치로 통합하는 것까지 진행하기로 했다. 또, 유니티 챌린지반의 특강이 있었고, 주제는 게임 프로그래밍에서 자주 사용되는 7개의 디자인 패턴이었다. 객체에 대한 내용인데 햇갈리는 내용이므로 정리를 했다.

 

팀 프로젝트


역할 분담


  1. 공의 움직임, 게인화면 구성 (Edge box Collider), 기본 게임 매니저
  2. 패들 구현 (Input System)
  3. 벽돌 구현 (벽돌 패턴, 레벨 디자인)
  4. 아이템 구현 (Enum)

일단 다음과 같이 네가지로 역할 분담을 했고, 벽돌 구현과 아이템 구현은 두명씩 맡기로 했다. 나는 오늘 아이템 구현의 기본적인 틀을 만들었다. 

 

 

구현 기능


아이템

public enum ItemType
{
    None,
    Laswer,
    Enlarge,
    Catch,
    Slow,
    Power,
}
public ItemType itemType = ItemType.None;

[SerializeField]float _itemSpeed = 5f;
[SerializeField]GameObject _paddle;
[SerializeField]PaddleNJM _paddleNJM;
[SerializeField] ArkanoidBall _arkanoidBall;

void Update()
{
    transform.position += new Vector3(0, -_itemSpeed , 0) * Time.deltaTime;
}

// 아이템 기능
public void LaserItem()
{
    _paddleNJM.IsLaser = true;
}

public void EnlargeItem()
{
    _paddle.transform.localScale += new Vector3(0.5f, 0, 0);
}

public void CatchItem()
{
    // ball이 튕겨 나가지 않고, 달라 붙음
    // 클릭 시, ball 발사
}

public void SlowItem()
{
    // ball 속도가 느려짐
    // ball speed가 private로 되어있음
}

public void PowerItem()
{
    // ball 데미지 증가
}

private void OnTriggerEnter2D(Collider2D collision)
{
    if(collision.tag == "Player")
    {
        switch (itemType)
        {
            case ItemType.None:
                break;

            case ItemType.Laswer:
                LaserItem();
                break;

            case ItemType.Enlarge:
                EnlargeItem();
                break;

            case ItemType.Catch:
                CatchItem();
                break;

            case ItemType.Slow:
                SlowItem();
                break;
                
            case ItemType.Power:
                PowerItem();
                break;

            default:
                break;
        }

        Destroy(gameObject);
    }
}

 

enum으로 아이템의 종류를 나누고, switch 문으로 각각 아이템 기능 함수를 호출하도록 했다.

 

 

Paddle Laser

[SerializeField] GameObject _LaserPrefab;
public bool IsLaser = false;

void Update()
{
    if (IsLaser == true)
    {
        // InputSystem으로 바꿔야 함
        if (Input.GetMouseButtonDown(0))
        {
            Instantiate(_LaserPrefab, transform.position, Quaternion.identity);

            IsLaser = false;
        }
    }
}

 

아이템의 LaserItem 기능을 구현하기 위해, Paddle이 Laser을 발사도록 구현했다.

 

 

특강 내용


게임 프로그래밍에서 자주 사용되는 7개의 디자인 패턴


  1. 싱글톤 패턴 : 특정 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 디자인 패턴
  2. 상태 패턴 : 객체의 상태에 따라 객체의 행동을 변경하게 해주는 디자인 패턴
  3. 관찰자 패턴 : 한 객체의 상태 변화를 관찰하는 다수의 객체
  4. 커맨드 패턴 : 게임 유저의 입력을 다룰 때 많이 사용하는 패턴
  5. 컴포넌트 패턴 : 객체의 행동을 작은 부품(컴포넌트)으로 분리
  6. 빌더 패턴 : 복잡한 객체의 생성 과정을 단계별로 분리, 생성하는 과정에서 서로 다른 표현을 가진 객체를 만드는 것
  7. 플라이웨이트 패턴 : 메모리 사용을 최적화하기 위한 패턴

 

주의사항


  1. 디자인 패턴은 애초에 특정 문제를 해결하기 위해 고려된 것임
  2. 모든 상황에 억지로 사용하는 것은 금물, 오히려 코드가 복잡해지는 역효과

 

 

오늘의 회고


오늘은 새로운 조에서 첫 팀 프로젝트를 진행했다. 아직 깃허브를 완벽하게 다룰수 없기 때문에 처음에는 걱정이 많이 됐다. 하지만 조원들에게 배워가면서 오늘 작업했던 내용을 잘 통합할 수 있었다. 그리고 통합 과정에서 내가 맡은 Item을 두명이서 작업을 하다보니 오류가 났다. 스크립트 명이 같아서 난 오류였다. 이러한 부분은 미리 사전에 같은 부분을 맡는 조원과 상의를 통해서 규칙을 정한 뒤, 오류가 나지 않도록 잘 해야 할 것 같다. 아무래도 팀 프로젝트를 그래도 두 번 했던 경험이 많이 도움이 된 것 같다. 깃허브를 다루는게 훨씬 쉬워졌고 협업 과정도 머리 솎에 정리가 되는 것 같았다. 내일은 Item을 두 명이서 어떤식으로 나눠서 구현할지 상의를 잘 해보고 진행할 것이다. 오늘 특강에서 들은 수업 내용은 명칭은 완전히 처음 듣는 내용이었지만, 내용은 클래스를 사용하는 여러가지 방식에 대한 내용이었다. 조금 어려웠지만 중요한 내용같았기에 정리를 해두었다. 

'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글

Unity_2기 5주차 (231204)  (0) 2023.12.04
Unity_2기 4주차 (231201)  (0) 2023.12.01
Unity_2기 4주차 (231129)  (0) 2023.11.29
Unity_2기 4주차 (231128)  (1) 2023.11.28
Unity_2기 4주차 (231127)  (0) 2023.11.27