2019년 5월 29일 수요일

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

57일 차 교육 내용 메모를 옮겨 본다.
A* 구현의 풀이와 관련된 내용이 메모로 작성되어 있다.


재귀 : 타고 내려가기에 상위값을 바꿀 수 없다.
while() : 타고 들어가다 상위 값을 수정할 수 있다.

열린목록 : 할일, 예정, 어떤 사각형을 검색해야 되는지
닫힌목록 : 결과, 완료, 저장되어 있는 사각형

A STAR : 길찾기
FSM : 몬스터 인공지능

이동 검색 시 개각이 없으려면 8방향이 아닌 4방향으로 검색을 수행하면 된다.
열린목록에 대각선 방향의 검색을 끌 경우(list 추가를 안할 경우) 4-way 길찾기로 동작한다.


이와 같은 내용이 메모로 작성되어 있고, A*알고리즘에 대한 상세한 설명은 아마도 풀이를 한 프로젝트의 소스에 주석으로 작성되어 있다고 생각 된다.

2019년 5월 28일 화요일

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

56일 차 교육 내용 메모를 옮겨 본다.
경로 탐색 A*에 대한 메모가 작성되어 있다.


시작점과 경로와의 거리
경로와 목적지까지의 최단 거리

타일맵에 2개의 기능을 추가해 본다.
1. 클릭할 때 장애물 생성하기
2. 시작점, 도착지점을 제어할 수 있게 하기


A*에 대한 교육은 인터넷 올라와 있는 자료를 중심으로 소개를 하고, 이를 실제 제작해 보는 실습과 숙제로 이어진 것 같다.

2019년 5월 27일 월요일

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

55일 차 교육 내용 메모를 옮겨 본다.
마우스 좌표 획득에 대한 메모가 작성되어 있다.


마우스의 좌표는 WM_MOUSE 이벤트를 받아서 GET_X_LPARAM(lp)로 좌표를 얻는다.

그리는 영역이 보이지 않는 영역을 항시 그리고 있지 않도록 소스를 구성해야 한다.

카메라 좌표의 플레이어 캐릭터 좌표, 마우스 포인터 좌표에 대한 관리 요소가 중요하다.


이처럼 짧은 메모 내용으로 작성되어 있고, 아마도 어제 있었던 Tile Map 과 관련된 풀이 형식으로 하루 교육이 진행된 것으로 생각된다.

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

54일 차 교육 내용 메모를 옮겨 본다.
타일맵 구현에 대한 메모가 작성되어 있다.


2D에서의 Tile Map 구현
- Tile을 재사용함으로써 용량의 이점이 있다.
- 배열적 접근이 이루어질 수 있다.

화면에 그려지는 속도 = 픽셀수
- GPU의 연산때문에 큰 그림이 느릴 수 있다.

TileMap을 그리는 프로젝트를 실습해 본다.
1. line을 이용해 Tile의 Grid를 생성한다.
2. 그려진 각 Tile의 내부에 X, Y 좌표를 출력한다.
3. 마우스 커서 이동 시 어느 타일에 있는지 정보를 표시한다.
4. Tile이 스크롤 되도록 화면을 제어한다.


이와 같은 내용으로 Tile Map을 구현하는 실습이 교육된 것으로 생각 된다.

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

53일 차 교육 내용 메모를 옮겨 본다.
맵 스크롤 기능을 구현하는 데 도움이 되는 내용이 메모로 작성되어 있다.


배열의 크기를 동적으로 늘리거나 줄일 경우에는 ±1씩 증가시키는 것이 아니라 일정한 단위를 지정해 늘리거나 줄여야 한다. (±1씩은 너무 비효율적이다.)

offset의 연산으로 화면이 돌아간다.
- 이동시킬 width 크기를 지정한다.

카메라의 좌표를 가지고 각 개체들의 상대좌표를 계산해 render의 좌표를 설정한다.


수업시간에 맵 스크롤 기능을 구현해 보는 프로젝트를 진행 한것 같다.
그리고 진행하는 중에 도움이 될만한 내용을 메모로 기록해 둔 것으로 보인다.

Unity C# AES 암호화/복호화

유니티에서 C#에서 지원해주는 암호화 기능을 사용해 데이터를 숨기는 기능
로컬에 JSON 형식(string 형식)으로 데이터의 저장 시 정보를 숨기는데 적용이 가능
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

public class AESCrypto : MonoBehaviour
{
    // 키로 사용하기 위한 암호 정의
    private static readonly string PASSWORD = "3ds1s334e4dcc7c4yz4554e732983h";

    // 인증키 정의
    private static readonly string KEY = PASSWORD.Substring(0, 128 / 8);

    // 암호화
    public static string AESEncrypt128(string plain)
    {
        byte[] plainBytes = Encoding.UTF8.GetBytes(plain);

        RijndaelManaged myRijndael = new RijndaelManaged();
        myRijndael.Mode = CipherMode.CBC;
        myRijndael.Padding = PaddingMode.PKCS7;
        myRijndael.KeySize = 128;

        MemoryStream memoryStream = new MemoryStream();

        ICryptoTransform encryptor = myRijndael.CreateEncryptor(Encoding.UTF8.GetBytes(KEY), Encoding.UTF8.GetBytes(KEY));

        CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
        cryptoStream.Write(plainBytes, 0, plainBytes.Length);
        cryptoStream.FlushFinalBlock();

        byte[] encryptBytes = memoryStream.ToArray();

        string encryptString = Convert.ToBase64String(encryptBytes);

        cryptoStream.Close();
        memoryStream.Close();

        return encryptString;
    }

    // 복호화
    public static string AESDecrypt128(string encrypt)
    {
        byte[] encryptBytes = Convert.FromBase64String(encrypt);

        RijndaelManaged myRijndael = new RijndaelManaged();
        myRijndael.Mode = CipherMode.CBC;
        myRijndael.Padding = PaddingMode.PKCS7;
        myRijndael.KeySize = 128;

        MemoryStream memoryStream = new MemoryStream(encryptBytes);

        ICryptoTransform decryptor = myRijndael.CreateDecryptor(Encoding.UTF8.GetBytes(KEY), Encoding.UTF8.GetBytes(KEY));

        CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

        byte[] plainBytes = new byte[encryptBytes.Length];

        int plainCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length);

        string plainString = Encoding.UTF8.GetString(plainBytes, 0, plainCount);

        cryptoStream.Close();
        memoryStream.Close();

        return plainString;
    }

    // 적용 예제
    void Start()
    {
        string str = "원본 문자 정보";
        Debug.Log("plain : " + str1);

        string str1 = AESEncrypt128(str1);
        Debug.Log("AES128 encrypted : " + str1);

        string str2 = AESDecrypt128(str2);
        Debug.Log("AES128 decrypted : " + str2);
    }
}

2019년 5월 26일 일요일

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

52일 차 교육 내용 메모를 옮겨 본다.
이미지의 애니메이션 그리기 방식에 대한 메모가 작성되어 있다.


- 매니저는 생성하고 삭제를 관리하기 위해 만드는 것이다.


Ani 출력 "스프라이트"를 이용
- 이미지를 자를 출력단위로 frame 당 경과 시간으로 출력한다.
- 이에 대한 전용 클래스를 제작해 관리하도록 한다.


그리고 맵스크롤에 자습을 진행했다.


아마도 실습으로 Ani 출력에 대해서 진행한 것 같다.
그리고 남은 시간 맵스크롤에 대해서 찾아보는 자습으로 진행한 것 같다.

Unity - Firebase 연동 (Analytics, AdMob)

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