목록Game Dev (261)
KoreanFoodie's Study
윈도우 API 프로그래밍 5 : 물체 떨어뜨리기 이번 글에서는 간단한 물체를 떨어뜨리는 기능을 구현하며 다른 디테일을 설명한다. WM_CREATE case WM_CREATE:// 프로그램이 실행 될 때 한번 호출 된다. (초기화) SetTimer(hWnd, 1, 10, NULL); srand(time(NULL)); break; 초기화 함수를 통해 타이머를 SET 하고, 랜덤 함수를 호출한다. WM_TIMER case WM_TIMER:// 타이머에 의해서 호출 { InvalidateRect(hWnd, NULL, true); // 포지션 위치에 따른 렉트 정보 업데이트 rtBox1 = RECT_MAKE(ptPos1.x, ptPos1.y, 50); if (nDelay == 50) { RECT rt; rt.le..
윈도우 API 프로그래밍 4 : 충돌 검사 (IntersectRect...) 이번 글에서는 도형이 다른 도형과 만났을 때 이를 어떻게 구현하고 처리하는지를 살펴본다. WM_TIMER에서 IntersectRect를 넣어보자 // 아래 두 줄은 전역변수로 선언함 enum MOVE_DIR { MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN }; MOVE_DIReMoveDir; // ... case WM_TIMER:// 타이머에 의해서 호출 InvalidateRect(hWnd, NULL, true); // 포지션 위치에 따른 렉트 정보 업데이트 rtBox1 = RECT_MAKE(ptPos1.x, ptPos1.y, 100); rtBox2 = RECT_MAKE(ptPos2.x, ptPos..
윈도우 API 프로그래밍 3 : 키 입력과 게임 업데이트 이번 글에서는 WIM_KEYDOWN을 통한 키 입력에 대해 알아보도록 한다. 키 입력 처리하기 case WM_CREATE:// 프로그램이 실행 될 때 한번 호출 된다. (초기화) SetTimer(hWnd, 1, 10, NULL); break; case WM_TIMER:// 타이머에 의해서 호출 InvalidateRect(hWnd, NULL, true); break; case WM_KEYDOWN:// 키 입력이 있을 때 마다 호출 된다. switch (wParam) { // 삼항식 (조건) ? 참일 때 : 거짓일 때 case 'A': case VK_LEFT: ptPos.x -= (ptPos.x > 0) ? 1 : 0; break; case 'D': ..
윈도우 API 프로그래밍 1 : 창 생성 및 기본 세팅 먼저 비주얼 스튜디오(2019)에서 Windows 데스크탑 애플리케이션 프로젝트를 생성하자. 그럼 아래와 같은 식으로 프로젝트가 생성되는데, 이중 framework.h, WindowsProject1.cpp 파일이 자동 생성되고, 이 부분을 고치면서 기능을 구현한다. framwork.h 파일은 헤더 파일이나 매크로 선언, 변경이 거의 없는 변수 등을, WindowsProject1.cpp 파일에서는 타이머나 페인팅을 포함하고 있다. framework.h // header.h: 표준 시스템 포함 파일 // 또는 프로젝트 특정 포함 파일이 들어 있는 포함 파일입니다. // #pragma once #include "targetver.h" #define WIN..
벡터 벡터는 방향과 크기를 가진다. 벡터 (1, 0, 2)이 있을때, 해당 벡터의 크기는 sqrt(1^2 + 2^2)이 된다. 유니티는 Vector2, Vector3, Vector4 타입을 지원한다. 새로운 벡터를 만들 때는 생성자를 호출하면 된다. // Vector는 클래스가 아니라 구조체이다! public struct Vector3 { public float x; public float y; public float z; // Vector3 내부 코드 } Vector3 a = new Vector3(0, 0, 0); Vector3 b = a; b.x = 100; 벡터의 연산 내적과 외적의 의미를 이해하는 것이 중요하다. 백터의 내적은 Dot Product라고하는데, a · b 라고 하면, 벡터 b를 a의..
바닥 회전 Rotate( ) 메서드를 이용해서 물체를 회전시킬 수 있다. public class Rotator : MonoBehaviour { public float rotationSpeed = 60f; // Update is called once per frame void Update() { transform.Rotate(0f, rotationSpeed * Time.deltaTime, 0f); } } 위에서 rotationSpeed에 Time.deltaTime을 곱합으로써, 어떤 기기에서도 안정적으로 1초마다 rotationSpeed만큼의 각도의 회전을 줄 수 있다. Update( ) 는 1프레임마다 실행되며, Time.deltaTime은 ( 1 / 초당 프레임 수)이므로, 프레임이 60이든 120이든..
프리팹 게임 오브텍트는 프리팹으로 만들어 재활용할 수 있다. 마치, 칼을 찍어내는 주물이라고 생각하면 된다! 사용법은 간단하다. Hierarchy에 있는 오브젝트를 프로젝트 창에 드래그&드랍 해주기만 하면 된다! Use Gravity 리지드 바디 컴포넌트의 Use Gravity 필드를 해제하면 중력의 영향을 받지 않는다. transform 변수 transform은 스크립트에서 자신의 트랜스폼 컴포넌트로 바로 접근하는 지름길이다! Destroy( ) void Start() { // 이동에 사용할 리지드바디 컴포넌트 할당 bulletRigidbody = GetComponent(); // 리지드바디의 속도 = 앞쪽 방향 * 이동 속력 bulletRigidbody.velocity = transform.forwa..
머티리얼 게임 오브젝트의 컬러는 머티리얼(Material)이 결정한다. 머티리얼은 셰이더와 텍스쳐가 합쳐진 에셋으로, 오브젝트의 픽셀 컬러를 결정한다 셰이더는 주어진 입력에 따라 픽셀의 최종 컬러를 결정하는 코드이다. 셰이더는 질감과 빛에 의한 반사와 굴절 등의 효과를 만든다. 텍스처는 표면에 입히는 이미지 파일이다. 셰이더는 물감으로, 텍스처는 스케치나 밑그림으로 이해하면 된다. 밑그림이 같아도 물감의 종류에 따라 화풍이 달라진다! 이 중 알베도(Albedo)는 반사율이라는 뜻으로, 물체가 어떤 색을 반사할지를 결정한다! C# 스크립트 이제 기초적인 코드들을 살펴보자. void FixedUpdate() { if (Input.GetKey(KeyCode.UpArrow) == true) { playerRig..
목표 : 씬에 큐브를 하나 만들고, 코드로 해당 큐브가 점프하게 만들어 보자! 1. Hierarchy 탭에서 3D Object 큐브를 하나 생성하기 2. 변수로 리지드 바디 컴포넌트 사용하기 (Inspector -> Add Component) 3. 프로젝트 창에서 Create > C# Script 클릭, 이름을 Jumper로 변경한 후 열기! C#에서는 초기 파일 이름과 동일한 클래스가 생성되므로, 이름을 잘 맞추어 주어야 한다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Jumper : MonoBehaviour { public Rigidbody myRigidbody; // Start..
상속? 객체 지향언어에서 상속을 사용하면 기존에 만들어놓은 템플릿을 확장/수정함으로써 비슷한 템플릿을 만들 수 있다. (상속에 대해 잘 모른다면 여기를) 그런데 예를 들어, "HUMAN"이라는 클래스를 만들었다고 하자. 만약 이 클래스를 확장시켜 플레이어, NPC, 심지어 몬스터까지 만든다면 어떨까? 각각의 오브젝트는 성격이 매우 다르기 때문에 오히려 상속을 통한 작업이 효율을 떨어뜨릴 수 있다. 따라서, 컴포넌트 패턴을 알아야 한다. 컴포넌트 패턴 기획자는 게임에 등장할 모든 동물을 사전에 기획할 수 없다. 즉, 부품마다 대표 기능을 부여하고, 여러 부품을 게임 오브젝트에 조합하는 방식이 효율적이다! 1. 컴포넌트를 미리 여러 개 만들기 2. 빈 게임 오브젝트 생성하기 3. 코뿔소 게임 오브젝트 완성하..