2019년 7월 31일 수요일

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

97일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티에 대한 강의가 진행됐다.


UI의 Anchor 방식을 All Stretch로 하면 부모 속성의 Width, Height 속성을 따라 받는다.

줄어드는 HP 게이지 구현
- 3개의 리소스를 사용한다.
- 배경, 게이지 버퍼, 틀

증가값 = Time.Deltatime;
yield return null;
- 형태로 증가 값의 기준을 잡을 수 있다.


ODBC 테이블 구조
- csv, xml, json

C#    C++
딕셔너리 = 맵
- 1키, 값으로 데이터 저장
- 값에 list 형을 저장해 데이터를 관리한다.


메모로 보아 HP bar 구현에 대한 교육이 진행된 것 같다.
그리고 게임 데이터 관리를 위한 방식이 설명된 것으로 보인다.

2019년 7월 30일 화요일

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

96일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티에 대한 강의가 진행됐다.


일정 시간마다 몬스터 생성
- InvokeRepeat(메소드, 최초 딜레이, 반복 주기); 를 이용해 구현

Inspector에서 m_Apple의 경우 Apple로 표시됨


GetComponentsIn~<>() 형태의 메소드는 값이 배열로 반환된다.
- var list = getcomponentsinchildren~ 형태로 가져올 수 있음
- list에는 배열로 정보가 들어감


노트에 작성된 내용은 여기까지이다.
내용으로 보아 몬스터나 탄환 같은 게임 개체의 생성과 관련된 교육이 진행된 것 같다.

2019년 7월 28일 일요일

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

95일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티에 대한 강의가 진행됐다.


OnMouseDown 함수의 경우 충돌이 있는 경우 사용한다.
- 물체를 찍어(드래그) 옮기는 기능
- collider로 영역을 체크한다.

3D 공간 내에서의 움직임
- Old → New
- dir = new - old 를 해야 방향이 나온다.
- dir.Normalize : 방향만 가져온다.
- 이동은 방향 * 이동속도 * 시간으로 제어를 한다.

배경 이미지 움직임
- 애니메이션을 이용한 방식
- scripts를 통한 방식

애니메이터.setfloat("이름", 값);
- 위와 같은 형식으로 애니메이터에 선언된 변수를 제어

ScreenToWorldPoint(vector3);
- 형태로 화면의 좌표를 월드 좌표로 변환할 수 있다.

vector3 - vector3 를 통해 방향(거리)을 얻을 수 있다.


이처럼 유니티와 관련된 script 내용 설명이 진행됐다.

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

94일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티에 대한 강의가 진행됐다.


Rigidbody
- IsKinematic : 스크립트를 통해서만 Rigidbody를 제어하겠다.
- Constraints : 이동 및 회전을 강제로 제어한다.

transform.Translate(값, 값, 값);
- 형태로 이동을 제어할 수 있다.

점프
- Rigidbody를 이용한다.
- rigidbody.addforce(transform.up * force);  으로 위로 힘을 준다.
- addforce : 질량에 관계가 있다. 힘을 준다.
- velocity : 질량에 관계가 없이 힘을 준다.
- 레트로, 플랫포머 게임에서는 velocity를 이용해 점프를 제어한다.


transform.position
- 위치를 제어하는 방식

rigidbody.position
rigidbody.moveposition
- 강체에 적용하는 방식


메시지 함수는 다 On으로 시작한다.

업데이트 프레임마다 collision, trigger 유니티 자체에서의 업데이트 사이클

edit>physic 에서 layer간 상호 조건 설정을 통해 제어를 할 수 있다.


transform.forward
- 회전 변환이 적용된 정면의 의미로
 오브젝트의 z축을 기준으로 움직일 수 있도록 제공해 준다.


이처럼 오브젝트의 움직임과 관련된 교육이 진행된 것 같다.

2019년 7월 24일 수요일

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

93일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티에 대한 강의가 진행됐다.


충돌과 물리적 처리에 대한 구분이 필요하다.

강체는 1개만 필요하다.
- [A] ↔ [B]  :  둘 중 1개만 강체가 있어도 무방하다.

리지드바디
- 중력이 있다.
- 물리력이 적용된다.

addforce
- 마찰계수, 질량, 방향에 영향을 받는다.
- 초기화 기능 등이 제공된다.


이전 교육 일에 비하면 내용이 적다.
메모로 보아 물리처리에 대한 내용만 교육된 것 같다.

2019년 7월 23일 화요일

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

92일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티에 대한 강의가 진행됐다.


강의는 교재를 이용해 진행됐다.

유니티의 tostring("F2")
- D5 = 00023 : 정수형 5자리
- F2 = xx.xx : 소수점 둘째 자리
- F3 = xx.xxx : 소수점 셋째 자리

유니티는 스크립트를 통해 제어한다.

GameObject.Find("~");
- Find 는 GameObject의 스태틱 함수
- 활성화되어있는 오브젝트만 잡힌다.

게임 오브젝트의 position(벡터)끼리 덧셈, 뺄셈이 가능하다.

GetComponent<~>()를 통해 GameObject의 컴포넌트에 접근한다.
- 단 transform은 객체의 컴포넌트로 제외된다.

스크립트도 컴포넌트를 제어할 수 있다.
C# 스크립트도 컴퍼넌트기에 GetComponent<~>() 을 통해 가져올 수 있다.


2019년 7월 19일 금요일

Unity 2D 게임 최적화

간단하게 할 수 있는 최적화 항목을 정리해 둔다.


Application.targetFrameRate 
- 특정 프레임 레이트로 렌더린 하도록 설정
- 모바일에서는 30이 기본으로 설정되어 있음 이를 60으로 설정
- Application.targetFrameRate = 60;


QualitySettings.vSyncCount
- 화면 갱신율의 절반으로 프레임률을 제한할 때 사용
- 수직 동기화를 할 경우 1로 설정
- QualitySettings.vSyncCount = 1;
- Edit > Project Setting > Quality > Other 에서 설정


글로벌 일루미네이션 설정
- lighting을 제어하는 게임이 아닌 경우 관련된 설정을 모두 Off
- https://docs.unity3d.com/kr/530/Manual/GlobalIllumination.html
- Precomputed Realtime GI, Based GI, Fog 을 모두 Off 설정


Quality Setting 
- Edit > Project Setting > Quality 에서 설정
- Simple(또는 default) 보다 높은 프로필은 모두 체크 해제
- Pixel Light Count 는 0으로 설정
 (포워드 렌더링 시 픽셀 광원의 최대 수로 2D에선 사용 않함)
Texture Quality 를 가능한 낮은 설정으로
 (모바일에서 Half Res 설정에도 큰 차이 없이 75%나 메모리를 절약)
- Anisotropic Textures 는  해제
 (설정 시 물체가 카메라의 시선에 빗각(Oblique Angle)을 이루면서
  비스듬히 보이는 경우 뭉개지는 현상의 보완 : 3D에서 발생 조건)
 (설정 시 Forced On을 쓰기를 권장하며 성능을 많이 잡아먹지는 않음)
- Anti Aliasing 사용 안함 또는 2X
- Soft Particle 해제
 (파티클을 사용하는 이펙트들이 오브젝트와 겹치는 경계를 부드럽게 바꿔주는 기능)


오브젝트 풀링 사용
- 실시간으로 많이 생성되고 파괴되는 오브젝트는 반드시 풀링으로 관리가 필요.
 (초반에 미리 생성해 메모리를 점유하고, 게임 중 더이상 생성하지 않도록 구현)
- 풀링은 게임 플레이 중 GC의 발생을 방지하기 위함
- GC는 프로그램이 메모리를 추가로 요구할 때 발생 됨.


string 사용 자제
- string msg = "aaa" + "bbb"; 의 경우 3개의 string이 메모리에 할당됨.
- 가능한 string.format()을 사용
- string msg = string.format("A is {0} and B is {1}, {0} - {1} is {2}", A, B, A - B);
 ( 사용법 : 참고1, 참고2 )


Debug.Log 삭제
- 가능하면 사용하지 않도록 처리, string과 조합시 더욱 많은 메모리 점유가 발생 됨
- define 으로 사용 유/무를 플래그해서 호출 자체가 안되도록 설정


스프라이트 아틀라스
- 2배수의 정사각형 메모리에 적재되는 이미지의 여백을 최소환
- 동시에 사용하는 이미지 묶어 호출 횟수를 최소화 시킴

스프라이트 패커(Sprite Packer)
- Window>2D>Sprite Packer 를 이용
- 아틀라스로 만들 개별 sprite의 Inspector에 Sprite Mode>PackingTag를 설정
- Sprite Packer에서 [Pack] 버튼으로 아틀라스 생성
- 설정 방법 참고 : 링크, 링크2







2019년 7월 18일 목요일

Unity Sound 설정

모바일 게임을 제작하다 보면, PC-에디터에서는 잘 나오던 게임 사운드가 핸드폰에서는 밀려 나오는 경우를 종종 겪을 수 있다.

이런 상황을 해결하기 위한 설정값을 기록해 둔다.
출처 : https://docs.unity3d.com/kr/current/Manual/class-AudioClip.html

프로젝트 세팅

Edit > Project Settings > Audio에서 DSP Buffer SizeBest latency로 설정
- Best Performance : 성능이 우선 되어 출력 시 지연이 발생할 수 있음
- Best latency : 지연이 발생하지 않는 것을 우선시하여 출력 품질이 저하될 수 있음


리소스 타입별 세팅

배경음 1
- Force To Mono : 언 체크(퀄리티에 따라 가변)
- Load In Background : 체크
- Load Type : Streaming
- Preload Audio Data : 언 체크
- Compression Format : Vobis (100%)

배경음 2
- Force To Mono : 언 체크(퀄리티에 따라 가변)
- Load In Background : 체크
- Load Type : Compressed In Memory
- Preload Audio Data : 언 체크
- Compression Format : Vobis (70%)

효과음 : 작은 크기의 빈번한 출력 
- Force To Mono : 체크
- Load In Background : 언 체크
- Load Type : Decompress On Load
- Preload Audio Data : 체크
- Compression Format :  PCM

긴 효과음(보이스) : 중간 크기의 빈번한 출력
- Force To Mono : 체크
- Load In Background : 언 체크
- Load Type : Compressed In Memory
- Preload Audio Data : 체크
- Compression Format :  ADPCM

작은 크기의 가끔 발생하는 Sound
- Force To Mono : 체크
- Load In Background : 언 체크
- Load Type : Compressed In Memory
- Preload Audio Data : 언 체크
- Compression Format :  ADPCM

중간 크기의 가끔 발생하는 Sound
- Force To Mono : 체크
- Load In Background : 언체크
- Load Type : Compressed In Memory
- Preload Audio Data : 언 체크
- Compression Format :  Vobis (70%)


개별 리소스 세팅 정보

Force To Mono(모노 강제조정)
- 스테레오를 모노로 강제 조정
- 모바일이고 최적화를 중시할 경우 설정(체크) 함

Load In Background(지연된 로딩)
- 체크 시 출력 타이밍을 엄격히 지키지 않고, 느긋하게 백그라운드에서 로드
- 따라서 배경음악일 경우 사용 FX 사운드의 경우 체크 해제


Load Type
- Decompress On Load
 실행과 동시에 압축을 해제
 작은 사이즈의 FX 사운드에 유용
 많은 메모리 점유 CPU는 적게 사용

- Compressed In Memory
 메모리에 압축 상태로 저장, 실행 시 압축을 해제하여 재생
 약간의 성능상 오버헤드를 발생시킴
 보이스 사운드 등에 사용

- Streaming
 저장소에 위치한 오디오를 실시간으로 읽어냄.
 보통 배경음악에서 사용


Preload Audio Data
- 씬이 로딩될 때 씬에서 사용하는 모든 오디오 클립을 미리 로드
- 언체크시 플레이시 로드 하기에 랙 발생 됨


Compression Format
- PCM
 최고품질 / 용량 큼 / 작은 파일 크기에 적합 / FX 사운드
 Load Type은 Decompress On Load로 하자
 즉시 재생해야 하는 매우 짧은 효과음

- ADPCM
 중간 품질 / 용량 중간
 PCM대비 3.5배의 압축비, 노이즈가 포함됨
 총격 소리와 같이 무압축에 가까운 품질 까지는 필요없지만,
 지연시간 없이 자주 반복 재생 되야 하는 경우 적절

- Vobis
 최저품질 / 용량 적음 / 배경음에 적합
 압축률 설정이 가능(보통 70%로 설정)
 지연 재생 되어도 무방한 일반적인 배경음


Unity SNS Sharing

유니티에서 게임을 SNS에 공유(share)하는 방법 중 한 개를 정리해 본다.

에셋 다운 : [URL]
샘플 : [URL]


1. 에셋을 다운로드한다. 

  • 유니티 에셋 스토어에서 "Native Share for Android & iOS" 에셋을 검색해 현재 프로젝트에 Import 한다.

2. 환경을 설정한다.

  • Assets/Plugins/Android 경로에 AndroidManifest.xml 파일이 있는지 확인한다.
  • [설치된 유니티 경로]\Editor\Data\PlaybackEngines\AndroidPlayer\Apk 폴더에서 AndroidManifest.xml 파일을 복사한다.



  • adroid:authorities 설정은 내 프로젝트의 이름으로 설정한다.
<provider
  android:name="com.yasirkula.unity.UnitySSContentProvider"
  android:authorities="MY_UNIQUE_AUTHORITY"
  android:exported="false"
  android:grantUriPermissions="true" />

3.코드로 기능을 호출 한다. 


  • GitHub의 샘플 코드를 확인해 내게 필요한 항목을 설정한다.
  • SetText 에 마켓 URL를 넣으면 간단하게 공유 기능을 구현할 수 있다.


using System.IO;

void Update()
{
 if( Input.GetMouseButtonDown( 0 ) )
  StartCoroutine( TakeSSAndShare() );
}
 
private IEnumerator TakeSSAndShare()
{
 yield return new WaitForEndOfFrame();

 Texture2D ss = new Texture2D( Screen.width, Screen.height, TextureFormat.RGB24, false );
 ss.ReadPixels( new Rect( 0, 0, Screen.width, Screen.height ), 0, 0 );
 ss.Apply();

 string filePath = Path.Combine( Application.temporaryCachePath, "shared img.png" );
 File.WriteAllBytes( filePath, ss.EncodeToPNG() );
 
 // To avoid memory leaks
 Destroy( ss );

 new NativeShare().AddFile( filePath ).SetSubject( "Subject goes here" ).SetText( "Hello world!" ).Share();

 // Share on WhatsApp only, if installed (Android only)
 //if( NativeShare.TargetExists( "com.whatsapp" ) )
 // new NativeShare().AddFile( filePath ).SetText( "Hello world!" ).SetTarget( "com.whatsapp" ).Share();
}

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

91일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티에 대한 강의가 진행됐다.


유니티 C#
- C#은 헤더 파일이 없다.
- 문자열과 문자열은 + 연산자와 += 연산자로 연결할 수 있다.
- 배열에 넣는 값은 요소, 배열의 총 개수는 요소수라고 부른다.

배열 변수명 .length 를 통해 배열의 길이를 얻을 수 있다.
C#에서는 정수끼리 나숫셈이 소숫점은 모두 버려진다.
C#에서는 멤버 함수를 메서드라고 부른다.

메서드
- 복수의 인수(매개 변수)와 1개의 반환 값을 가진다.
- 인수는 호출되는 쪽과 호출하는 쪽이 일치해야 한다.


Awake() : 객체가 생성된 직후
Start() : 첫 Update()함수 호출 직전, 초기화에 사용

C++의 " . ", " -> ", " :: " 세 가지 분류가
C#에서는 " . " 으로 통일해 사용한다.

print() = Debug.Log() 둘은 동일하다.


변수를 인스펙터에 표시하기
1. public으로 선언한다.  public int a = 0;
2. [SerializeField] 로 선언한다.  [SerializeField] public int b = 0;

Input.GetMouseButtonDown(마우스 번호)
- 0: 좌측, 1: 우측, 3: 센터(스크롤 버튼)


이처럼 유니티에 대한 강의를 진행하고, 이후 책의 예제를 실습했다.

2019년 7월 17일 수요일

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

90일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티에 대한 강의가 진행됐다.


개발하는 시간은 코딩 시간의 3배를 생각해라.
(개발, 정리, 테스트 시간으로 계획을 해야한다.)
객체 지향은 클래스를 통해 역할을 명확히 해야 된다.
클래스 사이의 관계를 논리적으로 사람이 이해하기 쉽게 만들어 준다.

Define, Enum, 구조체는 Define.h 파일로 관리
클래스를 많이 만들면 파일이 많이 생성되기에 이해도가 떨어질 수 있다.

"객체 지향의 원칙대로 많이 만들어 본 뒤에 나중에 정리하는 식으로 패턴을 이해해야 한다."


유니티
- 게임 : 촬영한 영상
- 씬 : 촬영 세트장 전체
- 프로젝트 : 소품 의상실 | 실제 폴더 브라우저와 동기화되어있다.
- 콘솔 : 스크립트에서 발생하는 내용 출력
- 인스펙터 : 정보창, Hierarchy에서 선택한 대상의 정보
- 하이어라키 : 촬영 스텝 전체

pan, 카메라 조작, 오브젝트 제어(Move, Scale, Rotate 등)에 대한 실습

Rect Tool 버튼
- 2D일 때 Rect로 사용하기 위해 편집기능을 제공하는 툴


유니티
- 컴포넌트 시스템, 구성품의 제어가 가능
- 기능을 수행하는 애들을 모듈로 만들어 장착하는 시스템
- Script, C# : monobehaviour을 상속받아 사용

C#에서의 클래스는 일반 변수로 선언할 수 없고, 포인터 선언만 사용할 수 있다.
- Temp AI; (X)  →  Temp AI = new Temp(); (O)

클래스 데이터  참조로 " . "으로 통일해 사용한다.


이처럼 유니티 엔진에 대한 강의를 시작했다.
유니티 강의는 교재를 이용해 진행한 것으로 기억된다.

게임 플레이 화면 녹화

모바일 게임 제작 후 플레이 영상의 녹화가 필요한 경우가 생긴다.

이때 핸드폰의 녹화 앱을 이용해 화면을 녹화할 경우, 해상도가 낮거나 주변 잡음이 같이 노화되는 상황이 빈번하게 발생 된다.


이러한 문제를 해결하기 위해서 다음과 같은 프로그램으로 PC에서 녹화를 진행했다.
1. OBS Studio (무료)
2. DaVinci Resolve (무료)
3. 앱 플레이어


OSB Studio는 주로 인터넷 방송을 하기 위해 사용하는 프로그램이지만 자체적으로 화면 녹화 기능을 제공한다.

DaVinci Resolve는 영상 편집 프로그램으로 무료로 사용 할 수 있다. 녹화된 영상의 간단한 편집에는 충분한 기능을 제공한다.

앱 플레이어는 녹스, 블루스택 등 다양한 프로그램이 있다. 단 전체 화면 플레이가 되는 프로그램으로 설치한다.


화면 녹화 순서

  1. 녹화용 게임의 APK 생성한다.
    (광고와 같이 녹화에 필요한 기능을 제외한 필요가 있는 경우 녹화 전용 APK를 준비)
  2. 앱 플레이어에 게임을 설치하고 전체 화면으로 전환
  3. OSB를 실행하고 화면 전체를 녹화 할 수 있도록 준비한다.
  4. OSB의 녹화 시작 후 게임을 실행해 녹화를 진행한다.
  5. DaVinci Resolve 을 실행해 파일을 등록, 필요한 편집을 진행한다. 

핸드폰 세로 영상 녹화

  1. 위 녹화 1~4단계를 진행한다. 
  2. 컴퓨터 화면을 녹화했으므로 가로 비율이 큰 영상이 녹화된다. 
  3. DaVinci Resolve 의 File>Project Settings>Master Settings 에서 Timeline resolution을 Custom 으로 변경해 영상의 Vertical 해상도로 변경 한다.
    ( 예 : 1080 x 1920 )
  4. Edit 모드에 영상을 등록해 확인한다. 
  5. 등록한 영상의 Video를 선택 → 우측 상단의 Inspector 을 선택해 메뉴를 활성화 시킨다.
  6. Transform의 Zoom X 를 조절해 영상이 화면에 맞게 조절한다.
  7. 추가적인 편집 사항이 있으면 조절한다.
  8. Deliver 모드에서 Export Video의 Resolution 의 설정을 확인한다. 
  9. 추가적인 영상 설정을 조절한 뒤 Add to Render Queue 를 통해 Render를 진행한다.

Vertical Video의 해상도 정보

  •   1080  :   1920
  •  608   :   1080 (유튜브 영상 비율)    /   607.5 : 1080 (비율)
  •  404   :    720 (유튜브 영상 비율)     /   405    : 720  (비율)


2019년 7월 15일 월요일

Unity Copying assembly from 'Temp/Assembly-CSharp.dll' to ... Error

빌드시 Copying assembly from 'Temp/Assembly-CSharp.dll' to 'Library/ScriptAssemblies/Assembly-CSharp.dll' failed 에러가 발생 되는 경우가 있다.


이것과 관련되어 다음과 같은 논의가 있었고, 100% 해결은 안된 것으로 보인다.

https://forum.unity.com/threads/solved-copying-assembly-temp-assembly-csharp-dll-failed.552682/

https://forum.unity.com/threads/copying-assembly-from-temp-dll-to-library-failed-project-stucked.669616/



Anit-Virus에서 프로젝트 폴더를 제외하라는 사람이 있었지만, 다음과 같이 파일을 삭제하는 것으로 문제가 해결되는 것으로 보인다.
, remove the file
Library/ScriptAssemblies/com.unity.multiplayer-hlapi.Runtime.dll
and now build works again, once only. The file-removal procedure has to be repeated for every build

https://forum.unity.com/threads/error-copying-assembly-from-temp-com-unity-multiplayer-hlapi-runtime-dll-to-library-scriptassembl.662371/#post-4659752
단, 이 해결은 Unet을 사용하지 않는 상태여야 되는 것 같다.

Unet : 유니티가 제공하는 Unity Networking

GooglePlay Consol 기본 언어 변경

스토어에 등록된 게임(앱)의 기본 언어를 변경

출시 시점의 게임 스토어 정보가 한글, 영어로 작성되어 있다.
그런데 한글이 기본언어로 설정되어 있을 때 이를 영어로 변경하는 방법은 아래와 같다.


애플리케이션 > 앱 정보 > 스토어 등록 정보 > [번역 관리] 메뉴 선택
[기본 언어 변경] 메뉴 선택
원하는 언어를 기본으로 설정한 뒤 업데이트를 제출한다.


GooglePlay Consol 스토어 등록 정보 > 그래픽 이미지

GooglePlay Consol에 등록하는 "앱 정보" 중 [스토어 등록 정보] > [그래픽 이미지] 항목이 있다.

그래픽 이미지는 1024 X 500 크기의 jpg , png 파일을 설정 할 수 있다.
업로드한 이 파일은 출시한 게임의 링크 공유시(sns, 메신저 등) 페이지 정보의 섬네일 형태로 표시하는데 사용 된다.



2019년 7월 14일 일요일

국비 교육 : 게임 프로그래밍 087 ~ 089일 | C++ 고급, 학습 방법

87일부터 89일까지의 교육 내용을 되돌아본다.


3일간 C++의 고급 내용과 학습해야 하는 내용, 방법론에 대한 설명이 진행되었다.

교육 내용 단위로 요약을 작성하다 보니 3일에 대한 내용을 묶어보았는데, 요약할 내용이 별로 없다.


하루는
C++ 고급 내용으로 함수 포인터, 람다식에 대한 내용을 하루에 걸쳐 소개를 하였다.

그리고 하루는
Vector Class를 포트폴리오로 구현하는데 필요한 항목에 대한 설명이 진행되었다.
(예제 프로젝트 파일이 없는 것으로 보아 순수 기능 설명만 진행된 것 같다.)

그리고 마지막 하루는
프로그래밍 학습 방법에 대한 설명이 진행된 것 같다.


갑자기 3일간의 교육으로 왜 이런 강의가 진행되었는지는 교육한 지가 오래돼서 기억에 없고, 메모로 작성된 내용도 없어서 모르겠다.


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

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

89일 차 교육 내용 메모를 옮겨 본다.
게임 프로그래밍 학습 방법에 대한 강의가 진행됐다.


객체지향 공부하는 법
- 디자인 패턴을 공부한다. 이후 구현된 기능(윈도우 기능 등~)을 베껴서 구현해 본다.

그래프(트리)
- 트리가 어떤 노드를 가리킬 수 있도록 하면 된다.
- 노드 : 자료를 담는다.
- 호(arc) : 노드와 노드를 연결하는 선


디자인패턴
- 무슨(what) 목적으로 왜(why) 이런 식(how)의 패턴이 필요하게 되었는가?


이와 같은 이야기와 설명으로 강의가 진행됐다.

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

88일 차 교육 내용 메모를 옮겨 본다.
C++ 추가 내용에 대한 강의가 진행됐다.


C++을 이용한 벡터 클래스를 이용한 포트폴리오 정도는 1개 있으면 좋다.
- 매트릭스와의 연산까지를 포트폴리오에 담음
- 3D 그래픽스에 대한 뉘앙스를 보여줄 수 있음

클래스 내에 연관된 다른 클래스를 저장할 수 있도록 변수를 준비해 둔다.
class Map
{
    Player* m_viewer;
    {
        Player* GetViewer();
        void SetViewer()
        {
        }
    }
}

벡터 간 연산
- 덧셈 V₁ + V₂
- 뺄셈 V₁ - V₂
- 곱셈 V₁ * V₂
- 나눗셈 V₁ / V₂

벡터와 행렬

함수를 이용한 벡터 연상
- 길이
- 노말(단위벡터, 크기 1)
- 내적 Dot
- 외적 Cross


벡터는 위치 개념이 없다, 크기와 방향만 가지고 있다.
크기, 회전, 이동을 모두 담기 위해 4X4 행렬이 필요해진다.
그래서 x, y, z, w 로 설정이 필요하다.


메모로 보아 C++을 이용한 벡터 클래스에 대한 설명이 있었다.
포트폴리오 제작에 관한 이야기가 나와서 갑자기 이전에 교육된 DirectX와 연관하여 Vector 클래스를 제작해 두어 포트폴리오로 활용하는 이야기가 오간 것 같은데, 갑자기 왜 이런 강의가 진행됐는지는 기억에 없다.

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

87일 차 교육 내용 메모를 옮겨 본다.
C++ 추가 내용에 대한 강의가 진행됐다.


앞으로 최소한 공부해 두어야 할 것
- FSM, 싱글톤 매니저, 스마트 포인터, 버텍스 버퍼 클래스, 람다


람다
- 함수 포인터 → 펑셔널 → 람다


함수 포인터

int (*FuncA) (int, int)
- 반환 값이 int인 그 주소 값에 위치한 것이 함수명을 저장하는 변수가 FuncA다.
- (*FuncA)는 함수가 아니라 변수명이다.

int* FuncB(int, int)
- 반환 값이 int 포인터다.

- 함수 포인터는 다른 함수에 미리 선언해 둘 수 있다.
- 함수 외부에서 함수 내부의 규칙을 만들 수 있다.
- 함수 포인터는 C#의 델리 게이트와 비슷하다.
- 함수 포인터는 설계에서나 사용하는 단계의 문법, 함수 포인터 + 라이브러리


펑셔널
- 템플릿을 이용해 함수처럼 사용할 수 있는 클래스
- C++에서 제공하는 함수 포인터를 함수 포인터로 쓸 수 있도록 만들어진 클래스


함수 = 반복해 기능을 사용
- 함수 포인터, 펑셔널은 함수의 정의에서 약간 벗어난다.


람다 = 즉석 제작 함수 = 무명함수
- 함수명 없이 무형의 제작 함수식.
- 펑셔널을 이용한 문법식
- 람다식은 함수 중간에 선언해 사용한다.
- 선언된 함수 내 지역 변수를 가져다 쓸 수 있다.

- 람다의 최소형 : auto FuncA = [ ] ( ) { };
- FuncA(); 로 사용해야 된다.

- 람다는 일반함수보다 느리다.
- 가상 함수 급으로 느리다.
- 발생시킬 자와 받을 대상에 대한 설계가 중요하다.


이처럼 C++에 대한 추가 내용 강의가 진행됐다.

2019년 7월 12일 금요일

구글/애플 피처드 신청 경로

피쳐드(Featured)
- 구글 스토어 또는 앱 스토어의 선택으로 첫 페이지(마켓 페이지)에 표시되는 것.

구글 - 인디 게임
구글 - 일반 게임

애플 - 일반 게임


Unity Notch(노치) 단말기 UI 설정

상단의 프레임 아래쪽으로 툭 튀어나와 있는 H/W 영역인 Notch의 처리를 위해 체크해야 하는 항목을 정리해 둔다.

빌드 세팅

Player Setting > Android > Resolution and Presentation 내부 설정 확인
- Render outside safe area의 항목이 체크되어 있는지 확인(기본값은 OFF)


Screen.safeArea 

SafeArea API(Unity 2017.2p3 이상)는 실행되고 있는 디바이스의 SafeArea 즉, 안전한 영역의 크기를 Rect 타입으로 반환하며, 이를 이용해 UI의 Rect와 Anchor의 조절이 필요

using UnityEngine;

public class SafeArea : MonoBehaviour
{
    RectTransform Panel;
    Rect LastSafeArea = new Rect(0, 0, 0, 0);

    public Text message;

    void Awake()
    {
        Panel = GetComponent();
        Refresh();
    }

    void Update()
    {
        Refresh();
    }

    void Refresh()
    {
        Rect safeArea = GetSafeArea();

        if (safeArea != LastSafeArea)
            ApplySafeArea(safeArea);
    }

    Rect GetSafeArea()
    {
        return Screen.safeArea;
    }

    void ApplySafeArea(Rect r)
    {
        LastSafeArea = r;

        Vector2 anchorMin = r.position;
        Vector2 anchorMax = r.position + r.size;
        anchorMin.x /= Screen.width;
        anchorMin.y /= Screen.height;
        anchorMax.x /= Screen.width;
        anchorMax.y /= Screen.height;
        Panel.anchorMin = anchorMin;
        Panel.anchorMax = anchorMax;
    }
}

출처 : stackoverflow | unity-to-ios-notch-and-safe-are-problems

2019년 7월 11일 목요일

Unity Analytics 설정

게임 분석을 위해 Unity Analytics를 적용 하는 방법을 정리해 둔다.
(각 Analytics 항목에 대한 상세한 설명은 유니티 공식 매뉴얼을 참고)

1. 프로젝트에서 설정하기

  • Unity의 Window>General>Services 으로 메뉴 열기
  • Create a Unity Project ID 로 애널리틱스를 이용한 서비스 프로젝트 생성하기
    (계정 연결하고 [Create] 버튼 선택)

2. Analytics 서비스 켜기

  • 표시되는 Services 메뉴 중 Analytics 의 [OFF] 버튼을 클릭해 [ON]으로 변경
  • Analytics 서비스 페이지의 Discover player insights 를 [ON]으로 변경
  • "이 앱이 13세 미만의 아이들을 대상으로 하는 것인지 확인" 설정

3. Analytics 서비스 연결

  • Play 버튼을 눌러 실행
  • 연동이 완료되면 Services의 Analytics 페이지가 갱신됨
  • 페이지가 갱신 되지 않으면 Services 화면의 우측 상단 메뉴 중 [Reload] 를 선택해 화면을 갱신 하거나 Services 화면 메인으로 이동해 다시 Analytics 페이지로 열어서 재 확인을 함

4. Analytics 서비스 정보

  • Services > analytics 항목의 Validator 정보
  • 발생 되는 이벤트 정보 로그를 표시
  • 설정하자마자 항상 즉시 표시되는 것은 아님(동기화 시간이 필요할 수 있음)

5. 커스텀 이벤트

  • 원하는 시점에 "Tag"로 등록한 값을 Analytics에 보낼 수 있음
  • 코드 예제

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Analytics;

public class AnalyticsManager : MonoBehaviour
{

    #region Singlton선언
    private static AnalyticsManager m_instance = null;

    public static AnalyticsManager Instance
    {
        get
        {
            return m_instance;
        }
    }

    void Awake()
    {
        // 동일한게 있으면 파괴
        if(m_instance)
        {
            Destroy(gameObject);
            return;
        }

        //유효한 인스턴스 생성 및 삭제 방지 처리
        m_instance = this;
        DontDestroyOnLoad(gameObject);
    }
    #endregion

    bool gameLoop = false;

    // 어플리케이션을 종료하는 순간에 처리할 행동들
    private void OnApplicationQuit()
    {
        gameLoop = true;
        Analytics.CustomEvent("App Quit", new Dictionary
        {
            {"Leaderboard Up Load Count", GPGSIntegration.loginSuccessCount },
            {"Best Score",  GPGSIntegration.bestScoreValueText},
            {"Loop Flag", gameLoop }
        });

    }

    int clickCount = 0;

    public void AnalyticsButtonClick()
    {
        clickCount++;

        Analytics.CustomEvent("App Quit", new Dictionary
        {
            {"Version", Application.version },
            {"Best Score",  GPGSIntegration.bestScoreValueText},
            {"Loop Flag", gameLoop },
            {"Button Click Count" ,  clickCount}

        });
    }

    public void ButtonAddCount()
    {
        clickCount++;
    }

}

6. 13세 미만 대상 앱

  • 미국에서는 13세 미만의 아동을 대상으로 하는 웹사이트, 앱, 서비스를 사용하도록 허용하기 위해서 아동 온라인 개인정보 보호법(COPPA: the Children’s Online Privacy and Protection Act)을 준수 해야 됨
  • 게임이 이 카테고리에 부합한다면 연련 제한을 “under 13”로 설정 하십시요. 유니티애즈와 유니티애널리틱스에서 수집하는 데이터의 제약이 생기긴 하지만 그래도 동작은 이상 없이함

7. 퍼널(Funnel) 등록


2019년 7월 9일 화요일

국비 교육 : 게임 프로그래밍 083 ~ 086일 | DirectX

83일부터 86일까지의 교육 내용을 되돌아본다.


4일간 PPT 문서와 샘플 프로젝트를 이용해 DirectX 강의가 진행되었다.
강사의 PPT 문서에 작성된 그래픽스 파이프라인에 대한 개념부터 DirectX 11 모식도, 고정 기능 파이프라인, 프로그래머블 파이프라인을 처리하는 방식에 관해 설명되었다.


강의는 PPT 문서로 개념을 설명하고, 만들어져있는 예제 프로젝트를 통해 구현을 설명하는 방식으로 진행됐다.

예제 프로젝트로는 DirectX 초기화부터 삼각형 그리기, 좌표 정보, 버텍스 설정, 카메라 설정, 큐브 그리기 등으로 진행되었다. 강의 진행에 사용한 예제들은 MSDN에서 제공하는 "Direct3D Tutorial Win32 Sample" 리소스를 이용했다.


내용과 기간을 보았을 때 대부분 자습을 통해 문제를 해결하는 방식으로 교육이 진행 됐던 것 같다. 그리고 예제 프로젝트도 일회성 풀이로 코드들의 설명이 끝났고 바로 다음 진도로 진행됐던 것 같다.


강의 구성은 PPT로 DirectX와 관련된 개념을 설명, 연결되는 샘플 프로젝트 코드를 보며 구현에 사용된 기술을 설명한 뒤 실습해 보기 형식으로 진행된 것 같다. 작성된 메모 내용도 적고, 직접 작성한 실습 코드도 애매해 정확히 기억은 안 난다.


단 내용과 기간으로 되짚어 생각해 보았을 때 DirectX 역시 교육생 개인 자습에 치중된 교육이었던 것 같다.


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

2019년 7월 8일 월요일

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

86일 차 교육 내용 메모를 옮겨 본다.
PT 문서를 가지고 DirectX 강의가 진행됐다.


DX는 다음과 같은 연산 순서를 가진다.
스케일 → 자전(중심축) → 이동(축의 위치) → 공전(중심점 기준회전) → 평행이동

공전 : 이동을 하고 돌리면
자전 : 이동을 안 하면

버퍼, 행렬정보를 가지고 있어야 그리(Draw)고 움직일 수 있다.

행렬, SSE, 사원 수


이와 같은 내용으로 강의 내용이 메모되어 있다.

2019년 7월 7일 일요일

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

85일 차 교육 내용 메모를 옮겨 본다.
PT 문서를 가지고 DirectX 강의가 진행됐다.


컴객체 : DX는 포인터 클래스만 생성할 수 있다.
*.fx / *.hlsl 두 파일은 컴파일에서 제외해야 한다.

뷰 스페이스에서 트라이앵글을 어떻게 그리냐.

Front Face Triangle
- 정면 : 시계 방향으로 세 점을 찍어 삼각형을 그림
- 후면 : 반 시계 방향으로 세 점을 찍어 삼각형을 그림

후면 추려내기

ccw : 반시계방향으로 그려진 폴리곤을 제거


이와 같은 내용으로 DirectX에 대한 강의가 진행됐다.

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

84일 차 교육 내용 메모를 옮겨 본다.
DirectX 강의가 진행됐다.


그래픽 파이프라인에 대한 설명이 이루어졌다.

쉐이더에 대한 이야기
- 전반 과정이 소개되었다.
- DX 예제 사이트로 설명됐다.


아마도 그래픽 파이프라인에 대한 설명이 주로 이루어진 것 같다.

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

83일 차 교육 내용 메모를 옮겨 본다.
강사의 PT 문서를 이용해 DirectX 강의가 진행되었다.


윈도우 SDK에 포함된 DirectX SDK
- 구형 DX : 7 ~ 9.0c, 10,11
- 신형 DX : 11, 12
- DX 11이 구형과 신형의 양측 내용을 다 반영하고 있다.
- DX 12는 윈도우 10부터 지원한다.
- x, y, z : 높이는 y, 깊이는 z 축을 이용

이후 코드를 실습하는 시간을 가진 것으로 생각된다.


별도의 교재 없이 강사가 정리해둔 DirectX에 대한 PT 문서로 강의가 진행됐다.

2019년 7월 6일 토요일

국비 교육 : 게임 프로그래밍 079 ~ 082일 | 언리얼

79일부터 82일까지의 교육 내용을 되돌아본다.


언리얼 개발 도서를 이용해 강의가 진행되었다.
언리얼 툴의 설치, 사용법에 대한 강의가 진행되었으며, 코딩을 대체할 수 있는 블루프린트에 대한 강의가 진행됐다.

도서가 프로그래머를 중심으로 한 내용이 아니라서 코딩보다는 툴 학습에 가까운 교육이 진행되었고, 블루프린트에 대한 강의도 도서 내용을 중심으로 한 것이 아니라 별도 PT로 간단하게 교육되었다.

메모 내용을 보아서는 언리얼 스크립트를 통한 엔진제어 단계까지는 진행을 안 한 것으로 생각된다.

교육에 사용된 도서가 600쪽이 넘는 책이었는데 4일간의 교육과 다음 날짜의 메모로 보아 이후 언리얼에 대한 교육은 개인별 자율학습으로 진행된 것 같다. 정확한 기억은 안 나지만 교육생이 알아서 공부하고 궁금한 내용이 있으면 나중에 질문하는 방식이었을 것 같다.


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

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

82일 차 교육 내용 메모를 옮겨 본다.
교재를 이용해 언리얼 교육이 진행됐다.


블루프린트에 대한 강의를 별도 PT문서로 진행했다.


별다른 추가 내용이 없는 것으로 보아 언리얼 교육만 진행된 것 같다.

2019년 7월 5일 금요일

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

81일 차 교육 내용 메모를 옮겨 본다.
교재를 이용해 언리얼 교육이 진행됐다.


레이히트
- 물체를 찍는 방법에 대한 알고리즘
- 반직선(한쪽으로만 뻗는 선)에서 충돌하는 객체
- 원근법으로 계산된 3차원 공간의 지정 대상 찾기

래그돌
- 봉제 인형
- 물체화된 개체에 물리적 외력에 의해 동작을 하게 됨

z-buffer
- z거리값을 보관하는 기억장치
- z충돌의 회피 방법의 학습이 필요
 (겹치지 않게 하거나, 동일 깊이를 사용하지 않는다.)


이상과 같이 언리얼 교재를 이용한 강의가 진행된 것 같다.

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

80일 차 교육 내용 메모를 옮겨 본다.
교재를 이용해 언리얼 교육이 진행됐다.


지오메트리
- 버텍스 단위로 매시를 편집함
- 지오메트리 편집 시 좌표계가 월드가 아닌 로컬로 강제 변경된다.

언리얼의 포인트 라이트는 3개까지만 겹칠 수 있고, 4개부터는 경고를 띄우게 된다.



- 난 반사광 : 들어오는 빛의 입사각과 관계없는 난 반사광
- 정 반사광 : 들어오는 빛의 입사각에 반되되는 정방사각의 광
- 환경광 : 간접광 (다른 물체에 반사되어 튕긴 빛이 물체에 비치는 광)


에디터 상의 언리얼 Light 계산은 100% 실시간으로 이루어지지는 않는다.
(빌드→라이팅 빌드를 이용해 정보를 갱신할 수 있다.)
[창]→[월드세팅]→lightmass→environment color을 세팅해(0.4, 0.4, 0.4) 레벨 내 기본적인 밝기를 세팅해줄 수 있다.


FBX : 3D 확장자의 이름(Autodesk사 포맷)
매시 : 물체의 최소 단위
스태틱 매시 : 정적 물체, 일반적인 물체
스켈레탈 매시 : 애니메이션이 필요한 모델, 뼈대가 들어가 있는 물체
콜리전, 콜리더 : 충돌박스, 충돌 전용 영역
머터리얼, 메터리얼 : 재질, 3D모형에 적용할 텍스쳐의 다양한 속성


언리얼은 "콘텐츠 브라우져"에 에셋 데이터 추가 후 "저장"이라는 단계를 거쳐야 한다.
(개체별 우클릭 저장/콘텐츠 브라우져의 모두 저장...)

언리얼 콘텐츠 브라우져의 데이터는 운영체제의 탐색기와 동일한 구조이다.
하지만 파일의 이동, 삭제, 수정, 복사 등의 컨트롤은 언리얼 에디터를 통해 진행해야 오류가 없이 관리할 수 있다.


교재를 기준으로 언리얼 강의가 진행 되었다.

2019년 7월 4일 목요일

unity 스크립트 라이프 사이클 플로우차트


awake() → start() 등의 unity 에서의 정의된 로드 순서
Order of Execution for Event Functions


실행 : Rest() → Awake() → OnEnable() → Start() → 
반복 : FixedUpdate() → OnTriggerXXX() → OnCollisionXXX() → Update() → LateUpdate() → 
종료 : OnDisable() → OnDestroy() → OnApplicationQuit()


Unity cr_VariationsUtils app_webview error

AdMob의 Banner 광고를 설정한 이후 일부 기기에서 cr_VariationsUtils Tag의 에러가 발생 되었으며 아래와 같은 app_webview와 연관성이 의심되는 로그가 발생 되었다.

07-04 05:40:30.955: E/cr_VariationsUtils(7201): Failed reading seed file "/data/user/0/com.Company.ProductName/app_webview/variations_seed": /data/user/0/com.Company.ProductName/app_webview/variations_seed (No such file or directory)

이 경우, Banner를 요청하는 시점을 Awake()에 두어 Scene의 Initialization 직후 LoadBanner를 호출하면서 문제가 발생하는 것이였다. 

요청 시점을 Start()로 변경한 뒤 테스트를 하니 발생하던 에러는 사라졌다. 

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

79일 차 교육 내용 메모를 옮겨 본다.
교재를 이용해 언리얼 교육이 진행됐다.


차원 : 특이점을 구분하기 위한 필요 정보의 개수

1차원 : 점  선상의 1개의 점
2차원 : 선  면상의 선
3차원 : 면  공간에서의 면
4차원 : 시간 (x, y, z, t)


데카르트 좌표계
- x, z 평면의 y 높이

오일러 앵글
- x, y, z 축을 이용해 회전
- 축을 이용한 회전 정보 표현법

오일러각
- 축이 겹칠때 같은 평면상에 놓이게 되고 이때 축이 사라지는 현상
- 짐벌락 : (x, y, z)의 2번 축(y)이 90º면 3번 축(z)이 1번 축(x)과 겹치는 현상

짐벌락 해결을 위해 y, x, z 순으로 각 회전을 계산해 현상을 최소화한다.
(가장 잘 안 쓰는 축을 2번으로 둔다.)


허수
- 제곱했을 시 값이 되는 수, 자연계 존재하지 않는 수

3차원의 정보와 허수를 이용해 회전 값을 계산하는 방식
- 사원수 회전, 쿼터니언


3D 용어 정리
- 버텍스 : 정보를 포함한 점(x, y, z, 색상, 가중치 등)
 (포인트 : x, y, z 위치값)
- 폴리곤 : 버텍스 3개가 모인것, 면의 최소 단위
- 매쉬 : 물체의 최소 단위
- 텍스쳐 : 이미지, 매핑용 이미지
 (스프라이트 : 랜더, 그리기 용도의 이미지)
- 매핑 : 버텍스의 UV좌표에 대응되는 텍스쳐
- 요 : z축 회전
- 피치 : y축 회전
- 롤 : x축 회전


언리얼
- 레벨 개념 = 유니티의 scene 개념
- 좌측의 "모드" 패널에 유용한 기능이 모여있다.
- 기본은 배치모드이며, 칠하기, 랜드스케이프 등의 메뉴가 존재한다.
- 레벨 내 모든 객체(오브젝트)는 액터라 명칭 한다.
- F키는 언리얼이나 유니티나 모두 유용하다. (선택 오브젝트 포커싱)
- 그레이박스 : 직육면체, 원기둥과 같은 간단한 메시데이터를 이용한 레벨 데이터


교재의 내용을 기준으로 3D와 언리얼 엔진에 대한 강의가 진행 됐다.

2019년 7월 3일 수요일

Unity 스토어 열기 & 웹페이지 열기

웹 페이지 열기

Application.OpenURL("https://play.google.com/store/apps/details?id=com.Company.ProductName");

구글 플레이 스토어

Application.OpenURL("market://details?id=com.Company.ProductName");
           market://details?id=패키지명

애플 앱 스토어

Application.OpenURL("itms-apps://itunes.apple.com/app/id0123456789")

2019년 7월 2일 화요일

국비 교육 : 게임 프로그래밍 075 ~ 078일 | 인공지능(AI)

75일부터 78일까지의 교육 내용을 되돌아본다.


윈도우 프로그래밍 환경에서 인공지능에 대한 강의가 이루어졌다.

인공지능의 구현 방식을 소개했다.
- FSM (Finite State Machines)
- HFSM (Hierarchical Finite State Machines)
- BT (Behaviour Tree)

각 인공지능 구현방식에 대한 구현 방식 및 장/단점에 관해서 설명이 됐다.


이 중 FSM의 구현에 중점을 두어 교육이 진행되었다.
- switch 방식과 클래스 포인터 방식 두 가지에 대한 구현방식에 관해 설명 됐다.


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

2019년 7월 1일 월요일

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

78일 차 교육 내용 메모를 옮겨 본다.
FSM의 구현을 진행했다.


몬스터의 상태 4가지를 FSM으로 구현해 보았다.
- 대기 : 현재 위치에서 이동하지 않고 대기한다. 일정 거리 내 플레이어가 접근하면 추적을 한다.
- 추적 : 캐릭터의 위치로 이동한다. 대기 위치에서 거리가 멀어지면 회귀하고, 플레이어와 가까워지면 공격한다.
- 공격 : 캐릭터를 공격해 HP 수치를 감소시킨다.
- 회귀 : 대기 위치에서 일정 거리 멀어지면 대기 위치로 이동한다.

각각의 상태 구현 시 정보를 확인할 수 있도록 화면에 표시하였다.


간단한 몬스터의 AI를 구현해 보았다.
여기까지로 윈도우 프로그래밍을 이용한 인공지능(AI)에 대한 과정이 끝난 것으로 생각된다.

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

77일 차 교육 내용 메모를 옮겨 본다.
인공지능에 대한 강의가 진행된 것 같다.


상태 패턴을 Switch로 변화하는 방법으로 예제 프로젝트를 구현해 본 것 같다.


그 외 별도의 메모나 작성한 프로젝트 코드가 보이지 않는다.
아마도 수업 시간에 FSM을 계속 구현해 본 것으로 생각된다.

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

76일 차 교육 내용 메모를 옮겨 본다.
인공지능에 대한 강의가 진행된 것 같다.


FSM
- 상태 클래스가 있다. → 영향을 주는 함수가 들어가 있다.
- Player 영향을 주어 Player을 제어한다.

클래스의 스태틱 멤버 변수
- 클래스에 속하는 단 하나의 변수이다.
- 클래스 내부에서 초기화 시 에러가 난다.
- 클래스 외부에서 전역 변수처럼 초기화해야 한다.
- 정적 변수(스태틱 변수)의 접근은 클래스 명으로 접근이 가능하다.

전적 변수의 활용목적은 인스턴트 간의 공유할 변수를 만들고자 하는 것

스태틱 함수는 인스턴스에 속하는 멤버 함수가 아니라 클래스에 속하는 하나의 함수이다.
- 정적 함수 내부에서는 오직 정적 변수만을 사용할 수 있으며 함수도 정적 함수만을 호출 할 수 있다.
- 스태틱 함수 내에서는 This 포인터를 사용할 수 없다.


FSM 구현 및 구현에 사용되는 스태틱 멤버 변수와 스태틱 함수에 대해 교육됐다.
예제 프로젝트를 진행한 것으로 생각된다.

Unity - Firebase 연동 (Analytics, AdMob)

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