2019년 9월 23일 월요일

Unity - Firebase 연동 (Analytics, AdMob)

버전 : firebase_unity_sdk_6.5.0.zip

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

유니티에 Firebase를 연결하는 정보는 다음 사이트에 정리되어 있다.
https://firebase.google.com/docs/unity/setup?hl=ko#available_libraries
- ADmob 연동은 별도의 unitypackage 설치 없이 웹 연결을 통해 진행 된다.


1. Firebase 패키지 추가

1-1. 프로젝트 생성

  • 홈페이지 접속
  • [프로젝트 만들기] 버튼을 선택해 생성 시도
  • 생성되어 있는 프로젝트 중 연동에 필요한 프로젝트 선택
  • 약관 선택 후 [계속]
  • "Google 애널리틱스" 사용 설정은 On 으로 지정
    - 애널리틱스 위치 : 대한 민국
    - 약관 설정
  • [계속] 버튼을 선택하면 프로젝트가 생성 됨

1-2. 앱을 추가하여 시작

  • 좌측 [Project Overview] 선택 해 Home 으로 이동
  • 유니티 아이콘을 선택해 "앱을 추가하여 시작" 진행
  • Unity 앱에 Firebase 추가 시작
    - iOS와 Android 동시 출시의 경우 둘다 등록 해야 됨
    - Register as Android app 체크
    - 패키지 이름 : 설정한 패키지 이름 작성
    - 앱 닉네임 : 게임 이름 작성
  • [다음] 버튼으로 설정 이동

1-3. 구성파일 다운로드

  • google-services.json 파일을 다운로드
  • 다운로드 한 파일을 unity 프로젝트 Asset폴더 Root로 이동
    (Assets 폴더 내의 원하는 위치에 Firebase 구성 파일을 배치 가능)
  • [다음] 버튼으로 설정 이동

1-4. Firebase SDK 추가

  • 유니티 패키지를 다운받음
  • firebase_unity_sdk_6.5.0.zip 버젼을 다운로드하여 진행
  • [다음] 버튼으로 설정 이동

1-5. 완료 단계

  • 설정이 완료 됨.
  • "콘솔로 이동" 을 선택해 설정을 종료

1-6. Project Overview 정보 

  • 페이지의 앱 설정에서 등록된 앱 정보가 유니티가 아닌 안드로이드로 표시 된다. 
  • 정보를 확인 하면 통신을 대기 하는 상태가 표시 된다.
  • 이 표시는 Analytics SDK를 추가해 빌드를 한 뒤 실행을 한 번 해야 처리 된다.
  • 정상 처리 시 - "앱에 Firebase를 추가했습니다." 라고 표시된다.
  • 우선은 현 상태로 유지하고 아래 항목을 진행 한다.

1-7. SHA-1 인증서(번외, 필요시)

  • 안드로이드 앱 등록 시 SHA-1 디버그 인증서를 요구 한다. 
  • 디버그는 인증서는 debug.keystore 파일을 의미하고, 보통 C:\Users\user\.android 폴더에 위치한다. 
  • 명령어 프롬프트를 이용해 자바가 설치된 bin 폴더로 이동 
  • keytool -exportcert -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore 명령어를 입력하면 값을 얻을 수 있다.
    (디버그에는 password가 없으므로 Enter 키 입력)
  • 실제 SHA 인증서 지문 = GooglePlayConsole에서 업로드 증명서의 SHA-1 값을 사용 하면 된다. 


2. 사전 준비

2-1. 데이터 준비

  • SDK 다운로드 : URL
  • 유니티의 .Net 버전을 4.x 로 설정
  • 다운로드한 SDK에서 dotnet4 폴더 unitypackage 를 확인
  • 애널리틱스를 사용하기 위해 FirebaseAnalytics.unitypackage 파일 저장

2-2. Unity 프로젝트에 Firebase 추가

  • 정보 : https://firebase.google.com/docs/unity/setup?hl=ko
  • 1~4단계는 진행한 "Firebase 패키지 추가"와 동일한 내용
  • 5단계 부터 진행한다.
  • FirebaseAnalytics.unitypackage 파일 import 진행
    (무언가 확인 윈도우가 뜰 때 yes 했음)

2-3. Google Play 서비스 버전 요구사항 확인

        Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
            var dependencyStatus = task.Result;
            if (dependencyStatus == Firebase.DependencyStatus.Available)
            {
                // Create and hold a reference to your FirebaseApp, 
                // FirebaseApp에 대한 참조를 작성하고 유지하십시오.
                // where app is a Firebase.FirebaseApp property of your application class.
                // 여기서 app은 애플리케이션 클래스의 Firebase.FirebaseApp 속성입니다.

                //   app = Firebase.FirebaseApp.DefaultInstance;

                // Set a flag here to indicate whether Firebase is ready to use by your app.
                // Firebase를 앱에서 사용할 준비가되었는지 표시하려면 여기에 플래그를 설정하십시오.
                Debug.Log("Firebase 초기화 완료");
            }
            else
            {
                UnityEngine.Debug.LogError(System.String.Format(
                  "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
                // Firebase Unity SDK is not safe to use here.
            }
        });
  • 앱 시작 시 AnalyticsManager를 생성하고 "Start()" 에 코드 추가


3. Analytics 추가

3-1. 유니티 설정

  • 이벤트 로그 등에 대한 내용 작성이 필요
  • >>>작성중<<<


4. ADMob 연동

4-1. 연동 방법

  • Firebase 페이지 이동
  • 연결하려는 프로젝트를 선택해 페이지 이동
  • 좌측 상단의 Project Overview 우측에 있는 "톱니바퀴"(설정) 버튼 선택
  • 프로젝트 Settings 화면에서 [통합] 페이지를 선택
  • ADmob 의 앱 설정에 firebase 연결 버튼이 없다.
    (현재 위 설정을 적용 못하고 있음)



2019년 9월 19일 목요일

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

131일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업을 진행했다.


싱글턴을 이용한 매니저 제작
- 데이터 관리를 위한 table loader
- Scene 이동을 위한 Scene controller


이전과 마찬가지로 교육 시간에 포트폴리오 작업을 진행한 것 같다.
메모 내용으로 보아 관리 클래스를 제작한 것으로 보인다.

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

130일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업을 진행했다.


네비매쉬 에이젼트의 SetDestination은 한번 지정하면 지정된 이동 값으로 목표 지점까지 이동한다.
즉 apdote에 넣을 필요가 없다. 1회 입력 시 저장해두고 이동

네비매쉬 에이젼트를 isStopped = false / true 로 끄고 켤 수 있다.


교육 시간에 포트폴리오 작업을 진행한 것 같다.
메모 내용으로 보아 네비매쉬를 이용한 Monster 이동 처리 작업을 진행한 것 같다.

2019년 9월 18일 수요일

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

129일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업이 진행됐다.


UI 정보 출력
- 몬스터 머리 위 UI 띄우기
- 월드 좌표를 이용해 UI Scale 되도록 캔버스를 구성해 화면에 띄운다.


메모 내용으로 보아 별도의 교육 없이 VR 포트폴리오 작업을 진행한 것 같다.
UI를 이용해 몬스터 이름 생성하기 기능을 구현한 것 같다.

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

128일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업이 진행됐다.


포트폴리오 작업
- 피격 시 처리, 공격 행동 등에 대한 개인 작업 진행.


이외 작성된 교육과 관련된 메모는 없는 것으로 보아서, 온종일 포트폴리오 작업을 진행한 하루였던 것 같다.

2019년 9월 17일 화요일

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

127일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티의 오디오 믹서에 대한 내용이 메모로 작성되어 있다.


오디오 믹서의 FindMatchingGroups(" ~ ");
- " ~ "에 작성된 오디오 그룹의 본체 및 하위를 배열화한다.
- ~ 에는 group의 name이 작성되며, 작성된 group을 기준으로 하위 그룹을 배열로 만드는 식이다.

사운드 믹서에서의 변수 등록을 주의하자


ToString("0,##"); 형태로 표시되는 정보를 제어할 수 있다.


이처럼 사운드 믹서에 대한 짧은 내용과 String 처리에 대한 내용이 메모로 작성되어 있었다.
별도로 작성된 Sample 프로젝트도 없는 것으로 보아 남은 시간 VR 포트폴리오를 진행하지 않았나 싶다.

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

126일 차 교육 내용 메모를 옮겨 본다.
교육은 했지만, 작성된 메모 내용이 없다.


아마도 VR 포트폴리오 작업을 진행했을 것 같다.

메모와 샘플 프로젝트가 없는 것으로 보아 각자 포트폴리오를 작업하는 것으로 교육을 진행한 것으로 생각된다.


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

125일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업이 진행됐다.


바라보는 방향으로 회전하며 이동

    float vertical = Input.GetAxisRaw("Vertical");
    float horizontal = Input.GetAxisRaw("Horizontal ");

    vector3 lookDir = vertical * Vector3.forward + horizontal * Vector3.right;

    this.transform.rotation = Quaternion.LookRotation(lookDir);
    this.transform.Translate(Vector3.forward * moveSpeed * Time.Deltatime);


메모로 보아 VR 포트폴리오를 진행하면서 필요한 기능에 대해서 강사가 설명한 내용이 작성되어 있었던 것 같다.

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

124일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업이 진행됐다.


유니티의 모든 class는 포인터로 작동한다.
주소, 값, 참조이기에 잘못 작동 시 에러가 발생할 수 있다.
항시 new로 생성하고 해제 null을 습관화해야 한다.

DataMNG myDataMNG = new DataMNG();
- 형식으로 신규 생성을 하면 관리에 문제가 없다.

DataMNG myDataMNG;
myDataMNG = 변수;
- 형식으로 선언을 하면 포인터 복사가 이루어진다.
- 원하는 구성이 안 될 수 있다.


개별적으로 VR 포트폴리오를 진행하고, 유니티에서의 class 복사에 대한 간단 설명이 진행된 것 같다.

2019년 9월 16일 월요일

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

123일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티의 사운드 처리에 대한 교육이 진행됐다.


사운드 리스터
- 카메라에 달려 있음.
- 듣는 개체의 위치

사운드 소스
- 발생하는 개체에 달려 있음

이슈
1. 각 개체별 사운드 소스를 가지고 있어 관리가 힘듦
2. 일정 거리 이상일 경우 Mute 처리와 같은 공간 처리의 최적화 문제
3. 이를 관리하기 위해서는 사운드 매니저 형식의 기능 구현이 필요
 개체별 Getcomponent<audiosource>().play();


오디오 믹서를 이용한 사운드 제어
- snap shot : 설정된 세팅 값
- group : master 하위로 설정되는 sub 사운드
     크게 BG, Fx, Voice등을 그룹으로 지정해 볼륨을 설정한다.
     이 항목은 hierarchy에 등록되어 하위로 등록된다.

inspector의 제어하고 싶은 항목(예:Fx)을 우클릭하면 script로 참조할 수 있도록 변수를 만들 수 있다.

group은 오디오 소스에 등록해 group을 지을 수 있다.


이처럼 유니티 엔진에서의 사운드 및 사운드 믹서 기능에 대해 교육이 진행됐다.




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

122일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티의 애니메이션 기능과 VR 포트폴리오 작업이 진행됐다.


animator에서 현재 플레이 중인 animation의 이름 얻는 방법
- this.Getcomponent<Animator>().GetcurrentAnimatorStateInfo(0).fullPathhash;

Animator.StringToHash("Base Layer.Idle");
- StringToHash 에 전달하는 인자는 "레이어 이름.스테이트 이름"
 또는 "레이어 이름.서브 스테이트 이름.스테이트 이름" 형태로 접근 가능하다


스폰 영역 설정
- Random.isidleUnitCircle 를 하면 vector2로 원안의 랜덤한 값이 나온다.
- 이를 x, z 좌표와 영역 크기로 곱해서 좌표를 지정 할 수 있다.

몬스터등의 스폰 시 바라보는 방향의 제어는 Lookat을 이용할 수 있다.
- var monster = Instantiate(오브젝트, 포지션, Quaternion.identity);

목표지점의 y값 맞추기
- endpoint.transform.position.set(~ , 몬스터 Y , ~);
- monster.transform.LookAt(endpoint의 포지션);


네비매쉬를 생성할 때는 지형 오브젝트의 static을 Navigation Static으로 설정을 해야 된다.


이처럼 애니메이션과 관련된 스크립트에 대해 학습하고, VR 포트폴리오를 진행했다.

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

121일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티의 애니메이션 기능과 VR 포트폴리오 작업이 진행됐다.


animation "blend tree" 개념
- 애니와 애니 사이의 전환 시 animator에 inspector의 탈출 시간을 이용하는 것이 아닌 애니간 전환 방법

blend tree
- 설정된 값에 따라 move(속도 값)에 따라 walk와 run을 왔다 갔다 할 수 있도록 하는 전환 기능
- animator에서 state 생성 시 blend tree를 선택해 생성
- 단일 값 전환 2차원(조이스틱) 값에 대한 전환


VR 포트폴리오를 진행하고, 유니티의 animation과 관련된 기능을 학습했다.

2019년 9월 15일 일요일

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

120일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티의 애니메이션 기능과 VR 포트폴리오 작업이 진행됐다.


애니메이션 - 이벤트
- animation 창에서 add event 버튼 또는 우클릭을 해 지정한다.
- 한 구간에 이벤트를 복수로 넣을 수 있지만, 화면 정보는 작게 표시된다.
- 애니메이션 윈도우에서 이벤트 선택 시 inspector에 함수를 지정할 수 있도록 화면이 전환된다. (단 연결된 스크립트 한정)
- 직접 애니메이션 데이터를 수정할 수 있다.

read only fbx 애니메이션 리소스 시
- inspector의 animation 탭에 있는 event 항목을 통해 제어 가능
- event 추가 시 표시되는 게이지는 비율로 표시됨
- event 추가 시 함수명을 적는다. (public이 아니어도 된다.)

event 설정 시 1개의 변수를 지정할 수는 있으며, 이는 함수가 받도록 준비되어야 한다.


sendmessage의 방식
- 타겟 오브젝트.sendmessage("함수명", 인자); 형태로 설정된다.
- 타겟 오브젝트에 설정된 모든 컴퍼넌트에 "함수명"을 실행 하라고 전달한다.


OnTrigger 함수는 두 개체 중 하나라도 트리거이면 인식이 가능하다.


이처럼 유니티의 애니메이션 기능과 VR 포트폴리오 작업이 진행됐다.

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

119일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업이 진행됐다.


애니메이션, 메카님
- 유니티/애니메이션/시간 흐름에 따른 정보변화, 이중 개체나 이미지의 변환

애니메이션을 만들 때 hierarchy에서 선택을 해야 됨

2D Sprite는 이미지 타입(Texture Type)과, Sprite 모드(Sprite Mode)를 제어해서 사용가능
- Single : 단일 Sprite
- Multiple : 1개의 이미지에 복수 Sprite


애니메이션에서  inspector를 통해 수정하는 경우 녹화 버튼을 눌러야 함
- 애니메이션 내 값 수정으로 제어할 수도 있음

애니메이터에서 parameter를 추가해 상태를 제어할 수 있음


유니티의 Animation과 Animator에 대한 설명이 진행됐다.
그리고 남은 시간 동안 VR 포트폴리오 작업이 진행됐다.

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

118일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업이 진행됐다.


LocalPosition은 부모의 Scale값에 영향을 받아 좌표가 실측에서의 계산 시 틀어질 수 있다.


VR 포트폴리오에서 사용한 기능을 샘플링해 보는 시간으로 교육이 진행된 것 같다.
메모의 내용이 적은 것은 아마도 프로젝트 작업을 진행하느라 작성된 메모가 없는 것으로 생각된다.

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

117일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 포트폴리오 작업이 진행됐다.


컨트롤러를 이용한 Object의 잡기/던기지에 대한 샘플 작업 진행
- FixedJoint에 대한 내용을 자습
- Throwing 처리에 대한 처리 방식 자습


VR 포트폴리오에서 사용한 기능을 샘플링해 보는 시간으로 교육이 진행된 것 같다.

2019년 9월 14일 토요일

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

116일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 네트워크 연결에 대해 교육했다.


hash 테이블, photon network의 Lobby 구조
- hash테이블 : key , value 을 이용한 자료구조

매치메이킹 기능이 있다.
- 입장 시 제어된다.
- 프로퍼티가 있으면, 입력된 값으로 입장 / 없으면 랜덤 입장


이처럼 포톤네트워크에 대한 교육과 실습이 이루어진 것 같다.

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

115일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 네트워크 연결에 대해 교육했다.


메모로 작성된 내용이 없음


포톤네트워크를 이용해 Bone이 있는 캐릭터의 animation 동기화 처리에 대한 교육이 진행된 것 같다.
대부분의 내용이 수업 중 작성한 샘플 프로젝트의 주석에 작성된 것으로 보인다.

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

114일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 네트워크 연결에 대해 교육했다.


포톤네트워크 예제를 정리
- 클라이언트 간 transform 정보 통신 진행

photon view.photon transform view를 개체로 사용
-on observed components

photon animator view
- synchronize parameters
- discrete : 1초에 10회
- continus : 프레임 별로


유니티 컴파일 순서
- standard asset → plug in 포톤뷰 → ...
- standard asset(폴더 이름 기준)을 제어하려면 script 위치를 변경해 주어야 한다.


동기화 RPC , photon view의 observed components를 통해 이루어진다.
- animation, transform


이처럼 유니티와 포톤네트워크를 이용해 복수의 클라이언트 간 좌표와 애니메이션 정보의 동기화에 대한 샘플 작업이 진행된 것으로 보인다.
정리되지 않은 메모 내용으로 보아 상세한 설명은 샘플 작업 프로젝트 파일 내 주석으로 작성된 것 같다.

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

113일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용해 VR 포트폴리오를 진행했다.


메모 내용으로 보아 각자 교육 시간에 VR 포트폴리오 작업을 진행한 것으로 생각된다.

유니티 애니메이션 리소스 > inspector 에서
- motion - root motion node 를 <Root Transform>으로 설정
- 이러면 애니메이션상에서 이동이 설정되어 있어도 좌표 변동이 이루어지지 않는다.
- <None>으로 설정하면 애니에 따라 이동한다.


네비매쉬 에이전트 클래스를 사용
- using UnityEngine.AI; 를 추가해야 된다.


글로벌 조작에서 이벤트 발생 시 동시 발생을 막기 위해 if(~) 항목으로 묶어 관리한다.


이처럼 네트워크 교육을 안 하고 각자 VR 포트폴리오 작업이 진행된 것 같다.
작성된 내용 외 네트워크에 대한 메모는 확인할 수 없다.

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

112일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 네트워크 연결에 대해 교육했다.


포톤네트워크
- 에셋스토어>photon unity network ~ 를 설치
- Photon 홈페이지의 photon cloud 관리화면, 애플리케이션 ID 확인
- 설치한 에셋의 Resource/photon server setting의 inspector에 가입된 ID를 입력

스크립트로 photon network 클래스를 이용해 접속에 관련된 세팅을 진행

monobehaviour가 아닌 photon.punbehaviour를 상속받아서 사용
- override용 함수를 통해 제어

Remote Procedure Call RPC를 이용해 정보를 전달할 수 있다.


이처럼 유니티 엔진을 이용한 클라이언트 간 통신에 대한 교육이 진행됐다.
예제 프로젝트를 진행한 뒤 PC로 빌드하여 2개의 클라이언트 간 통신에 대한 예제 프로젝트를 진행한 것으로 생각된다.


2019년 9월 10일 화요일

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

111일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 프로젝트 진행을 하였다.


포트폴리오 작업 진행
- 포트폴리오에 사용하기 위한 리소스 검색 및 확보 작업
- 작업 예정 문서 작성

메카님에 대한 자습 진행

Fog 처리를 위한 FX 자습 진행


이처럼 VR 포트폴리오를 제작을 진행한 것 같다.
사전 준비라서 그런지 몰라도 두건에 기능에 대해서 자습으로 진행한 것 같다.

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

110일 차 교육 내용 메모를 옮겨 본다.
게임 엔진 유니티를 이용한 VR 프로젝트 진행을 하였다.


개별 또는 팀으로 나뉘어 포트폴리오에 사용할 VR 프로젝트 작업을 진행했다.

일전 2D 포트폴리오와 마찬가지로, 문서 작성, 리소스 챙기기 등으로 교육 시간을 사용했다.


실습으로 진행된 교육 시간으로 추가적인 내용이 메모로 작성되어 있지 않다.
아마도 위와 같이 포트폴리오 제작과 관련된 내용으로 하루가 진행된 것 같다.

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

109일 차 교육 내용 메모를 옮겨 본다.
앞으로 진행될 서버 교육과 관련된 설명이 있었던 것 같다.


유니티에서 사용할 수 있는 네트워크
- unet, 포톤 라이브러리, 프라우드 넷

이러한 라이브러리에 대해서 설명하고, 이를 중심으로 교육이 진행된다고 공유 됬다.


그리고 남은 시간은 VR 포트폴리오 프로젝트 제작을 진행한 것으로 생각된다.

2019년 9월 9일 월요일

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

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


유니티 VR 세팅
- 에셋스토어에서 SteamVR어셋을 import하면 기본 카메라와 컨트롤러가 인식됨
- 예제 씬으로 제공


각자 앞으로 진행할 포톤 라이브러리에 대한 예습 진행


포트폴리오용 VR 프로젝트를 진행해 보기


이처럼 앞으로 진행할 VR 포트폴리오와 포톤 라이브러리에 대한 설명이 이루어진 것 같다.

2019년 9월 8일 일요일

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

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


VR 기기 및 게임에 대한 설명이 진행되었음.


이외 다른 메모 내용 및 실습 정보는 없는 것 같다.
아마도 VR과 관련된 다양한 이야기가 진행된 것으로 생각된다.

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

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


UI (유니티의 기본)
- UI는 Canvas 안에 있어야 한다.


Canvas
- canvasRayCaster : UI와의 상호작용을 위한 클릭 기능
- Screen Space - Camera : 뒤로 그려진다.
- World Space : 공간에 그려진다.
- UI Scalemode : Scale With Screen Size 화면 크기에 맞추어 그린다.
- UI는 Hierarchy의 Eventsystem이 존재해야 반응을 한다.

Text
- overflow 옵션으로 가로, 세로의 영역을 무시하고 출력한다.
- Raycast Target 옵션을 보통 해제한다.

Image
- 지정색을 제외하고 다른 색을 빼는 개념이다.
- color에서 white, black 은 블렌딩이 안된다.

RawImage
- 3D에서 2D 그림을 그리는 느낌
- UV를 이용한 수정이 가능하다.
- Texture를 사용한다.

Button
- Image > Image type의 slice 형태를 기본적으로 사용
- Button > Interactable : 비활성 상태를 만들 때 사용

Panel
- 뒷판, 기본판
- Image와 동일하지만 만들 때 기본생성 값이 다름

ScrollView
- ScrollView > ViewPort > Content 에 생성하는 방식
- Content 하위로 Text, Button 등이 설정
- ScrollView의 ScrollRect에서 기본 옵션을 제어 함
- MoveType으로 스크롤 연출을 제어함

재사용 스크롤 뷰
- 미리 스크롤 세트를 만들어 두고, 내용을 코드상에서 교체해 표시


이처럼 유니티의 UI와 관련된 교육이 진행됐다.
메모로 작성된 기능에 대한 실습을 한 것으로 생각된다.

2019년 9월 7일 토요일

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

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


유니티 가상스틱에 대한 이야기

엔진에서 제공하는 기본 조이스틱 추가
- 플랫폼을 안드로이드로 세팅
- project에서 assets 우클릭 Import Package > CrossPlatformInput 선택
- 설치되면 crossplateInput 폴더 내 prefabs 폴더에 기본 제공 컨트롤러들이 있음

MobileSingleStickControl
- 4방향 스틱 1개와 버튼 1개로 구성된 프리팹
- using UnityStandardAssets.CrossPlatformInput; 선언 필요


이처럼 유니티에서 제공하는 입력 장치에 대한 교육이 진행되었다.
그리고 관련된 실습도 진행한 것으로 생각된다.

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

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


씬 로딩에 대한 방식이 설명됐다.

현재 Scene -> Load Scene
         └→ 오픈과 동시에 다음 Sync 형태의 오픈
         로딩이 완료되면
         ↓
         open으로 오픈

현재 Scene -> 로딩 Scene -> 다음 Scene

현재 Scene -> 빈 다음 Scene -> 로딩 Scene -> 다음 Scene 데이터 로드


에셋 번들 : 에셋을 다운로드해서 쓸 수 있도록 분리하는 기술


allowSceneActivation 속성을 이용해 Scene을 뒤쪽에서 로딩 시킬 수 있다.


이처럼 Scene 로딩과 관련된 메모가 작성되어 있다.
메모 내용이 너무 단축해 작성되어 메모만으로는 어떤 내용이 강의 됐는지 파악이 잘 안 된다.
아마도 샘플 프로젝트에 방식에 대한 주석이 달려 있지 않을까 생각된다.

엔터키 심볼(Enter_key Symbol)

출처 : https://en.wikipedia.org/wiki/Enter_key
출처 : http://xahlee.info/comp/unicode_computing_symbols.html


윈도우 특수문자에서 찾을 수 없어서 검색 결과를 기록해 둔다.


  • Enter 심볼 : ⏎ 또는 ↵ 를 사용


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

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


녹스 안드로이드 에뮬레이터와 유니티 연결하기
- 안드로이드 스튜디오의 adb.exe 를 사용한다.
- adb connect 127.0.0.1:62001 ↵
- adb devices ↵

주소와 포트는 녹스의 adb devices를 이용해 확인한다.
녹스 내 옵션에서 개발자 옵션(켜기), USB 디버깅(켜기)을 해두어야 연결된다.

adb를 통해 녹스와 연결이 되면 유니티에서 build&run 으로 즉시 모바일 기기 테스트가 가능해진다.


static 클래스
- static 변수 : 사라지지 않고 계속 계산된다.
- static 함수 : 선언하지 않고 사용할 수 있다.
- static 함수는 클래스명.함수() 로 사용한다.

객체용이 아니는 전역(전용)용이라고 명시하는 방식이다.
내부 변수, 함수는 외부접근을 위해 public으로 선언해야 한다.

싱글톤


Scene 전환 시 데이터 유지
1. 파일 저장 -> 로드
2. dontdestoryobject 선언
3. static 클래스


이처럼 녹스 에뮬레이터와 유니티의 연결을 이용해 빠른 빌드 테스트에 대한 설명이 진행됐다.
그리고 Scene간 데이터 사용에 대한 내용이 설명됐다.

2019년 9월 6일 금요일

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

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


안드로이드 빌드 세팅
1. 안드로이드 스튜디오 : SDK가 내부에 탑재되어 있음
2. JDK : JDK는 8버전을 설치해야 한다고 한다.

유니티 > edit > preference > external tools 에 SDK와 JDK를 설정
JDK를 깔고 안드로이드 스튜디오 순으로 설치


안드로이드 스튜디오 > 시작 팝업 > configure > SDK Manager 선택

안드로이드 빌드 옵션 > build system > target architectures
- ARM v7 : 일반 모바일 AP
- x86 : 인텔 AP


안드로이드 스튜디오 설치 폴더 내
- platform_tools / adb.exe 을 실행하면 기기 연결 유/무를 체크할 수 있다.

내 컴퓨터(우클릭) > 고급 시스템 설정 > 고급/환경 변수
- 시스템 변수(s)의 Path에 경로 추가
- adb.exe 를 실행하기 위한 작업

adb devices
- USB 디버깅을 설정한 개발자 폰을 인식해 표시한다.


이처럼 안드로이드 빌드를 위한 최소 설정 작업을 진행했다.
작성된 메모의 교육 시점과 현재와 많은 부분이 일치하지 않으며, 그냥 기록으로 남기는 데 의의가 있다.

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

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


유니티에 안드로이드 빌드를 위한 세팅 작업 진행.


별도의 교육 메모가 없는 것으로 보아, 종일 실습으로 진행한 것 같다.
(실습한 샘플 프로젝트가 없음)

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

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


델리게이트
- 클래스처럼 자료형이다.
- 함수의 리스트

delegate void sampleD();
sampleD dele1;

대입 : =
추가 : +
제거 : -

C# 미리 선언된 델리게이트 변수
- Func : 반환 값이 있는 델리게이트 Func<반환 값, 매개변수>
- Action : 반환 값이 없는 델리게이트


C# 람다
- 버프, 디버프에서 활용
- 종류는 많지만, 처리는 공용인 구현 항목의 처리에서 유리하다.


이처럼 C#의 델리게이트와 람다 문법과 관련된 교육이 진행됐다.

2019년 9월 5일 목요일

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

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


UI 캔버스 옵션 3가지
- ScreenSpace - Overlay : 일반 UI
- ScreenSpace - Camera : 특정 카메라에 붙어 가장 나중에 그려짐
- World Space : 3D 좌표계로 위치함


Random.insideUnitCircle
- 반경 1 원안의 랜덤한 x,y 좌표를 반환
- vector2 를 반환


UI에 사용할 Overlay용 캔버스
- 배경에 사용할 Camera용 캔버스 2개를 이용해 화면을 제작할 수 있다.


sendmessage
- 해당 object에 있기만 하면 되는 메소드를 호출해 사용할 수 있음
- 반환 값이 없는 void형의 메소드의 경우 그냥 실행시킬 수 있음


fade In/Out
- UI의 스프라이트와 3D의 Quad를 이용해 터치를 막고 화면전환 연출을 처리 함
- Quad는 카메라 바로 앞에 (z축 0.2~0.3) 위치하도록 조절
- UI 스프라이트는 화면을 모두 덮게 해서 화면 전환 연출을 적용

  while()
  {
    var rate = 1;
    rate -= deltatime / 기준 시간 value;
  }
  코루틴을 통해 정의된 시간 동안 반복시킴


transform.position : 월드 좌표계에서의 위치 설정
transform.localposition : 부모 좌표를 기준으로 위치 설정


이처럼 Unity 엔진을 이용한 교육이 진행되었다.
Fade In/Out 연출에 대한 실습이 진행된 것으로 생각된다.

Unity Canvas Render Mode 설정

UGUI의 Canvas 설정 중 Render Mode 를 정리한다.
이는 2D 게임 개발 중 Canvas > Particle > Canvas 의 출력 순서를 정의하기 위한 복습 자료이다.


  1. 2D 게임을 만들면서 Main Camera가 Orthographic인 설정에서 Screen Space - Camera 모드로 설정한 Canvas를 복수로 설정하는 것이 좋다. 
  2. 이는 Canvas의 Sorting Layer와 Sort Order의 설정을 통해 Depth를 지정 한다. 
  3. 그리고 Particle System의 Renderer 항목의 Sorting Layer와 Sort Order의 설정을  Canvas 사이로 설정해 Particle 출력의 효과를 발생시킬 수 있다. 


Screen Space - Overlay 모드 

  • 캔버스가 씬 내부의 어느 곳에 있더라도 화면 전체를 덮는 모습으로 렌더링 된다.
  • Pixel Perfect
    - On으로 지정하면 UI의 픽셀의 색 그대로 표현하도록 렌더링 함
    - 경계면이 명확히 표현할 수 있음(안티 앨리어싱 없이 렌더링)
    - 다양한 UI 연출로 인한 퍼포먼스를 위해서는 Off로 사용하기를 권장
  • Sort Order
    - 렌더링 되는 순서를 수치로 설정
    - 값이 작을수록 안쪽에 렌더링 됨 


Screen Space - Camera 모드 

  • 지정된 카메라와 일정한 거리만큼 떨어진 앞쪽에 위치 
  • 카메라의 Projection 속성이 Perspective로 지정된 경우 UI 요소는 원근감이 느껴지도록 렌더링 됨 (원근감의 정도는 Field of View 속성값에 의해 결정)
  • Pixel Perfect
    - On으로 지정하면 UI의 픽셀의 색 그대로 표현하도록 렌더링 함
  • Render Camera
    - 캔버스를 렌더링할 카메라를 지정
  • Plane Distance
    - 카메라에서 캔버스까지의 거리를 설정
  • Sorting Layer
    - 캔버스의 소팅 레이어(Sorting Layer)를 지정.
    - 소팅 레이어란 2D 스프라이트를 포함한 2D 그래픽을 렌더링하는 순서를 제어하는 기능
    - Z좌표와 관계없이 렌더링 순서를 제어 할 수 있음
  • Sort Order
    - 렌더링 되는 순서를 수치로 설정


World Space 모드 

  • 설정된 Canvas는 씬에 있는 다른 게임 오브젝트와 동일한 자격으로 취급
  • Canvas의 크기는 Rect Transform 컴포넌트에 따라 정의
  • UI 요소는 씬에 있는 다른 GameObject와 함께 3D 공간에서의 위치 관계대로 렌더링 됨
  • UI요소를 씬의 일부로 다룰 때 이용하면 좋음
  • Event Camera
    - 이벤트를 처리하기 위한 카메라를 지정
    - OnClickButton()과 같은 UI 이벤트 리스너를 통해 발생 되는 결과가 적용될 대상
  • Sorting Layer
    - 캔버스의 소팅 레이어(Sorting Layer)를 지정.
  • Sort Order
    - 렌더링 되는 순서를 수치로 설정





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

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


화면을 클릭한 위치로 오브젝트 날리기
- ray와 출동한 오브젝트를 보고 행동을 취함
- 화면 기준의 Ray 쏘기

    Ray ray = Camera.main.ScreenPointtoRay(Input.mousePosition);
    Vector3 worldDir = ray.direction;
    GameObject.GetComponent<--------->().shoot(worldDir.normalize * 200);

RaycastHit 충돌된 정보
- Raycast : ray에 닿은 것 중 가장 가까운 오브젝트
- Raycastall : ray에 닿은 모든 오브젝트

    var ray = Camera.main.ScreenPointtoRay(Input.mousePosition);

    Raycasthit hit;
    
    if(Physics.Raycast(ray, out hit))
    {
        print(hit.collider.GameObject.name);       // 이름 출력
        print(hit.point);                          // 좌표 출력
    }     


데이터 저장

playerPrefab
- 쉽게 제어된다.
- 저장 타입, 저장량의 한계가 있다.
- PlayerPrefab.Getint("키", 값);  ,  PlayerPrefab.Setint("키", 값);

utf-8
- "\r \n" 과 "\n" 으로 라인을 자를 수 있다.
- 가장 앞쪽 구분 값을 key로 두고, 값을 index 수치로 넣는 방식이 있다.
 Index │ -------- Field --------
     │    Data 
- m_csv = new Dictionary<string, Dictionary<string, object>();
             index      field, data



이처럼 world에서 ray를 이용하는 방법과 데이터 저장과 관련된 내용이 교육되었다.
데이터 저장 중 csv 데이터를 읽는 예제를 제작한 것으로 생각된다.


2019년 9월 4일 수요일

Unity 비동기 로딩(LoadLevelAsync) 일시 정지(Pause)

유니티의 백그라운드에서 비동기적으로 레벨을 로드하는 동안 로딩바를 표시하는 기능과 로딩 완료 시 Play 버튼이 발생해 다른 Scene로 전환되는 기능에 대한 요약 정리



예제

  1. 더미 값을 통해 로딩이 진행 되는 과정 표시
  2. 씬 로딩 완료 후 Start 버튼 표시
  3. 버튼 선택 시 지정된 Scene로 이동

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;  // 씬 이동 처리를 위한 선언
using UnityEngine.UI;               // 게이지 이동 처리를 위한 선언

public class LoadLevelAsyncCode : MonoBehaviour
{
    // 화면에 표시되는 LoadingBar 리소스 연결
    public Slider sliderUI;
    // 화면에 표시되는 toPlay 버튼 리소스 연결
    public GameObject toPlayButtonUI;

    // 더미 시간의 설정 Min Max 값
    float dummyTimeRange_Min;
    float dummyTimeRange_Max;

    // 최초 게이지가 증가되는 더미 시간 -> 이후 본 로딩 시작
    float dummyTime;

    // 로딩 이후 시작 버튼 처리 
    bool toPlayButton;

    void Awake()
    {
        dummyTimeRange_Min = 0.8f;
        dummyTimeRange_Max = 1.5f;
        dummyTime = 0;

        // 버튼의 상태를 초기화 한다.
        toPlayButton = false;
    }

    void Start()
    {
        // UI를 처리 한다.
        sliderUI.gameObject.SetActive(true);
        toPlayButtonUI.SetActive(false);

        // 로딩을 즉시 실행
        StartCoroutine(LoadAsynchronously(1));
    }

    IEnumerator LoadAsynchronously(int _sceneIndex)
    {
        // 더미 타이머로 진행할 값을 설정
        dummyTime = Random.Range(dummyTimeRange_Min, dummyTimeRange_Max);

        // 게이지로 표현되는 loading 값 변수들
        float loadingTime = 0.0f;   // 시간 계산 용
        float progress = 0.0f;      // 게이지 용


        // 타이머 게이지 처리 
        while (loadingTime <= dummyTime)
        {
            // 프레임 당 시간을 증가 
            loadingTime += Time.deltaTime;

            // AsyncOperation 를 통한 추가 로딩 처리를 위해 0.9 값 을 백분율화 
            // 이후 opertaion.progress 는 0.9 까치 처리 되고 완료 된다.
            progress = Mathf.Clamp01(loadingTime / (0.9f + dummyTime));

            // 슬라이더바의 값 증가 처리
            sliderUI.value = progress;
            
            yield return null;
        }

        // "AsyncOperation"라는 "비동기적인 연산을 위한 코루틴을 제공"
        AsyncOperation operation = SceneManager.LoadSceneAsync(_sceneIndex);

        // 로딩 후 스타트 버튼 처리를 위한 선언
        // 이 항목이 없으면 바로 로딩 후 Scene 이동이 처리 됨
        operation.allowSceneActivation = false;

        // 로딩이 종료되기 전까지의 로딩창 게이지 처리
        while (!operation.isDone)
        {
            // 비동기 로딩 진행에 따른 게이지 처리
            progress = Mathf.Clamp01((operation.progress + loadingTime) / (0.9f + dummyTime));

            // 슬라이더 증가 처리
            sliderUI.value = progress;

            yield return null;

            // 로딩 이후의 처리 , 버튼을 누르면 씬 이동이 처리 된다.
            // UI를 반전 처리 한다.
            //sliderUI.gameObject.SetActive(false);
            toPlayButtonUI.SetActive(true);
            Debug.Log("toPlayButtonUI.SetActive(true) - Line");
            // toPlayButton 입력을 대기 한다.
            if (toPlayButton)
            {
                operation.allowSceneActivation = true;
            }

            yield return null;

        }
               
    }

    // 버튼을 입력 한다.
    public void ToPlayButton()
    {
        toPlayButton = true;
    }

}

youtube 홍보 활용 정리 자료

홍보로 이용하기 위한 유튜브 개설과 관련한 내용을 정리한다.

유튜브 채널 생성

  • 브랜드 채널로 생성을 해야 차후 검색엔진 최적화에 유리하다.
  • 새 채널 만들기 -> "브랜드 계정" 생성


채널 키워드 챙기기

  • 크리에이터 스튜디오 내 고급 항목에 위치
  • 크리에이터 스튜디오 > 설정 > 채널 > 기본 > 키워드
  • 최대 3개의 핵심 단어를 넣어 둔다.
  • indiegame, gameplay, freegames


업로드 기본 설정

  • 업로드 시 제목 및 내용의 기본 내용이 자동으로 채워지도록 사전에 문구를 넣어 둘 수 있다.
  • 크리에이터 스튜디오 > 설정 > 업로드 기본 설정


업로드 

  • "비공개"로 업로드하고 최종 확인이 끝난 이후에 "공개" 또는 "예약"으로 변경하는 게 좋다. 
  • [맞춤 미리 보기] 를 클릭해 업로드 한다.



종료 화면의 구독 기능

  • 영상마다 수동으로 설정해야 됨
  • 크리에이터 스튜디오 > 동영상 관리자 > 동영상 > 수정 - 최종화면에서 요소 추가로 넣을 수 있음
  • 템플릿을 만들어 두고 사용할 수 있다.
  • 이런 기능을 위해 영상의 후반부에는 10~20초가량의 나머지 시간이 필요하다.
    (종료 화면 배경으로 추가 정보가 표시될 구간용의 추가 시간)
  • 또는 배경용 전용 정지 화면 동영상을 제작해 후반에 붙여서 하는 방법도 있다.


영어/한글로 된 번역을 이용해라

  • 제목/설명을 번역해 넣어 두어라.
  • 어떻게든 검색에 걸리도록 해야 한다.


제목에 채널 이름 넣기

  • 게임 브랜드가 중요하니 채널이 아니라 게임명을 넣어야 한다.


영상 제목

  • 글자 수 : 55~60자가 표시됨
  • 가장 중요한 것은 앞의 10글자 (핵심 내용을 넣어야 한다.)
  • 키워드로 가능 한 많이 넣는다.
  • 동일 키워드를 중복하지 않는다.
  • 추천 : 20~27자, 메인 키워드는 앞쪽 10~15자
  • 설명에 태그가 있으면 제목 위로 가장 앞쪽 3개가 표시된다.


영상 설명

  • 내용이 많을수록 검색에 걸릴 확률이 높다.
  • 제목에 쓰인 키워드를 한 번 더 넣어 작성하면 메타 데이터의 정확도가 높아진다.
  • 설명문은 5000자 최대한 다 채워 넣는다.
  • 주요 키워드를 많이 반복하면 안 된다.
  • 설명에는 태그를 쓸 수 있다. 


영상 태그

  • 영상에 설정하는 태그는 표시되지 않는다. 
  • 내 채널명부터 넣을 수 있는 것은 최대한 넣지만, 중복되거나 관련되지 않는 키워드를 넣지는 말자 
  • 허위 키워드나 유인 키워드를 설정하는 경우 클릭률이 낮아질 수 있다.


영상 설명 템플릿

  • 동영상 개요
    - 채널 구독 URL
    - 동영상의 제목 및 접속률을 모으고 싶은 사이트의 URL
    - 동영상에 대한 최대한 많은 설명 (중복 단어 없음)
  • 관련 동영상
    - 제목 / URL의 조합으로 관련성이 있는 영상 정보
  • 태그
    - 태그에 채널 ID를 넣는다.
    - 내게 관련된 동영상으로 나올 수 있다.
    - 관련성 있는 3~5개의 태그를 선정해 사용한다.
    - 너무 많은 태그는 스팸으로 처리될 수 있다.


맞춤 미리보기 - 썸네일(thumbnail)

  • 유튜브 재생 목록에서 바로 확인할 수 있는 이미지
  • 형식 : 1280 x 720, PNG, 2MB, 16 : 9
  • 썸네일을 강조하면 영상의 클릭률을 높일 수 있다.
    1. 이미지로 시선을 끄는 형식
    2. 궁금증을 만드는 형식
    > 핵심 단어 또는 질문형의 문구를 사용


채널 홈 관리

  • 구독이 가장 많이 이루어지는 장소
  • 채널의 매력을 최대한 어필하는 것이 필요하다.
  • 색상, 로고, 캐릭터 등을 활용해 각인되는 컨셉팅을 해야 된다.
  • 채널 아트
    - [내 채널] > [채널 맞춤설정] 에서 수정
  • 채널 아트 맞춤링크
    - [내 채널] > [채널 맞춤설정] > [정보] > [링크]에서 추가
    - 아이콘은 자동으로 추가됨


순환 구조

  • 자신의 사이트에 링크 걸기 : 외부에서 링크를 걸어두어라
  • 재생목록을 만들어 관리하자


키워드 수집

  • 구글 에드워즈 가입 -> 도구 -> 키워드 플래너
  • "검색량 데이터와 동향 알아보기"
  • 예시 문장(단어) 입력 후 "검색량 보기"를 통해 추천 입찰가를 확인해 볼 수 있다.
  • 금액이 많을수록 애드센스 수익도 높다.
  • 키워드를 높은 단어 위주로 글을 작성한다.
  • 이런 키워드 단어의 입찰가를 엑셀로 정리해 두어 관리 한다.
  • 내 채널의 "분석" 정보 중 "검색 키워드"를 확인해 관리하자.
    (크리에이터 스튜디오 > 분석 > 트래픽 소스)


유입 경로

  • 탐색 기능
    - 유튜브 홈 화면, 유튜브 구독 화면에서 발생한 트래픽
    - 탐색 기능은 유튜브의 홈, 인기, 구독 화면에서 발생한 트래픽을 의미
  • 추천 동영상
    - 추천 동영상으로 발생한 트래픽
    - 추천 동영상은 유튜브 알고리즘에 의해 자동으로 제안됨
  • YouTube 검색
    - 유튜브 검색 결과로 발생한 트래픽
    - 현재 내 조건에서 가장 집중해야 하는 유입 경로


알고리즘

  • 알고리즘에 영향을 미치는 6가지 요소
    - 조회 수, 시청 시간, 정기 업로드, 구독자, 메타 정보, 공유
  • 조회 수
     : 동영상의 화제성을 평가하는 지표
  • 시청 시간
     : 동영상을 얼마나 길게 시청하는지의 지표
  • 정기 업로드
     : 유튜브의 '순간 트래픽'(짧은 시간 동안의 시청자 유입)에 영향
  • 구독자
     : 구독자를 통한 순간 트래픽, 시청 시간의 연관 효과가 중요
  • 메타 정보
     : 제목, 설명, 태그를 기반으로 동영상을 활용
  • 공유
     : 외부 SNS 공유를 통한 유입



파일 관리

  • 영상별 폴더를 만들어 관리한다.
  • [업로드 영상 폴더] - [원본 리소스 폴더] - 편집 프로젝트 파일
                       - 동영상 원본(mp4)
                       - 썸네일 원본(psd)
             - 최종본 영상 파일(mp4)
             - 최종본 썸네일(png)
  • 폴더 네이밍에 날짜와 업로드 index를 함께 작성해 관리 한다.
    (예 : 폴더명 - [190802_1] 어쩌고 영상)


저작권 확인

  • 사용하는 음악, 폰트 등의 저작권 형태의 확인이 필요
  • 게임 영상의 경우 제작자가 원저작자임에 따라 권리 행사를 할 수 있음
  • Creative Commons License의 네 가지 이용허락 조건 확인이 필요
  • CCL 기반의 콘텐츠 검색 : http://www.letscc.net/
  • 구글 및 네이버, 다음 검색 시 CCL 조건 설정 후 검색


외부 도움 사이트

  • 소셜 블레이드 : https://socialblade.com/
    - 유튜브 및 SNS 채널 분석 도움 사이트
    - 내 채널 이름을 검색해 정보를 얻을 수 있음



2019년 8월 29일 목요일

저작권 무료 리소스

홍보용으로 제작하는 유튜브용 저작권 무료 리소스를 정리 한다.

이미지

  • 프리큐레이션
    - Link : http://www.freeqration.com
    - 30개가 넘는 무료 이미지 사이트를 종합해 검색할 수 있는 사이트
    - 대부분이 CC0 라이센스이지만 이미지별 확인이 필요

  • 구글 이미지 검색
    - Link : https://www.google.co.kr/imghp
    - 검색 후 [도구] > [사용 권한] > [재사용 가능] 으로 재 검색
    - 사이트를 방문해 최종 라이센스 확인 필요


영상

  • 비디보
    - Link : https://www.videvo.net/
    - 'Editorial Use Only' 라는 표시만 없으면, 라이센스 내에서 영리 목적으로 이용 가능
    - 라이센스 정책
    - 상업적 이용이 가능한 무료 리소스를 검색 하려면 라이센스 정책은 Royalty-Free , Only Show Free Clips  옵션을 선택

  • 마즈와이
    - Link : http://mazwai.com
    - 대다수 ATTRIBUTION LICENSE 3.0 라이센스로 출처 표시로 영리목적으로 사용할 수 있음
    - 다운로드 받고자 하는 재생 영역을 지정 할 수 있음


배경음악



효과음



폰트



2019년 8월 22일 목요일

Youtube용 플레이 영상의 DaVinci Resolve 15 설정값


플레이한 게임 영상을 유튜브로 업로드 하기 위해 기초적인 영상 설정을 기록해 둔다.

영상은 BlueStack 과 OBS를 이용해 녹화했고, 이를 DaVinci Resolve에서 편집해 Youtube로 업로드한다.


배경 처리
- 촬영한 영상이 세로 영상이라 배경의 처리가 필요하다.
- 이는 동일 영상을 Zoom In 하여 배경으로 사용 했다.
  1. DaVinci Resolve 의 Video1에 배경 영상을 Video2 에 정상 영상을 위치 시킨다. 
  2. 배경으로 사용 되는 Video1은 Inspector에서 Transform의 Zoom을 조절해 확대 시킨다.
    > Zoom 효과는 X, Y 값을 약 3.25 정도로 조절한다.
  3. 이후 Video1에 OpenFX > Filters에서 BoxBlur를 선택해 뿌연 효과를 준다.
    > 각 Horizontal/Vertical Strength 를 0.200 으로 설정
    > Gang 에 체크
    > Number Of Iterations 은 2로 설정
    > Border Type을 Replicate 로 설정
  4. 배경으로 사용되는 영상의 Audio1 소스는 Mute 하거나 링크 해제 후 삭제 처리 한다.


본 영상 좌/우 잘라내기
- 세로로 촬영된 영상의 좌/우를 잘라내기 위해 Video2 에서 수정 작업을 한다.
  1. 본 영상 Video2은 Inspector에서 Cropping의 값을 조절해 좌/우를 잘라낸다.
  2. Crop Left 를 655.00 으로 Right 를 653.00 으로 설정 한다. 


추출 영역 지정 하기
- Deliver 화면에서 Render 게이지를 조절해 영상으로 추출할 영역을 지정 할 수 있다.
- 이는 1개의 영상에 여러 추출 영역을 가지고 있을때 사용 하기 좋다.
 (1개의 영상에 3개의 영상 추출이 필요할 때)

  1. Render 모드를 In/Out Range 로 변경
  2. 추출 시작 지점에 Timeline 커서를 위치시키고 우클릭 Mark In 으로 지정
  3. 추출 종료 지점에 Timeline 커서를 위치시키고 우클릭 Mark Out 으로 지정
  4. Add to Render Queue 로 영상 추출



이상의 작업을 하면 배경으로 본 게임 영상이 확대되어 Blur 처리되어 표시되고, 중앙에 본 게임 영상이 표시되도록 편집 할 수 있다.

2019년 8월 21일 수요일

unity 화면 꺼짐 방지

게임 플레이 중 디바이스의 설정에 따라 입력이 없으면 화면이 꺼지는 설정을 강제하는 코드.


// 화면이 꺼지지 않도록 설정
Screen.sleepTimeout = SleepTimeout.NeverSleep;

// 디바이스 설정에 맞추어 화면이 꺼지도록 처리 
Screen.sleepTimeout = SleepTimeout.SystemSetting;

출처 : https://docs.unity3d.com/kr/2018.4/ScriptReference/Screen-sleepTimeout.html

공유 폴더 접속이 안되는 (오류코드: 0x80004005)

윈도우 10 Home에서 공유 폴더에 접속이 안되고 상세 정보로 "오류코드: 0x80004005"가 발생 될 수 있다.

이 경우 다음과 같이 레지스트리를 고쳐 리부팅 하면 문제가 해결 된다.

  1. regedit 실행
  2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA 경로 이동
  3. 값 수정 또는 생성
    값 : LmCompatibilityLevel
    종류 : DWORD
    데이터 : 1

출처 : https://answers.microsoft.com/ko-kr/windows/forum/windows_7-networking/%EC%98%A4%EB%A5%98%EC%BD%94%EB%93%9C-0x80004005/3b1dd77b-9b76-4d99-b555-e1e9619d7af1

윈도우10 오류 점검 및 복구 방법

윈도우10을 사용하다 오류가 생겼을 때 복원 작업을 하거나 점검하는 방법이 있음.

  1. 명령 프롬프트(cmd)를 관리자 권한으로 실행 (윈도우키 + x 에서 선택 가능)
  2. dism 유틸 실행해 복원 작업을 준비
    dism /online /cleanup-image /restorehealth
  3. 유틸 실행 후 약 15분 정도 대기
    콘솔에 "작업을 완료했습니다." 텍스트 표시 될 때까지 대기
  4. System File Checker(시스템 파일 확인) 실행
    sfc /scannow
  5. 표시되는 결과에 따라 처리
  • 복구 성공
    - Windows 리소스 보호에서 무결성을 발견하지 못했습니다.
    - Windows 리소스 보호가 손상 된 파일을 발견 및 성공적으로 복구 했습니다. 자세한 정보는 CBS.log 를 참조하십시오.

  • 복구 실패
    - Windows 리소스 보호에서 요청 된 작업을 수행할 수 없습니다.
     (안전모드로 Windows\WinSxS\Temp 폴더 확인.)
    - Windows 리소스 보호가 손상 된 파일을 발견했지만 일부 파일을 복구 하지 못했습니다. 자세한 내용은 CBS.log 를 참조하십시요.
     (Windows\CBS\cbs.log 에 있는 내용을 열어보고 문제가 있는 파일 확인 후 대체)



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

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

Unity - Firebase 연동 (Analytics, AdMob)

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