목록전체 글 (34)
zyeon's 작심삼일 코딩 공부
상태 머신이란 특정 상태에 따라 다른 동작을 수행하는 구조를 의미한다. public enum PlayerState{ idle, move, hit, die,};PlayerState m_playerState;Animator m_playerAnimator;난 enum 열거형을 사용해 플레이어 상태 (idle, move, hit, die) 정의했다.PlayerState m_playerState는 현재 플레이어 상태를 저장할 변수이다. public void ChangeState(PlayerState newState){ if (m_playerState == newState) return; m_playerState = newState; switch (newState) { ..
나는 2D 캐릭터와 3D 배경을 가진 게임을 제작하였다.적합한 표현인지는 모르겠지만 편의상 2.5D 게임이라고 하겠다. 3D 오브젝트와 다르게, 보는 방향에 따라 플레이어 이미지를 달리 해줘야 한다. ▲보는 방향에 따라 다른 캐릭터 이미지나는 좌측/우측(Knight), 후방(Knight_back), 전방(Knight_front) 이미지를 가진 오브젝트를 미리 만들어 두고, 입력에 따라 오브젝트를 활성화, 비활성화 해주기로 했다.좌측 우측은 이미지를 뒤집어 주면 되기 때문에 한가지로 사용하였다. 이를 위해 열거형 Enum을 사용해 플레이어가 바라보는 방향을 나타내었다.//플레이어 방향enum PlayerLook{ front, back, left, right,};PlayerLook m_..
오브젝트 풀링은 객체 생성과 소멸에 따른 비용을 줄이기 위해, 객체들을 미리 생성한 후 사용하는 디자인 패턴이다.나는 반복적으로 나오는 장애물과 아이템에 이 오브젝트 풀링을 사용하였다.오브젝트 풀링은 코드의 유연성, 재사용성, 유지보수성을 높이기 위해 일반적으로 두 개 이상의 클래스를 사용하는 경우가 많다. Poolable 클래스풀에서 관리될 개별 오브젝트의 동작을 정의한다.using System.Collections;using System.Collections.Generic;using UnityEngine;public class Poolable : MonoBehaviour{ //자신이 속한 풀 참조, 상속을 통한 다양한 오브젝트 타입 구현 가능 protected ObjectPool m_po..
싱글톤 패턴은 특정 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 디자인 패턴이다.게임 매니저 처럼 게임 내에서 전역적으로 하나만 존재해야 하는 관리 객체에서 자주 사용한다.우선 인스턴스는 클래스를 기반으로 실제 메모리에 생성된 객체를 의미한다.나는 'GameManager' 클래스를 싱글톤 패턴으로 구현하였다.using System.Collections;using System.Collections.Generic;using UnityEngine;public class GameManager : MonoBehaviour{ public int bestScore = 0; // 클래스의 유일한 인스턴스를 저장하는 정적 변수 private static GameManager _instance; ..
WorldToScreenPoint 는 월드 좌표계에 있는 오브젝트의 위치를 화면 좌표계로 변환할 때 사용한다.반대로 ScreenToWorldPoint는 UI 요소의 위치를 월드 좌표계로 변환할 수 있다.러닝 게임을 하다보면 코인을 획득하면 ui로 빨려 들어가는 모습을 흔히 볼 수 있다.나는 맵에서 획득하는 아이템(별)을 캔버스에 있는 이미지로 이동하는걸 구현해보았다. 2D 처럼 보이지만 2.5D 느낌을 원해서 만든 게임이라 사실은 3D 게임이다. (플레이어로 사용하는 캐릭터 이미지는 '가디언 테일즈' 캐릭터로 한 때 재밌게 플레이해서 가져왔다.)처음에는 ScreenToWorldPoint 를 사용해 오브젝트를 화면 상의 위치로 변환한 후 이동시키도록 구현해 보았다.private IEnumerator Mov..
함수도 메모리의 특정 주소에 저장되며, 이 주소를 함수 포인터에 저장할 수 있다.return_type (*pointer_name)(parameter_types);함수 포인터는 형태(반환형, 매개변수)가 맞는 함수의 주소를 받아 올 수 있다.위와 같은 형태로 선언 해 사용한다.함수 포인터를 사용하는 이유는 무엇일까? 상황이나 조건에 따라 호출하고 싶은 함수를 결정할 수 있기 때문에,함수 포인터는 콜백 함수로 자주 사용되며, 함수 테이블에서 인덱스에 따라 다양한 함수를 호출하는 경우에도 사용한다. #include int add(int a, int b) { return a + b;}int subtract(int a, int b) { return a - b;}int main() { int (*o..
Camera.main을 사용하는데 자꾸 오류가 났다. 카메라의 태그가 MainCamera로 되어있지 않으면 오류가 난다고 했지만 난 잘 설정되어 있었다.Camera 컴포넌트도 잘 가지고 있었고,유니티와 비주얼 스튜디오를 껐다 켜도 해결되지 않았다. Camera mainCamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent();Vector3 screenPosition = mainCamera.WorldToScreenPoint(transform.position); 그래서 이와같이 초기화를 직접해봤는데도 WorldToScreenPoint()가 존재하지 않는다고 오류가 떴다. 알고보니 문제는 내가 Camera.cs 파일을 가지고있어서 였다.클래..
new도 malloc과 같이 메모리를 동적 할당하는데 사용한다.따라서 malloc과 같이 힙 메모리 영역을 사용하고, 사용 후 할당을 해제해줘야 한다. 그렇다면 둘은 무슨 차이가 있을까?메모리 할당 방식int* m = (int*)malloc(sizeof(int) * 10); // malloc 메모리 할당int* n = new int[10]; // new 메모리 할당malloc은 void* 타입이므로, 사용할 때 캐스팅을 해줘야 한다.하지만 new는 별도의 캐스팅이 필요하지 않다.초기화int* a = new int; // 단순 메모리 할당int* b = new int(10); // 10으로 초기화한 객체 생성MyClass* c = new MyC..