Unity GameObject Pooling

유니티 & C#|2019. 12. 25. 01:07

https://github.com/wakeup5/Unity-GameObject-Pooling

간단히 게임오브젝트 풀을 생성하고 불러올 수 있는 라이브러리이다.

사용방법

// Pool of GameObject
public GameObject original1;

IPool<GameObject> pool = Pool.OfGameObject(original1);
pool.ActivateOne(Vector3.zero, Quaternion.identity);

// Pool of MonoBehaviour
public Monster original2; // public class Monster : MonoBehaviour

IPool<Monster> pool = Pool.OfBehaviour(original2);
pool.ActivateOne();

// Pool of Poolable
public Bullet original3; // public class Bullet : Poolable (: MonoBahaviour)

var instance = Pool.OfPoolable(original3).ActivateOne(); // 바로 호출하여 사용 가능
instance.Pool; // Pool에 접근 가능.
instance.Original; // Original Prefab에 접근 가능.

// for RectTransform
public Text floatingDamage;
public RectTransform uiParent;

var pool = Pool.OfBehaviour(floatingDamage, uiParant); // create objects on RectTransform;
pool.ActivateOne();

댓글()

Hyper Block Breaker Black&White

게임 포트폴리오|2019. 12. 24. 20:37

레이저를 발사하여 흰색 블록과 검은 색 블록을 번갈아 가며 파괴하십시오.

Each time the turn changes, the color of the laser changes.
Fire a laser to alternate white blocks and black blocks to destroy them.

 

https://play.google.com/store/apps/details?id=me.waker.hbbbw

'게임 포트폴리오' 카테고리의 다른 글

[Unity] Desert Sniper  (0) 2016.01.31
[Unity] Fall in the hole  (0) 2016.01.31
[Unity] Acace 로봇 대전 게임  (0) 2016.01.31
[3D DirectX3D] 검은사막  (0) 2016.01.31
[2D API]The war? 더워!  (0) 2016.01.31

댓글()

Save over 90% on our largest Mega Bundles!

에셋 스토어에서 최대 90%까지 할인되는 메가 번들을 판매합니다.

https://assetstore.unity.com/browse/mega-bundles

Synty Studios Mega Bundle

이미지를 클릭하여 이동

https://assetstore.unity.com/mega-bundles/synty-studios

Whether you're starting from scratch, working on a game jam or building onto your game, grab 17 of their most popular asset packs at over 90% off, and take your game to new worlds.

처음부터 시작하거나 게임 잼 혹은 게임을 구축 할 때 사용되는 가장 인기있는 자산 팩 17개를 90% 이상 할인 된 가격에 구입하여 새로운 세계로 이끌어보십시오.

World Building Mega Bundle

이미지를 클릭하여 이동

https://assetstore.unity.com/mega-bundles/world-building

From ocean waves to volumetric clouds to trees so realistic you can practically smell them, these assets are the secret sauce in many top game devs' toolkits.

파도에서 구름, 나무에 이르기까지 현실적인 냄새를 맡을 수 있습니다. 이 자산은 최고의 많은 게임의 비밀 개발자 도구 키트입니다.

Snaps Mega Bundle

이미지를 클릭하여 이동

Quickly and easily create prototypes using snap-in 3D frameworks, then swap in complementary AAA-quality art to take your game to the finish line.

스냅인 3D 프레임 워크를 사용하여 프로토 타입을 빠르고 쉽게 만든 다음 보완적인 AAA 품질 아트로 바꾸어 게임을 결승선으로 가져갑니다.

'유니티 & C# > 유니티 에셋 할인' 카테고리의 다른 글

Power Tools Mega Bundle  (0) 2020.07.15

댓글()

Console Project/ 잠시 쉬어갑니다.

C++|2019. 12. 15. 14:31

다른 더 재미난 것을 하기 위해 이 프로젝트는 잠시 쉬어갑니다.

'C++' 카테고리의 다른 글

C++ Sqrt 알고리즘 함수  (0) 2020.01.10
JSON for Modern C++  (0) 2019.12.14
Console Project/7. TileMap  (0) 2019.12.14
Console Project/6. 키 입력  (0) 2019.12.12
Console Project/5. 문자 출력  (0) 2019.12.10

댓글()

JSON for Modern C++

C++|2019. 12. 14. 22:15

https://github.com/nlohmann/json

'C++' 카테고리의 다른 글

C++ Sqrt 알고리즘 함수  (0) 2020.01.10
Console Project/ 잠시 쉬어갑니다.  (0) 2019.12.15
Console Project/7. TileMap  (0) 2019.12.14
Console Project/6. 키 입력  (0) 2019.12.12
Console Project/5. 문자 출력  (0) 2019.12.10

댓글()

Console Project/7. TileMap

C++|2019. 12. 14. 22:12

기약없는 휴식...

작성 중...

 

'C++' 카테고리의 다른 글

Console Project/ 잠시 쉬어갑니다.  (0) 2019.12.15
JSON for Modern C++  (0) 2019.12.14
Console Project/6. 키 입력  (0) 2019.12.12
Console Project/5. 문자 출력  (0) 2019.12.10
Console Project/4.5 중간보고  (0) 2019.12.10

댓글()

Console Project/6. 키 입력

C++|2019. 12. 12. 17:47

 키의 입력은 GetAsyncKeyState()함수를 통해 감지한다. 이 함수로는 단순히 키가 눌렸는지 아닌지만 체크하는 용도로 사용할 것이다.

// Input.h
class GameEngine;
class Input 
{
private:
    static bool currentStates[256];
    static bool prevStates[256];

    static void BeginUpdate();

    friend GameEngine;

public:
    static bool IsKeyDownOnce(int keyCode);
    static bool IsKeyDown(int keyCode);
    static bool IsKeyUpOnce(int keyCode);
};

// Input.cpp
bool Input::currentStates[256];
bool Input::prevStates[256];

void Input::BeginUpdate()
{
    for (int i = 0; i < 256; i++) {
        prevStates[i] = currentStates[i];
        currentStates[i] = GetAsyncKeyState(i) & 0x8000;
    }
}

bool Input::IsKeyDownOnce(int keyCode)
{
    return currentStates[keyCode] && !prevStates[keyCode];
}

bool Input::IsKeyDown(int keyCode)
{
    return currentStates[keyCode];
}

bool Input::IsKeyUpOnce(int keyCode)
{
    return !currentStates[keyCode] && prevStates[keyCode];
}

사용방법  

 키 입력을 체크하기 전에 BeginUpdate함수를 호출하여야 한다.

void Game::Update(float deltaTime)
{
    Input::BeginUpdate();

    if (Input::IsKeyDownOnce(VK_LEFT)) {
        this->dir = 1;
        this->pos.x -= 16;
    }
    else if (Input::IsKeyDownOnce(VK_RIGHT)) {
        this->dir = 2;
        this->pos.x += 16;
    }
}

GetAsyncKeyState를 그대로 사용하므로 함수의 파라메터-키 코드는 https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes링크 참조.

'C++' 카테고리의 다른 글

JSON for Modern C++  (0) 2019.12.14
Console Project/7. TileMap  (0) 2019.12.14
Console Project/5. 문자 출력  (0) 2019.12.10
Console Project/4.5 중간보고  (0) 2019.12.10
Console Project/4. GameLoop  (0) 2019.12.10

댓글()

Console Project/5. 문자 출력

C++|2019. 12. 10. 20:30

 화면에 문자를 출력하기 위해서는 문자에 해당하는 이미지가 있어야 한다. 문자를 입력 받아 원하는 위치에 문자에 해당하는 이미지를 그려넣어야 한다.

아스키 문자 출력

한땀 한땀 직접 그려 넣었다.

 화면에 출력하는 아스키 문자는 0x20 ~ 0x7f 범위 내에 존재한다. 입력받은 문자가 범위 내에 있으면 아스키 문자 이미지에서 해당하는 문자를 그리면 된다.

// ascii code
if (c >= 0x20 && c < 0x7f) {
    int index = c - 0x20;
    int cx = index % 8;
    int cy = index / 8;

    Sprite charSpr = asciiSprite->GetSprite(cx, cy);
    charSpr.DrawTo(buffer, { x, y });
}

한글 문자 출력

초.중.종성을 조합하여 사용.

 한글의 경우에는 좀 복잡한데 유니코드에서의 한글은 0xAC00 부터 0xd7a4까지 자주 사용하는 한글의 조합을 전부 할당해 놓았다. 가갸걔거겨계... 이런식으로 말이다. 이를 출력하기 위해서는 대략 1만여개의 한글 이미지가 필요하다.

 이 대신 결과는 좀 엉성하지만 초.중.종성의 조합으로 한글을 그리는 방법이 있다.

 한글은 유니코드에서 0xac00 ~ 0xd7a4 범위 내에 있으며 초.중.종성을 분해하고 각각에 맞는 이미지를 같이 출력한다.

if (c >= 0xac00 && c < 0xd7a4) {

    // 초중종성 분해
    int in_char = c - 0xAC00;
    int cho = in_char / (0x0015 * 0x001C);
    int jung = (in_char / 0x001C) % 0x0015;
    int jong = in_char % 0x001C;

    if (jung >= 8 && jung < 20) {
        cho += 20;
    }

    koreanSprite->DrawTo(buffer, { x, y }, cho % 10, cho / 10);
    koreanSprite->DrawTo(buffer, { x, y }, jung % 10, (jung / 10) + 4);
    koreanSprite->DrawTo(buffer, { x, y }, jong % 10, (jong / 10) + 7);
}

 

아주 못 읽을 정도는 아니다.

문장 출력

 문장을 출력할 때에는 문자 하나하나가 알맞는 위치에 출력되어야 한다. 이를 위해서는 각 글자의 폭을 구한 다음 출력할 때마다 위치를 이동시키면 된다.

TCHAR* input = "안녕하세요. Waker입니다. 가나다라마바사~";
RECT rect = { 0, 0, 100, 100 };

int x = rect.left;
int y = rect.top;

int length = wcslen(text);
	
for (int i = 0; i < length; i++) {
    TCHAR c = input[i];
    
    if (IsAscii(c)) {
        
        // 입력하려는 문자가 폭을 넘어서면
        // 다음 줄로 이동한다.
        if (x + 8 > rect.right) {
            x = rect.left;
            y += 16;
        }
        
        // 문자를 입력하는 범위를 넘어서면
        // 출력을 중단한다.
        if (y > rect.bottom) {
           break;
        }
        
        // Output ascii
        Sprite s = ascii->GetTextSprite(c);
        s->DrawTo(x, y);
        
        // 다음 위치로 이동.
        x += 8;
        
    }
    
    if (IsKorean(c)) {
        ...
    }
}

'C++' 카테고리의 다른 글

Console Project/7. TileMap  (0) 2019.12.14
Console Project/6. 키 입력  (0) 2019.12.12
Console Project/4.5 중간보고  (0) 2019.12.10
Console Project/4. GameLoop  (0) 2019.12.10
Console Project/3. 이미지  (0) 2019.12.10

댓글()

Console Project/4.5 중간보고

C++|2019. 12. 10. 14:03

간단히 타일과 캐릭터의 애니메이션을 출력한다.

'C++' 카테고리의 다른 글

Console Project/6. 키 입력  (0) 2019.12.12
Console Project/5. 문자 출력  (0) 2019.12.10
Console Project/4. GameLoop  (0) 2019.12.10
Console Project/3. 이미지  (0) 2019.12.10
Console Project/2. 출력 버퍼  (0) 2019.12.09

댓글()

Console Project/4. GameLoop

C++|2019. 12. 10. 13:59

 게임 루프는 일정한 입, 출력 속도를 보장하고, 예기치 못한 렉에 유연하게 대응할 수 있어야 한다.

Game 클래스

Game클래스는 게임의 초기화 및 업데이트, 렌더링을 담당하는 게임의 최상위 클래스이다. 모든 게임에 대한 코드는 해당 클래스 내에서 작업 하게 된다.

class Game
{
private:
    int width;
    int height;

    bool exit;
public:
    Game(int width, int height);
    void Release();
    void Update(float deltaTime);
    void Render();

    inline bool IsExit() { return exit; }
};

GameLoop

void main() {
..

Game game(SCREEN_WIDTH, SCREEN_HEIGHT);
int targetFPS = 25;
int targetFrameMS = 1000 / targetFPS;

ULONGLONG lastTime = GetTickCount64();

while (true) {
    
    ULONGLONG current = GetTickCount64();
    ULONGLONG elapsed = current - lastTime;

    game.Update(elapsed / 1000.f);

    if (game.IsExit()) {
        break;
    }

    game.Render();

    if (targetFrameMS > elapsed) {
        Sleep(targetFrameMS - elapsed);
    }
    
    lastTime = current;
}

game.Release();

..

'C++' 카테고리의 다른 글

Console Project/5. 문자 출력  (0) 2019.12.10
Console Project/4.5 중간보고  (0) 2019.12.10
Console Project/3. 이미지  (0) 2019.12.10
Console Project/2. 출력 버퍼  (0) 2019.12.09
Console Project/1. 화면  (0) 2019.12.09

댓글()