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







Unity - Firebase 연동 (Analytics, AdMob)

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