전체 글

Hello World!
1. 개요Unreal Engine으로 RPG 전투 시스템을 구현하면서 가장 먼저 고민했던 부분은 전투 로직을 어디에 배치할 것인지였다. 단순한 공격 기능만 필요로 한다면 Character 클래스 안에서 입력을 받고, 공격 애니메이션을 재생하고, 충돌 판정을 통해 데미지를 주는 방식으로도 구현이 가능하다. 허나, 프로젝트가 확장되면서 스킬, 장비, 상태 이상, 회복, 버프, 디버프, 쿨타임 제어와 같은 요소가 추가되면 Character 클래스가 빠르게 비대해질 가능성이 있다. 이 문제를 해결하기 위해 Unreal Engine의 Gameplay Ability System, 즉 GAS를 사용하였다. GAS를 사용하게된 이유는 단순히 스킬 시스템을 만들기 위해서가 아닌, 전투에 필요한 기능을 Ability, ..
Header. Con_CharacterBase.h// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "GameFramework/Character.h"#include "AbilitySystemInterface.h"#include "AbilitySystemComponent.h"#include "Con_CharacterBase.generated.h"UCLASS()class CONTAINER_API ACon_CharacterBase : public ACharacter, public IAbilitySystemInterface{ GENERATED_B..
· Unity
I. 카메라의 중요성플레이어의 시야를 구성하는 카메라는 단순한 시각 도구가 아닌, 게임 경험 전체를 좌우하는 핵심 요소이다.특히 3D 게임에서 얼마나 자연스럽게 카메라가 따라붙는가에 따라 몰입도에 큰 영향을 미친다. II. 기존 카메라 시스템의 한게처음에는 Transform.position을 이용해 카메라를 따라가도록 구현했으나,다음과 같은 문제가 있다.움직임이 딱딱하고 부자연스러움장애물에 카메라가 가려짐 특정 상황 (점프, 충돌 등) 에서 카메라 반응이 자연스럽지 않음 III. Cinemachine을 도입하게 된 계기보다 매끄럽고 안정적인 카메라 제어를 위해 Unity의 Cinemachine을 도입하였음 IV. Virtual Camera 구성 및 핵심 설정 Package Manager를 통해 Cine..
OOP란?OOP는 소프트웨어 설계 패러다임 중 하나로, 데이터를 객체(Object)라는 단위로 묶고, 이 객체들이 데이터를 처리하는 방식을 정의한다.주요 특징들은 다음과 같다.I. 캡슐화(Encapsulation)캡슐화는 데이터와 메서드를 객체 안에 숨겨 외부 접근을 제한하고, 데이터를 보호하는 특징을 가진다.외부에서는 클래스에서 제공하는 공용(public) 인터페이스에만 접근할 수 있다.이 방식은 다음과 같은 장점을 지닌다. - 데이터 무결성 : 잘못된 접근이다 수정으로부터 데이터를 보호한다. - 코드 변경 용이성: 내부 구현을 변경하더라도 외부에 영향을 최소화할 수 있다. 다음은 캡슐화의 예제이다.#include using namespace std;class BankAccount {private: ..
· Unity
마우스 우클릭 이동 구현using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.AI;using UnityEngine.TextCore.Text;public class ClickMove : MonoBehaviour{ //마우스의 위치를 월드 좌표계로 표시하기 위해 선언 private new Camera camera; private NavMeshAgent agent; private Animator anim; //캐릭터가 움직이고 있는지 확인 private bool isMove; //캐릭터 목표 위치 기억 private Vector3 destination; ..
· Unity
Coroutine먼저 Unity에서 Update() 메소드는 매 프레임마다 호출해 변화를 일으키기 위해 사용하고는 한다.60fps라면 1초에 60번 호출이 된다. 그런데 만일, 5초동안 지연을 시켜야하는 상황이 발생 한다면 어떻게 될까? 단순하게 Update() 메소드를 300번 (5 * 60) 호출하면 될 것이다.하지만 이러한 딜레이가 발생하는 상황을 모두 Update() 구문에 정의하게 되면 사용자의 환경에 따라 프레임 드랍을 발생시킬 수 있다.  이를 개선하기 위해 Coroutine을 사용하면 Update() 함수를 굳이 300번이나 호출하지 않고도시간을 효율적으로 지연시킬 수 있다.Coroutine 사용 예제먼저 Coroutine을 사용하지 않은 예제를 살펴보겠다.using UnityEngine;..
· Etc.
레파지토리를 클론 후 Git Bash 창을 통해커맨드를 입력하여 깃허브에 파일 및 폴더를 업로드 하는 방법입니다.  1. Code 버튼 누르기레파지토리에서 우측 상단의 Code 버튼을 누르고 HTTPS 주소를 복사합니다. 2. 터미널(Bash) 창에서 클론클론하려는 디렉터리로 가서 Bash를 열고git clone  커맨드를 입력 후 실행합니다.터미널에서 우클릭으로 붙여넣을 수 있습니다. 그러면 지정된 디렉토리에 클론된 폴더가 생성됩니다.3. 폴더 생성클론된 폴더로 들어가서다음 명령어를 입력 후 실행합니다. mkdir 그냥 폴더 안에서 새 폴더 만들어도 무방합니다. 4. 폴더에 파일 업로드폴더에 작성한 소스코드 파일을 넣습니다.저는 보통 Visual Studio에서 작성한 코드파일을 붙여넣습니다. 5. 추..
· Algorithm
https://www.acmicpc.net/problem/5430함수 R : 배열에 있는 수를 뒤집는다. 처음에는 배열을 직접 뒤집는 함수를 구현했으나, 시간이 너무 오래 걸려bool을 사용해 함수를 뒤집었다고 인식하게 하였다. (Reverse = false : 뒤집지 않음, Reverse = true : 뒤집음) 함수 D : 배열의 첫번쨰 수를 제거한다. 즉, Reverse = false인 경우 배열의 첫번쨰 수를 제거(front) 하고, Reverse = true인 경우 배열의 마지막 수를 제거한다(end)    배열이 비었을 떄 D를 사용 시 error를 출력한다. 여기까지는 배열만 입력해서 출력하는 간단한 문제인 줄 알았으나,배열을 대괄호 안에 쉼표로 구분하여 입력해야 한다.  getline과 s..
· Algorithm
https://www.acmicpc.net/problem/7662문제를 정리하자면,1. 이중 우선순위 큐: 데이터의 삽입과 삭제가 가능한 자료 구조로, 삭제할 때 우선순위가 가장 높은 데이터 또는 가장 낮은 데이터를 삭제할 수 있는 이중 우선순위 큐를 구현한다. 2. 명령어:- I n : 정수 n을 큐에 삽입하는 연산- D 1: 큐에서 최댓값을 삭제하는 연산- D -1: 큐에서 최솟값을 삭제하는 연산 3. 입력과 출력:I. 첫 번째 줄에 테스트 데이터의 수를 나타내는 정수 T, 각 테스트 데이터는 k개의 연산으로 구성된다.II. 각 연산은 문자 ('D' 또는 'I') 와 정수 n으로 이루어져 있다.III. 각 테스트 데이터에 대해, 모든 연산을 처리한 후 큐에 남아 있는 값 중 최댓값과 최솟값을 출력IV..
· Algorithm
https://www.acmicpc.net/problem/10026구역을 나누는 문제는 보통 BFS나 DFS로 해결할 수 있다. 필자는 DFS를 이용하였다. 먼저 구역을 나누는 함수를 구현 후, 색약이 바라보는 구역을 구현하기 위해G를 R로 변환하는 함수를 구현한다.   코드#include #include using namespace std;const int dx[] = { -1, 1, 0, 0 };const int dy[] = { 0, 0, -1, 1 };void dfs(vector>& grid, vector>& visited, int x, int y, char color){ visited[x][y] = true; // 방문 위치를 방문했다고 저장 for (int i = 0; i = 0 &&..
alsrudwls01
Develop.Log