본문 바로가기

Starters 부트캠프/B - log

유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 8주차 학습 일지

교육과정을 벌써 7주 해나가면서 어려운 내용, 쉽지 않았던 과제, 팀 프로젝트들이 참 많았지만, 그래도 이젠 정말 적응 잘해서 순탄하게 흘러가는구나 했다.

화요일 그날도 파티클 과제를 끝내가면서 어려웠던 파티클, 애니메이션 속성도 점점 적응되고, 할만하겠구나 했는데, 그것 때문에 난이도를 조절하시려고 수요일 새벽.. 그분이 와버렸다.

 

"두.. 줄"

 

두 줄이 나왔다..

 

코로나 면역인줄 알았던 나였지만, 결국 코로나에 걸리고 격리 생활이 시작되었다.

사실 격리가 문제가 아니라, 거의 3일간 열나고, 편도가 붓고 해서 수업을 제대로 들을 수가 없었다. ㅠ

덕분에 글을 쓰기 직전까지 다시 밀린 진도를 따라가려고 하고 있지만, 생각보다 쉽지 않다.

 

그런 고로 이번 회고록은 평소보다 내용이 많이 부실할 것 같다.

혹시 계속 글을 보시는 분이 계신다면, 정말 죄송하다는 얘기드리고 싶고, 앞으로 다시 진도 따라가면서 오늘 못 쓴 만큼 더 글 쓰려고 한다.

 


 

Starters 8주차 주간 과제 -  '파티클 이펙트 만들기'

 

회오리 모양 만들기

 

먼저, 회오리 모양이 콘 모양으로 위쪽으로 나아가야 하기 때문에 Shape은 Cone으로 한 뒤에 알맞게 퍼지는 각도나 처음 위치의 반지름 길이를 정했다.

 

Particle - Shape 속성들

 

전체 파티클의 유지 시간은 1로 한 뒤에 파티클 숫자를 최대 5000으로 늘렸다.

아무래도 더 많이 생성하는 편이 이펙트가 더 있어 보이고, 꽉 찬 것 같은 느낌이 들기 때문이다. ㅎㅎ

사실 초당 500개의 파티클이 각각 7초 동안 유지시키므로 최대 파티클 수를 좀 줄여도 상관은 없었지만, 추후에 Rate over Time의 양을 더 늘릴 수도 있어서 넉넉히 잡아뒀다.

 

Particle - Particle System / Emmision

 

회오리의 색상은 생성되었을 때에 노란색이었다가 조금씩 색이 순차적으로 바뀌면서 마지막엔 분홍색으로 없어지게 했다.

생성 시간에 따라 Z축으로는 속력을 더해서 좀 더 길쭉하게 만들었고, Radial 역시 점점 넓어지도록 하였다.

 

Particle - Velocity(Color) over LifeTime

 

 

애니메이션 추가하기

 

UI, 이펙트에 애니메이션을 넣기 위해서는 해당 오브젝트를 누르고, 상단 탭 Window - Animation - Animation으로 애니메이션 창을 켜서 새로 생성하면 된다.

 

애니메이션 창

 

나는 회오리의 위치와 크기를 변화시키기 위해 Position과 Scale만 바꾸기로 했다.

원하는 프레임에 키프레임을 생성해서 위치는 내려갔다 올라갔다 다시 원 위치로 오게끔, 크기는 커졌다 작아지도록 하였다.

 

그래서 만들어진 결과는 아래와 같다!

 

회오리 이펙트를 감상하세요!

 

파티클 총평을 하자면.. 솔직히 아직 모든 속성을 활용하고, 더 예쁘게 만드는 것이 서툴기는 하지만 그래도 웬만큼 해당 속성이 어떤 속성인지 이해는 했다고 생각이 든다.

 

물론... 미적인 능력은 더 키워야 할 것 같다. ㅠ

 

 

Starters 8주차 스터디 -  '알고리즘 스터디'

 

1주 차에 같이 풀어보기로 한 문제들의 코드 리뷰를 진행했다.비교적 쉬운 사칙연산 및 조건문 문제라서 크게 어려움을 느낀 문제는 다들 없었다.

 

하지만, 주사위 세 개 문제 같은 경우는 숫자 세 개를 각각 같은지 큰지 비교하는 것보다 foreach로 순회하면서 가장 큰 값, 같은 수가 몇 개 있는지 등을 변수로 저장하는 것이 더 효율적임을 깨달았다.

 

using System;
using System.Collections.Generic;

namespace Baekjoon
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<int> arrayI;

            string[] input = Console.ReadLine().Split(' ');
            arrayI = new List<int>();

            foreach (string i in input)
            {
                arrayI.Add(int.Parse(i));
            }

            Console.Write(Price(arrayI));
        }

        static int Price(List<int> arrayInt)
        {
            int num = 0;
            int count = 0;

            foreach (int i in arrayInt)
            {
                if (arrayInt.Count(n => n == i) > count)
                {
                    num = i;
                    count = arrayInt.Count(n => n == i);
                }
                else if (arrayInt.Count(n => n == i) == count)
                {
                    num = i > num ? i : num;
                }
            }

            if (count == 3)
                return (10000 + num * 1000);
            else if (count == 2)
                return (1000 + num * 100);
            else
                return (num * 100);
        }
    }
}

 

문제 : BJ2480 주사위 세개

 

2480번: 주사위 세개

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.  같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.  같은 눈이 2개

www.acmicpc.net

 

 

Starters 8주차 수업 -  '닷지 게임 만들기'

이번 주부터 장르별로 게임을 하나 혹은 두 개 정도 만들어보기로 하셨다.

처음 만들 게임은 이른바 닷지 게임이라고, 곰플레이에서 할 수 있던 옛날 게임으로 장르로는 총알 피하기 게임 정도로 생각하면 될 것 같다.

 

닷지 게임 (출처 - https://oldgameheaven.com/416)

 

 

해상도 조절

 

해상도는 1200 x 1920으로 생각하고 제작했다.

하지만, 여러 기기의 해상도에 따라서 변하면 게임을 하는데 큰 장애가 될 수 있으므로 어느 정도 맞출 필요가 있다.

(Canvas Scaler를 통해 일단, Scale with ScreenSize를 선택하고, 원하는 해상도를 입력해 놓았지만, 이는 캔버스에 그려지는 것들만 해당하기 때문에 따로 맞춰줄 필요가 있다.)

 

스크립트에서는 Screen.SetResolution을 통해 해상도를 설정할 수 있다.

만약 게임하는 동안 해상도를 1200 x 1920으로 고정하고 싶다면, 다음과 같이 하면 된다.

Screen.SetResolution(1200, 1920, true);

 

반면에, 가변으로 해상도를 설정할 경우 Canvas.width와 Canvas.height으로 디바이스의 해상도를 가져오고, 원하는 비율로 맞추기 위해 ratio를 곱해준다.

Screen.SetResolution(Screen.width, Screen.height * ratio, true);

 

여기서 Screen.width, Screen.height는 그냥 사용할 때에는 디바이스의 너비와 높이를 가져오지만, 먼저 SetResolution을 하면, 설정된 너비, 높이의 값을 가져오게 되므로 주의할 필요가 있다.

 

 

LocalPosition vs Position

 

이 게임에서 조이스틱은 당연하고, PoolManager 스크립트를 가지고 있는 오브젝트 역시 캔버스의 자식 오브젝트로 들어간다.

그 이유는 PoolManager 오브젝트가 캔버스의 경계를 돌면서 총알을 플레이어에게 발사할 것이기 때문이다.

 

(실제로 슈팅 게임에서도 총알을 발사하는 PoolManager 스크립트를 가진 오브젝트가 실제 게임 상에서 나타나고 이동하는 일이 많다. 예를 들면, 보스 몬스터가 움직이면서 플레이어에게 총알을 발사하는 경우가 그렇다.)

 

이렇게 캔버스에 속하는 경우는 그냥 position이 아니라 localPosition을 써야 실제 게임에서 제대로 위치가 될 수 있다.

본 프로젝트에서는 일단 캔버스가 메인 카메라에 맞게 Screen Space 되어 있고, 이 과정에서 캔버스의 Scale이 다르게 적용되어서 메인 카메라의 위치가 0, 0이라고 할 지라도 월드 좌표계로 PoolManager의 위치를 잡으면 큰 오차가 발생하게 된다.

 

맨 위에 Canvas의 Scale이 다르게 적용된 모습

 

반면에 총알을 생성할 때에는 캔버스 바깥에서 생성되어 움직이므로 무조건 Position을 사용해야 한다.

PoolManager의 localPosition 값을 주었다간 역시나 엉뚱한 곳에 총알이 생성되게 될 것이다.

 

 

결과

 

그 외에도 여러 가지 코드들이 많이 있지만, 일단 중요하다고 하신 부분만 위에 정리하였다.

강사님을 따라서 클론 코딩해보니, 어떤 식으로 코드를 구축해 나가고, 파편화시키는지 조금은 감이 잡히는 듯했다.

물론 아직은 코드를 하나하나 따라가기도 바쁘지만, 이후에는 나 스스로 코드를 구축해서 게임을 만들어 보도록 하겠다.

 

닷지 게임은 완전히 완성된 것은 아니고, 일단 강사님과 함께 기본적인 기능만 구현했고, 아래의 영상으로 볼 수 있다.

밀린 수업을 따라가고 시간이 남는다면, 더 기능을 추가해보도록 할 예정이다.

 

게임 플레이 영상

 

 

 

유데미 코리아 바로가기 : 

 

Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea

유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.

www.udemykorea.com

 

💡 본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.