프로그래밍 농장

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

STARTERS

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

Tennessee201 2022. 8. 14.
728x90

 

유데미 스타터스 과정이 벌써 8주차이다. 이번주에는 기록적인 폭우와 침수가 있었지만 이들을 뚫고 이번주도 스타터스에서 열공하였다 :) 

 

지난주에는 유니티에서의 스크립팅 개념과 다양한 구현방식 ( 싱글톤 패턴, 옵저버 패턴, Monobehavior LifeCycle. . ) 들과 유니티 엔진상에서 구현가능한 다양한 이펙트와 파티클, 랜더링에 대하여 직접 구현해보는 시간을 가졌다. 

이번주에는 강사님께서 직접 구현가능한 2D와 3D 프로젝트를 하나씩 투표를 받아서 직접 구현해보고 구현방식에 대한 개념을 익히는 시간을 가졌다. 

2D - Dodge 형식의 미니게임 ( ex. 뱀파이어 서바이벌 . . ) 

3D - LBS 기반 미니게임 ( ex. 포켓몬고 . . ) 

위 두가지를 만들어 보았다.

80년만의 폭우..


- 유니티 파티클 & 애니메이션 과제 (전주차)

우선 전주차 과제였던 유니티 파티클과 애니메이션을 활용한 프로젝트를 리뷰하면서 포스팅을 시작하고자 한다.

아래 3가지 조건과 최종 구현모습이 주어졌다.

 

  1. 아래의 체크된 옵션을 사용하여 영상의 모습을 구현해주세요.
  2. 애니메이터를 이용하여 이동 / 스케일 변화를 구현해주세요.
  3. 파티클 텍스쳐는 기본 파티클 텍스쳐를 사용하시면 됩니다

해당 이미지가 아래서부터 서서히 위로 생성되며, 생성이 완료되면 위아래로 움직이는 Animation이 동작한다.

 

우선 해당조건과 결과물이 출력되도록 하기위한 빈 GameObject를 하나 생성해준후, Particle System을 붙혀주었다. 저번주에 배웠듯이, 기본 파티클시스템을 붙히게 되면 Sphere형태로 퍼져나가는것이 기본이다. 

위 결과물은 Rotation 카메라 정면시점기준으로 아래 -> 위로 생성되는 구조이기때문에 Rotation.x 를 Inspecter에서 -90으로 설정해주었다.

그 후 파티클이 생성될 Shape은 보이듯이 Cone으로 해주었고,  파티클이 촘촘히 생성되야하므로, emission-Rate over Time을 1000, 그리고 Color of Lifetime에서 생성되는 각 파티클의 시간대 별로 위와 같이 색상을 바꾸도록 하였다.

그 외 Radius와 Arc등의 설정을 조작해주었으나, 위 결과물처럼 위쪽으로 퍼져솟아있는 버섯모양이 아닌, 아래를 향하는 모습이 해결되지 않았다.  이는 Velocity of Lifetime에서 생성지의 중심기점으로 설정되는 Linear와 Orbital을 건드려주니 정상적으로 동작하였다. 

최종 구현 모습 . 파티클의 수는 문제가없지만 상단으로 갈수록 파티클이 뭉개지는 부분은 LifeTime이 너무길어서 그런것 같기도 하다 ..


- 미니게임 2D:  Dodge 

위에서 말했듯이 2D 게임에서는 조이스틱으로 조작하여 날아오는 방해물들을 피하며 플레이하는 방식의 Dodge류의 게임을 간단히 제작해보았다. 

일단 기본적으로 조이스틱을 구현하는 것이 가장 주요한 구현 목적이었다. 

문득 궁금증이 생겨 검색해보니 게임개발시 조이스틱은 에셋으로도 많이 구현되어있어, 가져다 쓴다고는 하지만 기본적인 동작개념에 대해서는 당연히 이해하고 구현할줄 알아야 한다고 생각했다. 

최종 구현될 모습

조이스틱의 경우, 기본적으로 EventSystem ( : 사용자의 입력에 따라 응용 프로그램의 오브젝트에 이벤트를 보내는 방법 ) 에 기반하여 사용되며, 각 기능에 해당되는 내장함수를 작성하고 사용하는 방식이다. 

위와 같은 이벤트의 최대 장점은 지역변수로 가져오는 PointerEvenetData eventData이다. 

해당 클래스는 상당히 많은 정보를 담고있고, 해당하는 정보들은 위 이벤트에서만 얻어낸 값을 가지게 된다. 아래는 그중 가장 많이 사용되는 변수들이다.

ClickCount : 클릭된 횟수

ClickTime : 클릭된 시간

delta : 변화한 값

pointerId : 포인터 ID

position : 현재 포인터 위치 

+ 더 많은 변수는 아래 Unity Docs 참조

 

EventSystems.PointerEventData - Unity 스크립팅 API

Event payload associated with pointer (mouse / touch) events.

docs.unity3d.com

 

해당 닷지 미니게임에서의 조이스틱은 OnDrag(), OnEndDrag() 를 기반으로 터치(마우스)에 따라 해당 함수들을 사용하여 조작하도록 하였다.

 

전체코드 중 일부 : OnDrag() 

 public void OnDrag(PointerEventData eventData)
    {
        PointPosition =
            new Vector2(
                (eventData.position.x - Background.rect.center.x) /
                ((Background.rect.size.x - Handle.rect.size.x) / 2),
                (eventData.position.y - Background.rect.center.y) /
                ((Background.rect.size.y - Handle.rect.size.y) / 2));
        PointPosition = (PointPosition.magnitude > 1.0f) ? PointPosition.normalized : PointPosition;
       
        // PointPosition Input.GetAxis 같은 효과를 내기 위해서 왼쪽 -1 ~ 1 오른쪽 Range = 2
        //                                               위쪽 -500   500 아래쪽
        //                                              Handle --> Background 안에서 500,500
        
        Handle.anchoredPosition = new Vector2(PointPosition.x * Background.rect.size.x / 2 * offset,
            PointPosition.y * Background.rect.size.y / 2 * offset);

        // PointPosition =
        //     new Vector2(
        // eventData.position --> 좌하단 (0,0) / 우상단 (1200, 1920)
        // overlay --> UI오브젝트들의 포지션 == 트랜스폼 포지션 (0,0) 
        // Canvas Render Mode ==> Camera Overlay (camera.x, camera.y)
                   
        //        (0~1200)             - BackGround Pos ( 0 + CameraPos)
        //         (eventData.position.x - Background.position.x) / ((Background.rect.size.x - Handle.rect.size.x) / 2),
        //         (eventData.position.y - Background.position.y) / ((Background.rect.size.y - Handle.rect.size.y) / 2));
        // PointPosition = (PointPosition.magnitude > 1.0f) ? PointPosition.normalized : PointPosition;
        // Handle.transform.position = new Vector2(
        //     (PointPosition.x * ((Background.rect.size.x - Handle.rect.size.x) / 2) * offset) + Background.position.x,
        //     (PointPosition.y * ((Background.rect.size.y - Handle.rect.size.y) / 2) * offset) + Background.position.y);
    }

 


- 미니게임 3D:  LBS 

3D 게임은 LBS (위치기반) 프로젝트를 구현하였다.

이번 유니티 프로젝트에서는 MapBox 오브젝트의 Inspecter에서 Location의 좌표점과 그 외 Terrain 등의 설정값을 주어 LBS 게임의 기반을 구축하도록 하였다. 

아래와 같은 결과물이 출력되며, 해당 Map 좌표는 Location Log File 이라는 TextAsset 타입의 값을 좌표값으로 할당받아 적용시켰다. 

 

 


추가적으로 이미 빌드된 파일의 dll 파일을 디컴파일하는과정을 통하여 구현 코드내용을 뜯어볼수도있는 AssetRipper에 대해서도 알아보았다.

(물론 대형게임사 등은 해당 데이터파일을 뜯어볼수 없게 난독화 한다)

https://github.com/AssetRipper/AssetRipper

 

GitHub - AssetRipper/AssetRipper: GUI Application to work with engine assets, asset bundles, and serialized files

GUI Application to work with engine assets, asset bundles, and serialized files - GitHub - AssetRipper/AssetRipper: GUI Application to work with engine assets, asset bundles, and serialized files

github.com

 

-> 유니티는 asset bundle이라는 개념을 쓴다. 

 

아래와 같이 에셋리퍼를 통하여 유니티로 구현된 하스스톤의 내부 구현내용과 파일들도 확인할수있다.

 

 

 

다른 OS에서 작성된 프로젝트를 임포트할때 줄바꿈 정규화 수정에 관한 이슈가 뜰수있다. 

이는 캐리지 리턴 라인피드 ( LF) 에 관한 부분을 참조하면된다. 

 

 

유데미코리아 바로가기 : https://bit.ly/3b8JGeD

 

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

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

www.udemykorea.com

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

 

#유데미, #유데미부트캠프, #취업부트캠프, #개발자부트캠프, #IT부트캠프, #부트캠프후기

728x90