2019년 6월 28일 금요일

국비 교육 : 게임 프로그래밍 075일

75일 차 교육 내용 메모를 옮겨 본다.
인공지능에 대한 강의를 시작한 날이었던 것 같다.


FSM (Finite State Machines)
- 구현 방법이 다양하다. (if~else~ , switch , class)
- 게임에서 사용하는 인공지능, 유한/상태/기계
- 외부 정보에 의해 자신의 상태가 변동되는 기술 또는 구조를 의미
- NPC 류의 행동 제어
- Player 의 상태 제어 (키 입력에 따른 walk -> run -> walk )
- 단점으로는 양이 많으면 복잡해진다.

HFSM (Hierarchical Finite State Machines)
- 계층 FSM
- 큰 그룹의 FSM을 만들고 각 상태 내부에 FSM이 생성되는 구조
- 조건에 따른 그룹 생성이 중요

BT (Behaviour Tree)
- 행동 트리
- 트리 형태로 상태가 나열
- 구조는 트리로 만들고 선택은 상위→하위의 우선순위로 동작하는 구조


FSM의 기본적인 구성은 State를 알려주는 변수와 이를 통한 Switch문으로 구성할 수 있다.
Switch문의 Idle, Move 등에서 Battle로 전환할 수 있는 공용코드를 양쪽에 집어넣어 둔다.

구현 범위에 따라 FSM과 BT에 대한 방향성을 세워야 된다.
- 작고 확실한 상태 : FSM
- 확장, 복잡성 상태 : BT


이처럼 AI와 관련된 내용이 메모되어있다.
FSM을 주력으로 강의한 것으로 보이며, FSM를 Class로 구현하는 숙제가 주어졌다.

국비 교육 : 게임 프로그래밍 059 ~ 074일 | 2D 포트폴리오 제작

59일부터 74일까지의 2D 포트폴리오 제작 내용을 되돌아본다.


이 기간에는 윈도우 프로그래밍을 이용하여 2D 포트폴리오를 제작하는 것으로 교육이 진행되었다.

크게 이 기간에 취업 활동용 이력서에 사용되는 2D 포트폴리오 프로그램을 만들고 제작 시 사용된 기술, 기간, 이슈, 목표 등을 소개하는 발표 문서 두 개로 만드는 시간이었다.


교육생들은 자발적으로 팀 또는 개인으로 나뉘고, 기간 동안 제작할 목표 게임을 선정해 최대한 유사하게 제작해 보는 것이 기간 내 교육 내용이었다.

게임 선정, 발표 문서에 포함되어야 하는 항목의 강사 설명은 있었지만, 이후 프로그램의 제작과 발표 문서는 교육생들이 주도적으로 진행하는 방식이었다. 즉, 초반 부분을 제외하고 기간의 교육 시간이 모두 게임 리소스 제작(또는 획득), 프로그램 제작과 문서 제작에 할애 되었다.

강사는 모든 교육생의 포트폴리오들을 주도할 수는 없으니, 교육 시간 중 대기하고 있다가 진행 중 필요한 기능의 구현 방식과 같은 질문 사항이 있으면 이를 해결해 주는 방식으로 교육을 진행했다.

2D 포트폴리오를 제작하는데 필요한 항목을 되짚어 보면,
- 리소스 확보 : 게임의 그래픽 리소스, 사운드 리소스
- 구현 항목 정의 : 게임의 어떤 항목들을 구현해야 하는지, 어떻게 구현해야 하는지

이 두 가지를 모두 교육생이 주도적으로 알아서 진행한 것이엇다.

게임 프로그래밍을 처음 배우는 교육생들이 실 교육 기간 59일 만에 리소스도 없고 기획서도 없이 만들어진 주도적으로 게임을 분석해 게임을 만들어내야 하는 과정이었다.


교육 기간 중 강사는 윈도우 프로그램을 이용한 2D 포트폴리오는 게임 프로그래머의 구직 활동 시 지원자의 역량을 알아보는데 중요한 자료라고 강조했던 것 같다.


결과적으로 블로그 주인은 간단하게나마 슈팅 게임 프로그램과 소개 문서 제작을 완료하였지만, 모든 교육생이 이 기간의 과정을 다 따라서 오지는 못했던 것 같다.


교육생들이 제작한 2D 포트폴리오를 모아두거나 영상으로 보관을 하지는 않아서 잘 기억이 나지는 않지만, 좌절한 교육생들이 많았다. 그리고 앞선 윈도우 프로그래밍 및 알고리즘 기간에서 벌어진 교육생들 간의 학습 간격이 이 기간에 확 벌어졌다. (교육 출석은 하지만 강의를 따라오지 못하고, 어떤 질문을 해야 하는지도 모르는 교육생 숫자가 늘었던 것 같다.)


이제는 과거에 있었던 많은 국비 게임 교육 중 하나의 과정으로 15일이라는 교육 기간의 강의가 이런 내용으로 진행되었다고 직접 경험한 기록을 남기고자 글을 작성해 본다.

2019년 6월 27일 목요일

Unity - GPGS 와 Admob 연동 및 배포 준비 작업


0. 사전 정보

  • Unity 버전 : 2018.4.2f1
  • GPGS Plugin 버전 : GooglePlayGamesPlugin-0.9.64.unitypackage
  • AdMob Plugin 버전 : GoogleMobileAds-v3.17.0.unitypackage

1. 배포용 APK를 준비

  • gpgs 패키지가 설정되지 않은 순수 게임 구현까지의 프로젝트
  • Unity>PlayerSettings>PublishingSettings>keystore를 생성해 적용한 프로젝트
  • keystore 와 key의 Alias 를 생성 및 적용한 프로젝트
  • keystore를 설정 하지 않은 APK 업로드 시 "디버그 모드로 서명한 APK...." 형태의 에러가 차후 발생 됨

Google Play Console 앱 삭제 - Android 광고 ID 사용 및 개발자 배포 계약의 4.8 조항 위반 건.

게임에 AdMob을 적용하는 작업도중 "Android 광고 ID 사용 및 개발자 배포 계약의 4.8 조항 위반" 메일과 함께 등록된 게임이 삭제 되는 경우가 발생 된다.
이는 구글 콘솔에 게임 등록 시 광고 처리를 하지 않은 상태로 등록하고, 이후 테스트용 APK에는 광고가 탑재되어 발생한 문제로 확인 되었다.

이런 상황이 발생 되는 아래와 같은 단계로 문제를 해결 할 수 있다.

- 구글 사이트 도구나 블로그를 이용해 개인정보처리방침 정보를 작성하고 URL을 확보 한다.

- 구글 콘솔에 접속해 앱 정보를 업데이트 한다.

1. 모든 애플리케이션>앱 선택> 앱 정보 > 스토어 등록정보 에서 [개인정보처리방침] 항목에 작성한 개인정보 URL을 입력 한다.
2. 모든 애플리케이션>앱 선택> 앱 정보 > 가격 및 배포 에서 [광고 포함] 부분을 확인해 수정 한다.

구글 콘솔에서의 작업을 하면 앱이 다시 제출 된 상태로 [대시보드]의 상태가 "업데이트 처리 중" 으로 표시되는 것을 확인 할 수 있다. (새로 APK를 출시 하지 않아도 된다.)

이후 2~3시간(수시간) 경과 되면 [대시보드]의 상태가 "출시중"으로 변경된다.


개인정보처리방침 참고 자료
한글 : https://www.privacy.go.kr/a3sc/per/inf/perInfStep01.do
영문 : https://app-privacy-policy-generator.firebaseapp.com/#


수집 정보의 예
- Email address, First name and last name, Address, State, Province, ZIP/Postal code, City, Cookies and Usage Data

구글 플레이 스토어 등록 시 개인정보처리방침 등록

게임을 제작하여 내부에 AdMob으로 광고를 적용하고, 구글 플레이 스토어에 "개인정보처리방침" 정보를 연결하지 않으면 "구글 배포 계약의 4.8 조항"(링크)에 의해 등록한 앱이 삭제될 수 있다.

이런 상황을 막기 위해 앱 등록 시 "개인정보처리방침"의 URL을 등록해야 하는데, 개인 호스팅을 하지 않는 이상 URL을 가지기 쉽지는 않을 것이다.

이때 사용할 만한 구글의 서비스가 있다.
사이트 도구 : https://sites.google.com/site/sites/
      또는 https://sites.google.com/new


서비스에 로그인한 뒤, 페이지를 추가해 필요한 "개인정보처리방침" 내용을 작성하고, 게시한 후 게시된 사이트의 URL을 구글 콘솔에 추가하면 된다.


2019년 6월 26일 수요일

Unity에서 Logcat 정보 보기

안드로이드 개발 중 디버깅 시 Log 를 볼 수 있는 장소가 Android Studio의 Logcat 창이다.
이 창에서는 기기에서 오류와 (앱에서 Log 클래스로 작성한) 메시지들을 볼 수 있다.
(Andriod SDK 설치 폴더 내 tools/monitor.bat 로 연결된 기기와 Logcat 확인 가능)

하지만 Unity와 Android Studio을 실행해 Logcat 창을 확인하는 것 보다 Unity에서 바로 Logcat에 표시되는 정보를 확인할 수 있는 방법이 있다.

Logcat (android logging) extension for Unity3D
Link : https://github.com/dzonatan/Unity3D-LogCat-extension

Link 내 How to use 정보와 같이
Asset>Editor 폴더를 생성해 LogCatWindow.cs를 위치 시키고, Unit 메뉴의 Window>LogCat - Android Logger 을 선택하면 Logcat 윈도우를 띄울 수 있다. 




















Debug.Log확인 및 AdMob에서 사용할 테스트 기기 번호를 확인하는 데 사용 했다.

Unity "Build And Run" 미 실행 오류

유니티에 기기를 연결해두고 기기에서 게임을 삭제해 가며 Build And Run 으로 게임을 테스트 하다 보면 종종 "Build completed with a result of 'Succeeded'"으로 성공 메시지가 표시되지만, 기기에서는 실행이 되지 않는 경우가 있다.

이런 문제가 종종 발생한 기기는 구글 계정이 복수로 등록된 기기였다.

기기의 옵션 메뉴에서 설치된 전체 App 리스트를 확인해 테스트를 한 게임 앱이 정상적으로 삭제되었는지 확인하고, 삭제되지 않았으면 우측 상단 메뉴>"모든 사용자에 대해 제거"로 다시 삭제하면 정상적으로 Build And Run 기능이 동작하게 된다.

Unity Build And Run "CommandInvokationFailure: Unable to install APK to device. Please ...." 오류

유니티에서 Build And Run을 실행하는 중에 다음과 같은 에러가 발생 될 수 있다.

CommandInvokationFailure: Unable to install APK to device. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details.
...
[INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.kkumgames.Sample_Gpgs_ADMob signatures do not match the previously installed version; ignoring!]
...

기기 또는 에뮬레이터에서 현재 빌드하는 게임과 동일한 패키지명을 가진 게임이 설치되어 있어서 발생한다.

따라서 설치된 게임을 삭제 후 재시도 하면 된다.

2019년 6월 25일 화요일

Unity PlayerSettings의 Version 참조

유니티의 PlayerSettings > Other Settings > Version 에 입력된 값을 출력하는 스크립트.
PlayerSettings.bundleVersion 는 에디터 전용이라 Apk로 Build 시 사용 할 수는 없음.

using UnityEngine;
using UnityEngine.UI;

using UnityEditor;

public class MyVersion : MonoBehaviour
{
    public Text versionText;

    void Start()
    {
        // using UnityEditor; 와 세트로 edit 전용
        //buildVersionText.text = "Version - " + PlayerSettings.bundleVersion;

        // 빌드 시 사용 할 수 있음
        buildVersionText.text = "Version - " + Application.version;
    }
}

'다른 사용자가 이 기기에 호환되지 않는 버전을....' 오류

기기에 앱을 설치 및 업데이트해 가며 테스트하는 중 때때로 다음과 같은 오류 문구가 발생한다.

'다른 사용자가 이 기기에 호환되지 않는 버전을 설치했기 때문에 이 앱을 설치할 수 없습니다.'


이는 기기에 2개 이상의 구글 계정이 등록되어, 계정 중 한 곳에서 앱이 정상적으로 삭제되지 않아 발생 된다.

이를 다음과 같이 해결할 수 있다.

1. [설정] > [앱 및 알림] > [설치한 앱] > 앱 정보로 이동
2. 이후 우측 상단 메뉴의 "모든 사용자에 대해 제거"를 선택해 삭제
3. 이후 테스트 앱 재설치 시도

Unity GPGS LeaderBoard "Play 게임에 문제가..." 오류

유니티에 GPGS 플러그인을 이용해 Leaderboard 작업중 발생 하는 오류.

"Play 게임에 문제가 발생했습니다."





















개인적인 경험으로 테스트를 안드로이드 emulator 또는 Nox와 같은 앱플레이어에서 할 경우 잘 발생 했다.

이런 오류는 앱 설치 후 리더보드를 보는 기능까지는 문제가 없지만 LeaderBoard에 점수를 입력하는 경우, 위와 같은 에러와 함께 이후 LeaderBoard와 관련된 어떤 작업도 할 수 없게 된다.


이럴 경우 다음과 같이 해결 했다.

1. Google Console에 다음 버전의 APK 를 업로드 하여 출시
2. 기기에 기존 버전의 앱 삭제
2. Google Play에서 앱을 다운 받아서 재 설치 후 테스트


Unity GPGS LeaderBoard 정보 획득 및 가공

유니티에서 구글 리더보드에 등록되어 있는 내 점수를 획득 하는 방법

using UnityEngine;
using GooglePlayGames;
using UnityEngine.SocialPlatforms;

public class GPGSIntegration : MonoBehaviour
{
    long bestScore;

    void GetLeaderBoardScore()
    {
        ILeaderboard lb = PlayGamesPlatform.Instance.CreateLeaderboard();
        // GPGS에서 생성한 GPGSIds 클래스 리더보드 변수명
        lb.id = GPGSIds.leaderboard_bestscore;

        lb.LoadScores(scores =>
        {
            bestScore = lb.localUserScore.value;
        });
    }
}


그리고 리더보드의 정보를 획득해 다음과 같이 가공할 수 있다.

using UnityEngine;
using GooglePlayGames;
using UnityEngine.SocialPlatforms;

public class GPGSIntegration : MonoBehaviour
{
    long bestScore;

    void ShowLeaderBoardMyInfo()
    {
        ILeaderboard lb = PlayGamesPlatform.Instance.CreateLeaderboard();
        // GPGS에서 생성한 GPGSIds 클래스 리더보드 변수명
        lb.id = GPGSIds.leaderboard_bestscore;

        lb.userScope = UserScope.Global;
        lb.range = new Range(1,10);
        lb.timeScope = TimeScope.AllTime;

        lb.LoadScores(scores =>
        {
            uint all_player = lb.maxRange;
            int my_rank = lb.localUserScore.rank;
            decimal percent = (decimal)my_rank / (decimal)all_player;

            text.text = scores.ToString() + "\nAllPlayer: " + all_player + "\nMyRank: " + my_rank + "\nMyScore: " +lb.localUserScore.value.ToString() + "\nPercent: " + percent + "%";
        });    
    }
}
출력 정보








출처 : https://stackoverflow.com/questions/55234701/google-play-games-leaderboard-custom

2019년 6월 24일 월요일

국비 교육 : 게임 프로그래밍 074일

74일 차 교육 내용 메모를 옮겨 본다. (2D 포플 16일 차)
각각의 2D 포트폴리오 별 리뷰를 진행했다.

포트폴리오와 관련된 마지막 메모인 것으로 보아, 리뷰를 진행 한 것 같다.

지금까지 제작한 게임 프로젝트와 소개 PPT, 동영상들을 함께 보는 시간을 가진 것 같다.
그리고 마지막까지 다듬어야 하는 항목에 대한 내용과 PPT 구성 보강 등에 대한 내용이 강사 주도로 이야기된 것 같다.

각각의 포트폴리오를 같이 보고, 검토하고 개선사항을 논의하는 시간을 가진 것 같다.

국비 교육 : 게임 프로그래밍 073일

73일 차 교육 내용 메모를 옮겨 본다. (2D 포플 15일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


포트폴리오 작업을 진행했다.
포트폴리오용 게임 구현을 마무리 짓고 동영상과 PPT에 대한 작업을 진행 한 것으로 생각된다.


별도의 메모가 없는 것으로 보아 다른 질문 사항 없이 강의 시간 내내 포플 작업만 한 것 같다.

국비 교육 : 게임 프로그래밍 072일

72일 차 교육 내용 메모를 옮겨 본다. (2D 포플 14일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


포트폴리오 작업을 진행했다.

별도의 메모가 없는 것으로 보아 다른 질문 사항 없이 강의 시간 내내 포플 작업들만 한 것 같다.



국비 교육 : 게임 프로그래밍 071일

71일 차 교육 내용 메모를 옮겨 본다. (2D 포플 13일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


사운드 붙이기
결과 창 화면 퀄리티 올리기

보스몬스터의 전투 단계를 3단계로 구성
획득물(골드, 파워 등)이 생성되는 룰 개선

포트폴리오 내 임시 이미지를 게임 Sprite로 교체


이상과 같이 포플 작업을 진행했다.

2019년 6월 21일 금요일

Unity - Job failed with exception: GooglePlayServices.JavaUtilities+ToolNotFoundException: jar not found Error

유니티 프로젝트에 GooglePlayGamesPlugin-0.9.64.unitypackage Import 후 아래 에러가 발생 될 경우의 처리.

Job failed with exception: GooglePlayServices.JavaUtilities+ToolNotFoundException: jar not found....

으로 시작 하는 에러가 발생 되는 경우가 있음.

이는 Unity 의 Edit>Preferences>External Tools 의 JDK 경로 설정이 정상적이지 않아서 발생 될 수 있으므로, 이를 재 설정해 줌.

1. "Use Embedded JDK" 체크를 해제
2. JDK 경로 확인 ( C:\Program Files\Unity\Editor\2018.3.14f1\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\OpenJDK\Windows )
3. "Use Embedded JDK" 체크를 다시 설정
4. 유니티 재 실행

이와 같이 JDK의 경로를 수동으로 재 설정해 주면 에러가 사라질 수 있음.

2019년 6월 20일 목요일

국비 교육 : 게임 프로그래밍 070일

70일 차 교육 내용 메모를 옮겨 본다. (2D 포플 12일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


2D 포트폴리오 제작을 진행했다. 
총알의 곡선 이동의 처리 방식을 질문했고, 강사가 처리 방식으로 베지에 곡선을 소개해 주었다. 
그리고, 샘플 프로젝트를 제작해 수업 끝에 공유해 주었다. 


이상과 같이 포플 작업을 하며, 곡선 이동에 대한 가이드를 받았다.

국비 교육 : 게임 프로그래밍 069일

69일 차 교육 내용 메모를 옮겨 본다. (2D 포플 11일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


개인 또는 팀별로 알아서 2D 포트폴리오 제작을 진행하였다.
총알의 곡선 이동에 대한 구현 방식을 고민했다.


곡선 이동은 다음 교육 일의 질문으로 넘기고, 포트폴리오 구현을 진행했다.

국비 교육 : 게임 프로그래밍 068일

68일 차 교육 내용 메모를 옮겨 본다. (2D 포플 10일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


개인 또는 팀별로 알아서 2D 포트폴리오 제작을 진행하였다.


슈팅 게임의 총알 이동의 구현을 방식을 질문했고, 선형보간에 대한 설명이 이루어졌다.

선형보간
- 좌표 이동 처리를 통한 지정 시간 내 등속 이동
- 선형보간 = Start * (1-rate) + End * rate


총알 이동 구현 및 남은 포트폴리오 작업을 진행했다.

2019년 6월 19일 수요일

Particle System에서 설정하는 Start Color 을 Script 로 변경

Particle Prefab 의 Particle System에서 설정하는 Start Color 을 Script 로 변경
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Fxlab : MonoBehaviour
{
    public GameObject fxPrefab;
    public Color fxColor;

    void start()
    {
        FXPrefab.GetComponent().main.startColor = fxColor;    
    }
}
이와 같이 선언 하면 FXPrefab.GetComponent().main 이 get 으로 수정을 할 수 없다.


이럴때는 아래와 같이 선언하여 Particle 의 Start Color를 수정 할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Fxlab : MonoBehaviour
{
    public GameObject fxPrefab;
    public Color fxColor;

    void start()
    {
        ParticleSystem currentParticleSystem = fxPrefab.GetComponent();
        ParticleSystem.MainModule psMain = currentParticleSystem.main;

        psMain.startColor = fxColor;
    }
}

국비 교육 : 게임 프로그래밍 067일

67일 차 교육 내용 메모를 옮겨 본다. (2D 포플 9일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


개인 또는 팀별로 알아서 2D 포트폴리오 제작을 진행 하였다.


별도의 질문 없이 포트폴리오에 집중하는 날 이였던 것 같다.

국비 교육 : 게임 프로그래밍 066일

66일 차 교육 내용 메모를 옮겨 본다. (2D 포플 8일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


각자(팀별로) 목표한 2D 포트폴리오 제작이 진행되었다.

리스트(LIST) 알고리즘에 대한 내용이 교육되었다.

슈팅 게임에서의 탄환 좌표 이동에 대한 내용이 질문되었다.


이처럼 개인 및 팀별 포트폴리오를 제작하였으며, 궁금한 내용의 질의가 있었다.

국비 교육 : 게임 프로그래밍 065일

65일 차 교육 내용 메모를 옮겨 본다. (2D 포플 7일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


포트폴리오 제작 및 계획서 작성.

클래스 디자인 패턴
- 여러 현장 업무자가 공통으로 사용하는 클래스 구조 설계를 학문적으로 정립한 것
- 현장 사람들이 공통적으로 사용하는 것

상태 패턴
- 무쌍류 게임에서 무기 종속적 캐릭터 상태 변화
- 1개인 걸로 전체가 바뀐다.

전략 패턴
- 레이싱 게임에서의 파츠 교환에 따른 변경

이러한 디자인 패턴들을 사용하기 위해서 쪼갤 수 있는 항목의 판단이 중요하다.
(화면 단위로 쪼갤 것인지, 기능 단위로 쪼갤 것인지 등)


포트폴리오 영상 및 소개 문서
> 게임 소개 → 개발이슈 → 사용기술 → 개발 일정 → UI 구성 → 화면 구성 → 팀원 소개
> 개발 일정 : 전체 일정, 개인 일정, 개발 이슈를 간략한 Gantt chart 형태로 제작


이처럼 포트폴리오를 제작하고 각 개인 또는 팀별로 구현에 필요한 질의가 있었다.
그리고 포트폴리오 문서 제작에 포함되어야 하는 내용이 공유되었다.

2019년 6월 15일 토요일

국비 교육 : 게임 프로그래밍 064일

64일 차 교육 내용 메모를 옮겨 본다. (2D 포플 6일 차)
수업 시간에 2D 포트폴리오 제작을 진행했다.


포트폴리오 작업을 진행 했다.


수업 시간 내내 포플 작업이 진행되었고, 별도의 강사가 주도하는 교육은 없었다.
그외 별도의 메모도 다른 코드 작업도 기록이 없다.

국비 교육 : 게임 프로그래밍 063일

63일 차 교육 내용 메모를 옮겨 본다. (2D 포플 5일 차)
수업 시 간에 2D 포트폴리오 제작을 진행했다.


포트폴리오 작업을 진행 했다.


수업 시간 내내 포플 작업이 진행되었고, 별도의 강사가 주도하는 교육은 없었다.
그외 별도의 메모도 다른 코드 작업도 기록이 없다.

국비 교육 : 게임 프로그래밍 062일

62일 차 교육 내용 메모를 옮겨 본다. (2D 포플 4일 차)
수업 시 간에 2D 포트폴리오 제작을 진행했다.


아케이드형 2D 슈팅 게임을 하나 선정했다.
이를 토대로 리소스 수집과 기능 구현을 본격적으로 시작했다.


수업 시간 내내 포플 작업이 진행되었고, 별도의 강사가 주도하는 교육은 없었다.

국비 교육 : 게임 프로그래밍 061일

61일 차 교육 내용 메모를 옮겨 본다. (2D 포플 3일 차)
수업 시 간에 2D 포트폴리오 제작을 진행했다.


게임 클래스를 설계하고, 슈팅 게임에 필요한 조작계 기능을 구현했다.
동시에 문서화 작업도 병행했다.


수업 시간 내내 포플 작업이 진행되었고, 별도의 강사가 주도하는 교육은 없었다.

2019년 6월 13일 목요일

국비 교육 : 게임 프로그래밍 060일

60일 차 교육 내용 메모를 옮겨 본다. (2D 포플 2일차)
수업 시 간에 2D 포트폴리오 제작을 진행했다.


포트폴리오로 종 스크롤 슈팅 게임을 선정해 작업을 진행 했다.


수업 내내 포트폴리오의 리소스 검색 및 확보, 문서 작업, 코드 작업을 진행 했다.
진행 중 궁금한 내용이 있으면 강사에게 질문으로 구현 방향에 대한 이야기를 논의 했다.


게임 제작을 한번도 안해본 사람들이 모여 리소스도 찾고 게임 소개 문서도 작성하고, 코딩으로 구현을 하는 작업이 시작 되었다.

국비 교육 : 게임 프로그래밍 059일

59일 차 교육 내용 메모를 옮겨 본다. (2D 포플 1일차)
2D 포트폴리오 제작과 관련된 기술적 내용에 대해서 이야기되었다.


포트폴리오를 개인 또는 팀으로 작업할 것인지 이야기하고 인원을 배정함.

포트폴리오에는 상세 계획서, 코드 규칙, 게임 소개 발표자료(PPT 또는 PDF)를 작성해야 된다.
- 상세 계획서 : 마일스톤 형식의 포트폴리오 일정 문서
- 코드 규칙 : 함수, 변수, 클래스 등의 규칙
- 게임 소개 발표 자료 : 어떤 게임을 제작하고 포함된 기술과 작업 중 이슈 등에 대한 정리

게임 소개 발표 자료에는 아래 내용이 담겨야된다.
- 게임 소개 : 어떤 게임인지 소개
- 기술 소개 : 구현에 사용된 기술(코드 적) 소개
- 개발 일정(간략) : 표 형식의 간략한 개발 일정
- 이슈 사항 : 개발 중 발생한 모든 이슈(잘된 것, 잘못된 것) 정리
- 작품 소개 : 스샷, 동영상으로 기능을 소개
- 기타


이동 좌표를 저장할 수 있는 list를 제작하며, 이를 queue 형식으로 사용한다.

구조의...
- 확장성이 필요한 경우 linked List로 스택과 대기열을 구현
- 속도가 중요한 경우 배열로 스택과 대기열을 구현


해시 테이블
- 키(KEY) 기반의 자료를 적당한 크기에 빠르게 저장
- 특정 키가 테이블 안에 존재하는지 여부를 빠르게 판단 가능
- 해시 테이블은 배열이다, 단 크기는 소수로 설정되어야 한다.
 (10개 자료 저장 시 11개 배열 생성)

키 값을 배열의 크기로 나눈 나머지를 색인으로
1. 배열의 크기로 나눈 나머지를 색인으로 사용
2. 숫자의 자릿수를 모두 더해 색인으로 사용


이중 해시 색인
- 숫자의 자릿수를 모두 더함 → 결괏값 → 숫자의 자릿수를 모두 더함
- 숫자의 자릿수를 모두 더함 → 결괏값 → 배열의 크기로 나눈 나머지 값


이처럼 주로 포트폴리오에 대한 내용이 설명되었고, 추가로 필요 기능요소에 대한 설명이 있었던 것 같다. 내용 중 메모로는 list와 해시 테이블에 대한 내용이 왜 이야기됐는지 자세한 기억은 안 난다.

Material.SetTexture 메터리얼 내 텍스트 변경

메터리얼 내 텍스쳐를 스크립트로 변경하는 메소드
(파티클 렌더러의 텍스쳐를 변경하는데도 사용 가능)

public void SetTexture(string name, Texture value);

name : 변경시키고자 하는 메터리얼 내 텍스쳐 변수명
value : 변경 하려는 텍스쳐 리소스

아래와 같이 설정해 사용할 수 있다.

using UnityEngine;
using System.Collections;

public class ChangeTexture : MonoBehaviour
{
    public Texture gameDataTex;

    public Material gameDataMat;

    public void ChangeShaderTexture()
    {
        gameDataMat.SetTexture("_MainTex", gameDataTex);
    }
}
gameDataMat 내 _MainTex 변수에 설정된 텍스쳐를 gameDataTex에 설정된 텍스쳐로 변경.

_MainTex 와 같은 타겟 정보는 해당 메터리얼(gameDataMat에 설정된 리소스)의 Inspector에서 확인할 수 있다.




2019년 6월 12일 수요일

국비 교육 : 게임 프로그래밍 035 ~ 058일 | 윈도우 프로그래밍, FMOD, A* 알고리즘 등

35일부터 58일까지의 윈도우 프로그래밍 강의 내용을 되돌아본다.


이 기간에 진행된 전반적인 강의는 별도의 교재 없이 강사의 설명과 인터넷 검색을 통한 기술 설명 위주로 진행되었다.


VS에서 윈도우를 생성하는 프로젝트 예제부터 시작하여 HDC를 이용한 2D Draw에 대한 강의가 이루어졌고, 이는 모두 강사의 샘플 프로젝트를 통해 설명되었다.

이후 기본 윈도우 생성 프로젝트를 클래스로 분리하여 재활용이 가능하도록 프로젝트 내 Class를 분리하는 강의, 이후 STL의 컨테이너를 이용한 데이터 관리에 대한 설명이 이루어졌다.


윈도우에서의 기본 그리기 과정이 얼추 정리된 이후 게임 프로그래밍과 연관된 2D 충돌 알고리즘키 입력 방식에 대한 강의가 이루어졌다. 2D 충돌 알고리즘의 네 가지 처리 방식에 대한 설명, 그리고 윈도우 프로그래밍에서의 키보드 및 마우스 키 입력에 대한 처리 방식에 대한 설명이 강의 되었다.

여기까지의 과정으로 윈도우 프로그래밍을 이용한 기본적인 2D 게임 프로그래밍의 모습을 갖출 수 있는 과정이었고, 이후 안정적인 프로그래밍 환경을 위한 강의들이 이루어졌다.

화면에 표시되는 그리기 요소들의 화면 백버퍼링 처리, Alpha 이미지 처리, 주요 기능의 class화로 재활용성 향상, 윈도우 프로그래밍에서의 시간 제어 등에 대한 강의들이 진행됐다.


이후 게임 제작 시 사용되는 많은 리소스를 관리하기 위한 Tree 자료구조에 대한 설명과 FMOD를 이용한 사운드 출력에 대한 설명이 진행됐다.

마지막으로 Sprite 리소스를 이용한 Animation처리 방법과 Tilemap알고리즘의 설명 이후 A* 알고리즘 설명의 과정을 통해 윈도우 프로그래밍을 이용한 2D 게임 프로그래밍 포트폴리오에 필요한 기술들이 강의 되었다.


강의 진행은 주로 강사의 샘플 프로젝트 작성, 이후 교육생들의 프로젝트 분석 후 실습으로 이루어졌다. 이중 윈도우 프로그래밍의 경우 당일 샘플 프로젝트 위주로 설명되고, 각종 알고리즘의 경우 사전 조사를 숙제로 진행하고 이후 강의에서 풀이하는 방식으로 진행된 것으로 기억된다.


돌이켜 보니 이 기간의 교육부터 따라갈 수 있는 사람과 아닌 사람들이 확 나뉘는 느낌이다.

당일 교육은 별도의 학습 자료 없이 실습 프로젝트 구현을 통한 설명으로 진행되었다. 이로 인해 당일 설명이 이해가 되는 사람들은 학습을 계속해 나갈 수 있었고, 아닌 사람들은 계속 교육 내용이 밀리거나 포기하는 현상이 발생 됐을 것이다. (이해가 되지 않으면 질문을 하라고 하지만 교육 중 질문을 하는 원생이 얼마나 있었을지는 상상에 맡기겠다)

또한 강의의 예습과 복습이 모든 교육생이 공통된 자료로 학습하는 것이 아닌 개개인의 인터넷 검색 스킬로 나오는 자료로 이루어지는 한계가 분명히 존재 했을것 같다. 당장 Bold로 표시한 기간 내 교육 내용의 키워드만 인터넷으로 검색해 보아도 다양한 자료들이 혼재되어 검색될 것이다.


이제는 과거에 있었던 많은 국비 게임 교육 중 하나의 과정으로 24일이라는 교육 기간의 강의가 이런 내용으로 진행되었다고 직접 경험한 기록을 남기고자 글을 작성해 본다.

2019년 6월 11일 화요일

국비 교육 : 게임 프로그래밍 058일

58일 차 교육 내용 메모를 옮겨 본다.
윈도우 API를 이용한 2D 포트 폴리오 제작에 대한 이야기가 오갔다.


헤더
- 자기 자신은 컴파일되지 않고, 포함해 사용하는 것
- 미리 컴파일된 헤더를 공용헤어라 한다.
- link 시점에 합쳐진다. (컴파일 단계를 거치지 않는다)

Github를 이용한 소스 관리
- tortoise SVN 툴을 이용한 Github 사용법 설명

포트폴리오 제작 시 작성하는 PT 문서, 작업 계획서, 프로젝트에 대한 설명


실습 프로젝트가 없는 것으로 보아 아마도 어떻게 포트폴리오를 제작해야 하는지에 대한 공유가 주로 이루어진 것 같다.
다른 사람이 제작한 사례와 포트폴리오로 무엇을 어떻게 만들어야 하는지에 대한 예제들이 공유된 것으로 생각된다.

Unity - Firebase 연동 (Analytics, AdMob)

버전 : firebase_unity_sdk_6.5.0.zip 게임에서 통계 측정 및 광고 추적을 위해 Firebase 을 연동한다. 앞서 [Unity - GPGS 와 Admob 연동 및 배포 준비 작업]  연동 이후에 작업을 진행 한다. 유니...