chvj7567의 등록된 링크

 chvj7567로 등록된 네이버 블로그 포스트 수는 308건입니다.

캣팡(CatPang) - (3매치 퍼즐 게임) [내부링크]

캣팡(CatPang) - Apps on Google Play 매우 어려운 3매치 퍼즐 게임입니다. play.google.com 매우 어려운(?) 3매치 퍼즐 게임이다. 난이도는 뭔가 쉽게 하기는 싫어서 하드 모드 부터는 타이트하게 난이도를 잡았다. 우선 스테이지도 직접 맵을 제작해야하고 플레이 해보고 목표 점수를 지정해야하기에 어렵게 한 것도 있다. 맵 생성이 번거로워서 맵 생성 툴도 만들었고 특수 블럭들도 뒤로 갈 수록 많이 추가했지만 많이 추가하지는 못했다. 그 외에도 GPGS 로그인, 애드몹, 인앱 결제, 랭킹 등을 구현해보았다. 나름 미션도 넣어보고 상점도 넣어보고 했지만 뭔가 그 조잡함은 어쩔 수가 없다.. UI를 대부분 친구의 그림과 내 그림으로 배치해서 그런거 같기도 하다. 기획과 UI 디자인 등이 어렵다는 것을 느꼈지만 목표는 기능 구현이기에 만족해야겠다. 다음 프로젝트에는 퀄리티와 컨텐츠 구현에 조금 힘을 써봐야겠다. 개인 공부 블로그입니다. 틀린 점이나 기타 문의는

A*(길 찾기) 알고리즘 - 구현 [내부링크]

A* 알고리즘은 주어진 지점에서 목표 지점까지 가는 최단 경로를 찾아내는 그래프 탐색 알고리즘 중 하나이다. A* 는 F = G + H라는 공식을 사용하는데 F 값이 적을 수록 최적의 경로를 나타낸다. G는 다음 경로를 가는데 필요한 비용 H는 현재 지점에서 목표 지점까지의 추정 비용 H가 A* 알고리즘의 핵심인데 휴리스틱(heuristic) 이라고 불린다. 길 찾기 알고리즘 중 A* 알고리즘과 더불어 유명한 것이 다익스트라 알고리즘이다. 다익스트라에 대해서는 아래 링크를 참조 바란다. 다익스트라(Dijkstra) - 구현 다익스트라는 목표 노드 부터 각 노드까지 최단경로를 구할 때 쓰는 알고리즘이다. 아래 그림을 통해 확인... blog.naver.com 다익스트라 알고리즘은 휴리스틱이 0인 A* 알고리즘이라고 보면 된다. A*에서는 목표 지점까지의 가중치를 추가함으로써 다익스트라 알고리즘에 백트래킹 기법을 더한 것이라고 볼 수 있다. 일반적으로 휴리스틱의 값은 현재 지점에서 목표

젠킨스(Jenkins) 플러그인 다운로드 오류 [내부링크]

젠킨스 관리에서 플러그인을 누른다. 사이트 경로가 https로 되어있으면 http로 변경해준다. skip-certificate-check 플러그인이 깔려있지 않다면 Availabe plugins에서 설치한다. 이후 다른 플러그인들을 설치하면 잘 된다..! http://젠킨스_주소/safeRestart 중간 중간 잘 안된다면 재시작을 해주자. 위 URL을 검색창에 입력하면 재시작 버튼이 뜬다. 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일 부탁드립니다. [유니티 어필리에이트 프로그램] 아래는 유니티 구독 및 학습 등에 대한 정보이며, 해당 링크를 통해 유니티를 구독하시면 수익의 일부가 블로거에게 공유되어, 블로그 운영에 도움이 됩니다. Unity Plus Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store Have a 2D, 3D, VR

유니티 에셋 추천<2> [내부링크]

1. DOTween DOTween Pro | Visual Scripting | Unity Asset Store Get the DOTween Pro package from Demigiant and speed up your game development process. Find this & other Visual Scripting options on the Unity Asset Store. prf.hn DOTween은 무료 버전과 유료 버전이 있으며 무료 버전만 써도 충분하지만 유료 버전을 사서 추가 기능을 사용하는 것도 추천한다. 자세한 내용은 예전에 쓴 글이 있으니 아래 링크를 참조바란다. 유니티(Unity) - 두트윈(Dotween) 두트윈이란 유니티 에셋 중에 하나이며, Tweening 애니메이션을 생성하고 관리하는 데 필요한 모든 기능을... blog.naver.com 2. Odin Inspector and Serializer Odin Inspector and Serialize

유니티 에셋 추천<1> [내부링크]

1. A* Pathfinding Project Pro A* Pathfinding Project Pro | Behavior AI | Unity Asset Store Get the A* Pathfinding Project Pro package from Aron Granberg and speed up your game development process. Find this & other Behavior AI options on the Unity Asset Store. assetstore.unity.com 유니티의 Navmesh보다 확장된 기능 및 성능적 개선이 많이 된 A* 길찾기 에셋이다. 실제로 해당 에셋을 사용하는 프로젝트가 많고(TD, FPS, RTS 등) 가이드도 많이 있으므로 한 번 사두는 것도 나쁘지 않아보인다. 2. Hot Reload Hot Reload | Edit Code Without Compiling | Utilities Tools | Unity Asset Store

OSI 모델 7계층 [내부링크]

OSI란 Open Systems Interconnection의 줄임말로 OSI 모델은 네트워크 통신 기능을 7개의 계층으로 나눈 개념적 프레임워크이다. 만약 집에 인터넷이 안되는 경우 기사님이 방문하여 무엇이 잘못되었나 확인을 할 때 해당 계층을 하나씩 검사하여 잘못된 부분을 고쳐주신다고 한다. 1계층 - 물리 계층(Physical Layer) 물리 계층은 데이터 전송을 위해 데이터가 1과 0의 문자열인 비트 스트림으로 변환되는 계층이다. ex) 케이블 : 전선 허브 : 중계기 역할을 하며 다수의 PC를 하나의 노드로 모아주는 장치 리피터 : 신호를 증폭시켜 더 먼 거리까지 데이터를 전달해주는 장치 2계층 - 데이터 링크 계층(Data Link Layer) 3계층에서 데이터 단위인 패킷을 프레임이라고 불리는 더 작은 조각으로 세분화한다. 정보의 흐름 제어와 오류를 관리하여 재전송 등이 가능하며, 안전한 정보 전달을 담당하는 계층이다. ex) 스위치, 브리지 : 수신지 위치 판단하기에

TCP / IP (3-Way / 4-Way Handshake) [내부링크]

패킷(Packet) 전송 방법(Port / TCP / UDP) 위 링크의 IP에 대해 먼저 알고 오면 도움이 되니 참조바란다. 패킷(Packet) 패킷이란 네트워크에서 정... blog.naver.com TCP 관해서는 위 링크를 참조바란다. 3-Way Handshake 3번의 통신을 통해 TCP / IP 통신을 연결하는 단계이다. 서버가 켜지고 클라이언트를 받을 수 있는 Listen 상태 클라이언트가 서버에게 접속 요청(SYN) 클라이언트는 요청 응답을 대기하는 SYN - Sent 상태 서버는 클라이언트의 접속 요청(SYN)을 받고 서버가 클라이언트에게 접속 요청(SYN)과 클라이언트가 서버에게 요청한 접속 요청 응답(ACK)를 보냄 서버는 접속 요청(SYN)을 받은 SYN - Received 상태 클라이언트는 접속 요청 응답(ACK)를 받고 Established 상태 클라이언트는 접속 요청 응답을 잘 받았다고 서버에게 응답(ACK)를 보냄 서버는 클라이언트 응답(ACK)를 받고

아이피(IP) [내부링크]

IP IP는 Internet Protocol의 줄임말로 사전적인 의미로 인터넷에 연결되어 있는 네트워크에서 정보를 송수신하는 통신에 대한 규약을 의미한다. IP 주소 IP 주소는 위에서 말한 통신에 대해 필요한 고유한 주소이다. IP는 IPv4와 IPv6로 나뉘어지는데 cmd창에서 ipconfig를 통해 자신의 IP 주소를 확인할 수 있다. IPv4 32비트 방식으로 이루어짐 8비트씩 4개로 구분되며, 점(.)으로 구분한다. 현재는 IPv4 주소가 고갈되어 더 이상 발급되지 않는다. 사용 중인 곳이 많기 때문에 아직도 사용은 가능하다. IPv6 128비트 방식으로 이루어짐 16비트씩 8개로 구분되며, 콜론(:)으로 구분한다. 이론 상 2의 128제곱 개의 주소를 가질 수 있어 사실 상 고갈 걱정이 없다. 공인 IP / 외부 IP / Public IP 3가지 모두 같은 말이며, 통신업체에서 제공하는 IP를 의미한다. 흔히 인터넷을 설치하면 벽에 랜선을 연결하는데 거기서 오는 IP이다.

패킷(Packet) 전송 방법(Port / TCP / UDP) [내부링크]

아이피(IP) IP IP는 Internet Protocol의 줄임말로 사전적인 의미로 인터넷에 연결되어 있는 네트워크에서 정보... blog.naver.com 위 링크의 IP에 대해 먼저 알고 오면 도움이 되니 참조바란다. 패킷(Packet) 패킷이란 네트워크에서 정보를 주고 받기 위한 데이터 블록이다. 패킷을 전송하는 방법으로는 크게 2가지(TCP / UDP)가 있다. 각각 패킷의 구성은 다르겠지만 공통적으로 송수신지의 IP, Port, 전송하는 데이터를 가지고 있다. 포트(Port) 포트는 USB나 HDMI 등의 하드웨어적인 포트도 있지만 TCP / UDP에서 어플리케이션 구분을 위해서 사용하는 네트워크 포트도 있다. 쉽게 말하면 IP 주소를 통해 수신자의 컴퓨터에 도착은 했는데 어느 프로그램에 이 패킷을 전송해야되는지를 구분하는 용도이다. 포트 범위는 0 ~ 65535이고 0 ~ 1023은 이미 사용되고 있는 특수 포트 번호라고 보면된다. FTP - 20, 21 (TCP) SS

구조적 바인딩(Structured Binding) [내부링크]

C++17 부터는 구조적 바인딩을 제공한다. 우선 C++ 14에서 구조적 바인딩이 나오기 전의 예시를 보자. auto GetPair() { return std::pair<int, int> {1, 2}; } auto GetTuple() { return std::tuple<int, int, int> {10, 20, 30}; } 위 처럼 Pair와 Tuple을 반환하는 함수를 정의한다. Pair와 Tuple에 관해서는 아래 링크를 참조바란다. 페어(pair) - 타입 pair는 데이터 타입 두 가지를 하나로 묶어주는 일종의 데이터 타입이다. 1. make_pair() - 선언 utility ... blog.naver.com 튜플(tuple) - 타입 tuple은 데이터 타입 두 가지 이상을 하나로 묶어주는 일종의 데이터 타입이다. 1. make_tuple - 선언 tupl... blog.naver.com 위 함수에서 값을 출력하는 방법이다. auto value = GetPair(); st

유니티(Unity) - Action 이벤트 등록 해제 [내부링크]

다른 스크립트의 Action 이벤트 등록 시 중복 등록되지 않도록 이벤트를 등록하는 오브젝트가 파괴될 시 이벤트 등록을 해제하도록 한다. public class ActionScript : MonoBehaviour { public Action action; } ActionScript의 해당 Action을 참조한다고 가정하자. public class Test : MonoBehaviour { public ActionScript actionScript; private void Start() { actionScript.action += Func; } private void OnDestroy() { actionScript.action -= Func; } void Func() { } } 이런 식으로 OnDestroy 시에 등록한 이벤트를 해제해줘야한다. 만약 Test 스크립트를 포함한 오브젝트가 지속적으로 생성 파괴되는 오브젝트이고 OnDestory에서 이벤트 해제를 안했다면 이벤트가 중복 등록

if, switch 문에서 초기화 [내부링크]

지역 변수의 경우 스택 메모리에 저장되며 선언된 중괄호 내에서만 존재하며 중괄호가 끝나면 소멸된다. #include <iostream> int main() { { int a = 1; std::cout << a; // 1 } std::cout << a; // compile error } 간단한 예시를 보면 중괄호 내에서 a를 선언하면 중괄호 밖에서는 컴파일 에러가 뜬다. 지역 변수의 경우 쓰지 않는 범위 내에서 메모리가 낭비되기 때문에 이를 효율적으로 사용하기 위해 C++ 17부터 if, switch 문에서 초기화를 할 수 있는데 아래 적용 전 후 예시를 보자. if문 초기화 적용 전 #include <iostream> #include <vector> int main() { std::vector<int> v{ 1, 2, 3 }; auto find = std::find(v.begin(), v.end(), 1); if (find != v.end()) { std::cout << *find

constexpr(const 차이, #if문) [내부링크]

1. const 차이 const와 constexpr은 모두 상수를 정의하지만 차이가 있다. const : 런타임 시간에 값을 결정 constexpr : 컴파일 시간에 값을 결정 아래 예시를 보자. int a = 1; // 가능 const int b = 1; // 가능 constexpr int c = 1; // 가능 모두 가능하다. int a = 1; // 가능 const int b = a; // 가능 constexpr int c = a; // 불가능 const는 런타임 시간에 a라는 값이 1인 것을 인지한 후 상수로 정의되지만, constexpr 컴파일 시간에 a라는 값이 1인 것을 알 수 없어서 에러가 난다. 2. #if문 #if문은 조건부 컴파일을 하기 위한 전처리기인데 사실 불편한 적이 많다. 들여쓰기 문제랑 코드 자체가 블러처리되듯이 되어 코드 보기가 힘들다. #ifdef _WIN64 std::cout << "This is 64 bit system" << std::endl;

Inline Variable(인라인 변수, static 변수) [내부링크]

인라인 변수와 static 변수의 차이는 기존 클래스 내의 static 변수는 선언은 가능하지만 초기화가 동시에는 불가능하였는데 inline 키워드를 통해 초기화가 동시에 가능하다는 특징이 있다. #include <iostream> class A { public: static int a; // 초기화 불가능 }; class B { public: static inline int b = 2; // 초기화 가능 }; int A::a = 2; // 전역에서 초기화 가능 int main() { A a; B b; std::cout << a.a << std::endl; // 2 std::cout << b.b << std::endl; // 2 } 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일 부탁드립니다. [유니티 어필리에이트 프로그램] 아래는 유니티 구독 및 학습 등에 대한 정보이며, 해당 링크를 통해 유니티를 구독하시면 수익의 일부가 블로거에게 공유되어, 블로그 운영에 도움

유니티(Unity) - 동기(Sync), 비동기(Async) [내부링크]

프로그램이 A 작업을 하고 B 작업을 하도록 짜여있을 때 동기 프로그래밍은 A작업을 시작하고 A 작업을 모두 끝마친 후 B 작업을 하는 것을 의미한다. 비동기 프로그래밍은 A작업을 시작하고 B 작업도 시작하면서 동시에 실행되도록 하는 것을 의미한다. 싱글 스레드의 경우 비동기 프로그래밍은 A작업 조금 하고 B작업 조금하고 왔다갔다 하는 식으로 동작하는 것이다. 위 예시에서 작업은 Task라고 하고 동기, 비동기는 aysnc await로 나타낼 수 있다. using System.Threading.Tasks; Task 사용을 위해 using을 추가한다. async Task TaskFunc() { for (int i = 0; i < 100; i++) { await Task.Delay(1000); Debug.Log($"@{i}"); } } TaskFunc 함수를 보면 비동기로 나타낼 수 있도록 async를 달아주었고 함수에는 Task.Delay를 통해 1초마다 i값을 0부터 증가하여 99까

유니티(Unity) - Task 취소 [내부링크]

유니티(Unity) - 동기(Sync), 비동기(Async) 프로그램이 A 작업을 하고 B 작업을 하도록 짜여있을 때 동기 프로그래밍은 A작업을 시작하고 A 작업을... blog.naver.com 위 링크를 참조 후 해당 글을 읽기 바란다. Task를 통하여 딜레이가 걸려있는 경우 딜레이 동안 오브젝트가 파괴되어 Null이 되거나 하며 Null참조나 Missing 에러가 발생할 수 있다. 이를 방지하기 위해 이후 작업을 실행할지 말지 결정하도록 할 수 있다. using System.Threading; 해당 using을 추가한다. using System.Threading; using System.Threading.Tasks; using UnityEngine; public class Test : MonoBehaviour { async void Start() { while (true) { await Task.Delay(1000); Debug.Log(gameObject.name); } }

성공/실패 여부와 값 처리(std::optional) [내부링크]

코드를 짤때 getter를 쓰는 경우 정상적으로 값을 가져오는지 그리고 정상적인 값을 가져왔을 경우 해당 값이 무엇인지 두 가지를 반환해야하는 경우가 많이 발생한다. 1. 반환 값, 참조형 변수 bool GetIntValue(std::vector<int>& v, int find, int& value) { auto vit = std::find(v.begin(), v.end(), find); if (vit == v.end()) return false; value = *vit; return true; } 성공 여부를 함수 반환 값으로 받고 값은 참조형 변수로 받는 방법이다. 2. std::pair std::pair<bool, int> GetIntValue(std::vector<int>& v, int find) { auto vit = std::find(v.begin(), v.end(), find); if (vit == v.end()) return std::pair(false, 0); ret

유니티(Unity) - 애트리뷰트(Attribute) [내부링크]

Attribute를 이용하면 인스펙터를 다양하게 커스텀이 가능하다. 1. SerializeField using UnityEngine; using System; class Test : MonoBehaviour { [SerializeField] int value; } 인스펙터에서 값 수정이 가능하도록 한다. 정확하게는 private 와 protected 변수를 인스펙터에 표시할 수 있도록 한다. public의 경우는 해당 Attribute를 사용하지 않아도 인스펙터에 표시된다. 2. HideInInspector using UnityEngine; using System; class Test : MonoBehaviour { public int value1; [HideInInspector] public int value2; } 1에서 말한 것처럼 public으로 선언할 경우 바로 인스펙터에 표시되는데 HideInInspector를 사용하면 인스펙터 표시가 안되게 할 수 있다. 3. Seria

유니티(Unity) - 에디터 윈도우<1>(EditorWindow) [내부링크]

0. using using UnityEditor; 에디터를 using에 추가한다. 1. EditorWindow 상속 using UnityEngine; using UnityEditor; class Test : EditorWindow { } MonoBehaviour 대신 EditorWindow를 상속받도록 한다. 2. 에디터 윈도우 열기 using UnityEngine; using UnityEditor; class Test : EditorWindow { [MenuItem("Test/Show Single Window")] public static void ShowSingleWindow() { // GetWindow var window = EditorWindow.GetWindow(typeof(Test)); // 윈도우 타이틀 지정 window.titleContent.text = "Single Window"; // 윈도우 최소, 최대 사이즈 지정 window.minSize = new Vect

유니티(Unity) - 에디터 윈도우<2>(EditorWindow) [내부링크]

유니티(Unity) - 에디터 윈도우<1>(EditorWindow) 0. using 에디터를 using에 추가한다. 1. EditorWindow 상속 MonoBehaviour 대신 EditorWindow를 상... blog.naver.com 위 1편 링크를 참조바란다. labelWidth, fieldWidth private void OnGUI() { EditorGUIUtility.labelWidth = 100; EditorGUIUtility.fieldWidth = 100; } 레이블의 크기와 필드 크기를 지정할 수 있다. 필드 크기의 경우 가로 사이즈에 맞게 100 이상으로 늘어나며 100 미만으로 줄지는 않는다. BeginHorizontal, EndHorizontal private void OnGUI() { EditorGUIUtility.labelWidth = 100; EditorGUIUtility.fieldWidth = 100; EditorGUILayout.BeginHorizon

유니티(Unity) - 에디터 윈도우<3>(EditorWindow) [내부링크]

유니티(Unity) - 에디터 윈도우<1>(EditorWindow) 0. using 에디터를 using에 추가한다. 1. EditorWindow 상속 MonoBehaviour 대신 EditorWindow를 상... blog.naver.com 유니티(Unity) - 에디터 윈도우<2>(EditorWindow) 위 1편 링크를 참조바란다. labelWidth, fieldWidth 레이블의 크기와 필드 크기를 지정할 수 있다. 필드 ... blog.naver.com 1편과 2편을 참조바란다. EditorGUILayout, GUILayout, EditorGUI, GUI 등 다양한 클래스가 있지만 각각의 큰 차이는 자세히는 모르겠다. 간단하게 활용가능한 영역만 알아보자. private void OnGUI() { GUIContent title = new GUIContent("GUI Content", "Tool Tip"); GUILayout.Label(title); } Lable에 그냥 스트링도

유니티(Unity) - 간단한 이미지 투시 방법 [내부링크]

간단하게 이미지를 투시하여 보는 방법을 알아보겠다. 1. 프로젝트 생성 후 세팅 화면 전체를 덮는 이미지와 투시할 영역의 이미지 2개를 만든다. 2. Material 생성 프로젝트 창에서 우클릭 후 Create - Material을 눌러 머티리얼을 2개 생성한다. 이미지 명과 네이밍을 맞춰주었다. 3. Material 설정 Shader에서 UI - Default를 선택해준다. Background는 다음과 같이 설정한다. Hole은 다음과 같이 설정한다. Use Alpha Clip은 이미지에 맞게 투시할지 아니면 사각형 영역에 맞게 투시할지를 선택한다. 이미지가 없다면 체크를 해제해도 무방하다. 그리고 각각 머티리얼을 넣어준다. 4. 투시 확인 투시 확인 전에 오브젝트 순서를 바꿔주어야한다. 아까는 이미지를 보여주기 위해 Background 뒤에 Hole이 있었지만 Hole이 Background보다 앞에 있게 하면 투시가 되는 것을 볼 수 있다. 이미지를 추가하고 Background의

유니티(Unity) - Task 값 받을때까지 대기 [내부링크]

Task 관련하여 아래 링크들을 참조바란다. 유니티(Unity) - 동기(Sync), 비동기(Async) 프로그램이 A 작업을 하고 B 작업을 하도록 짜여있을 때 동기 프로그래밍은 A작업을 시작하고 A 작업을... blog.naver.com 유니티(Unity) - Task 취소 위 링크를 참조 후 해당 글을 읽기 바란다. Task를 통하여 딜레이가 걸려있는 경우 딜레이 동안 오브젝트... blog.naver.com 프로그래밍을 하다 보면 어떠한 값을 불러오고 해당 값을 받고 난 후 실행되어야 하는 코드가 많다. 비동기적으로 하는 경우 값을 불러올 때까지 대기를 해야하는데 그 방법 중 하나가 TaskCompletionSource를 사용하는 방법이다. 간단하게 버튼을 클릭한 후에 뒤에 코드가 실행되는 예시를 보자. using System.Threading.Tasks; using UnityEngine; using UnityEngine.UI; class Test : MonoBehaviour

삽입 반복자(insert iterator) [내부링크]

삽입 반복자는 요소의 위치에 새로운 값을 삽입할 수 있게 해준다. 0. include #include <iterator> iterator를 선언해준다. 1. insert_iterator, inserter #include <iostream> #include <iterator> #include <list> int main() { std::list<int> li{ 1, 2, 3 }; std::list<int> cpLi; std::copy(li.begin(), li.end(), std::insert_iterator(cpLi, cpLi.end())); //std::copy(li.begin(), li.end(), std::inserter(cpLi, cpLi.end())); for (auto temp : cpLi) { std::cout << temp << " "; // 1 2 3 } } li에 있는 값들을 cpLi에 복사하는 코드 예시이다. insert_iterator의 첫번째 인자에 삽입할 컨

스트림 반복자(stream_iterator) [내부링크]

스트림 반복자는 반복자 연산을 통해 입출력 스트림에 접근할 수 있도록 해주며 입력 반복자인 istream_iterator와 출력 반복자인 ostream_iterator로 구분된다. 0. include #include <iterator> iterator를 선언해준다. 1. istream_iterator std::istream_iterator<자료형> itrInput{ std::cin }; std::istream_iterator<자료형> itrInputEnd; cin을 통해 입력을 받을 입력 반복자와 EOF를 판단할 종료 입력 반복자를 선언한다. EOF는 입력 시 Ctrl + Z를 입력하면 된다. #include <iostream> #include <iterator> int main() { std::istream_iterator<int> itrInput{ std::cin }; std::istream_iterator<int> itrInputEnd; int sum = 0; while (it

유니티(Unity) - 인앱결제(IAP)(1) [내부링크]

1. In App Purchase 패키지 Windonws - Package Manager 클릭 Unity Registry에서 In App Purchasing 검색하여 Install 2. 구글 콘솔 내부 테스트 앱 등록 내부 테스트에 테스트 할 aab 파일을 올린다. 빌드 시 위 부분을 체크해주면 aab 파일로 빌드된다. 그러면 내부 테스트로 앱이 등록된다. 위 내부 테스트 앱을 클릭 후 아래로 스크롤 하다 보면 수익 창출 설정이 있는데 거기에 라이선스 키를 복사한다. 3. InAppPurchase 세팅 Ctrl + 0을 누르면 다음과 같이 Service 탭이 나오는데 그중에 우리가 사용할 InAppPurchase를 눌러준다. 여기서 계정을 선택한다. 기존에 있는 프로젝트ID 를 사용할지 새로 만들지 선택하면 된다. 기존에 있는 프로젝트ID 를 사용할 경우 여기서 사용할 ID를 선택하면 된다. 골랐으면 Link project ID를 눌러준다. 그러면 13세 이하도 사용하는지와 같은 선

유니티(Unity) - 인앱결제(IAP)(2) [내부링크]

유니티(Unity) - 인앱결제(IAP)(1) 1. In App Purchase 패키지 Windonws - Package Manager 클릭 Unity Registry에서 In App Purch... blog.naver.com 전편을 참조바랍니다. 1. IAPManager using UnityEngine.Purchasing; using을 해준다. IStoreListener 인터페이스를 상속 받고 위 함수들을 구현하여야 한다. IStoreController iStoreController; // 구매 과정을 제어하는 함수 제공 IExtensionProvider iExtensionProvider; // 여러 플랫폼을 위한 확장 처리 제공 public bool IsInitialized => iStoreController != null && iExtensionProvider != null; 초기화시 넘겨주는 인터페이스 두 종류와 초기화 여부를 판단하기 위해 bool 변수 하나를 선언해준다.

프레디케이트(Predicate) 함수 [내부링크]

프레디케이트 함수란 타입 T를 받고 boolean을 반환하는 함수이다. 짝수를 확인하는 프레디게이트 함수를 예시로 보자. bool IsEven(int value) { return value % 2 == 0; } IsEven(1); // false IsEven(2); // true 일반적인 함수 형태이며 인자로 int형을 넣어주면 bool 형으로 반환해준다. auto IsEven([](int i) { return i % 2 == 0; }); IsEven(1); // false IsEven(2); // true 인자를 람다 함수로 나타낸 형식으로 사용법은 같다. #include <iostream> #include <vector> #include <algorithm> bool CheckEven(int value) { return value % 2 == 0; } bool BigNumber(int value1, int value2) { return value1 > value2; } int m

익스트랙트(Extract) [내부링크]

C++17 이전에는 map이나 set의 경우 키값을 변경하려면 해당 요소를 삭제 후 다시 만들어서 삽입하는 방식으로 써왔는데 이 방식은 메모리를 재할당하는 방식으로 성능 저하가 일어날 수 있다. C++ 17부터 사용이 가능한 extract는 컨테이너에서 해당 요소를 가지고 있는 노드의 연결을 해제하고 반환해준다. 연결을 해제하고 반환하기에 다시 사용할려고 하는 경우 연결을 해주어야 하며 메모리를 그대로 쓰기에 재할당이 일어나지 않아 성능 저하가 일어나지 않는다. node_type extract( const_iterator position ); node_type extract( const Key& k ); 이터레이터 혹은 키값을 인자로 받는다. map, set의 경우 키값 변경이 불가한데 extract를 통해 변경이 가능하다. map에서 키 값을 서로 바꿔주는 예시를 보자. #include <iostream> #include <map> int main() { std::map<int,

유니티(Unity) - 스크립터블 오브젝트(Scriptable Object) [내부링크]

스크립터블 오브젝트 유니티에서 사용되는 스크립트 기반의 데이터 컨테이너이다. 게임 오브젝트가 아닌 게임 내에서 사용되는 데이터의 집합체이다. 여러 스크립트나 게임 오브젝트와 상호작용하면서 독립적으로 데이터를 저장하고 공유할 수 있다. 수정된 내용은 해당 스크립터블 오브젝트를 참조하는 모든 지점에 반영된다. using UnityEngine; [CreateAssetMenu(fileName = "TestData", menuName = "ScriptableObject/TestData", order = 0)] public class TestScriptable : ScriptableObject { public int valueInt; public float valueFloat; public bool valueBool; public string valueString; } MonoBehaviour가 아닌 ScriptableObject를 상속받도록 수정한다. CreateAssetMenu 에디터에서

유니티(Unity) - 빌드 에러(android.enableR8=false) [내부링크]

새 프로젝트를 만들고 테스트 코드를 붙인 후 빌드를 해보았는데 빌드 에러가 떴다.. 스크립트 하나 넣은게 다인데.. 지웠다 깔아도 보고 android.enableR8=false 이게 예전에 본 에러여서 build.gradle 였나 수정도 해보고 유니티 재설치, 프로젝트 만들고 바로 빌드, gradle 버전 수정 등등 해보았지만 되지 않았다. 첫 날 저녁에 찾아보다 실패하고 둘째 날에 다시 검색을 해보다가 키스토어를 만들고나서 에러가 사라졌다는 것을 보고 해보니 해결되었다. 유니티(Unity) - 파이어베이스 설정 1. 파이어베이스 유니티 SDK 다운로드 해당 링크를 통해서 파이어베이스 유니티 SDK를 다운로드한다.... blog.naver.com 해당 링크에 키스토어 생성하는 부분이 있어 쉽게 따라할 수 있으니 참조바란다. 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일 부탁드립니다. [유니티 어필리에이트 프로그램] 아래는 유니티 구독 및 학습 등에 대한 정보이며,

유니티(Unity) - 패키지를 파싱하는 중 문제가 발생했습니다. [내부링크]

개인 프로젝트의 SDK 버전을 올리고 난 후 평소처럼 apk 파일을 뽑아 휴대폰으로 설치를 하는데 아래와 같은 에러가 났다. SDK 를 지웠다가 새로도 깔아봤지만 문제가 해결되지 않아서 이래저래 확인해보니 안드로이드 12부터는 AndroidManifest.xml에서 특정 설정을 해주어야 한다고 한다. 보안 문제로 해당 사항이 추가된 것 같아 보였다. 잘 보일지 모르겠지만 내부 앱 테스트에서도 설정을 하라고 나온다. File - BuildSettings 클릭 Player Settings 클릭 Publishing Settings을 눌러서 펼쳐준다. Custom Main Manifest를 체크해준다. 그럼 Assets - Plugins - Android 안에 AndroidManifest가 생성되어 있을 것이다. intent-filter를 포함한 activity 안에 android:exported="true"를 추가해준다. 이후 다시 빌드해보니 정상 작동하였다. 개인 공부 블로그입니다. 틀

유니티(Unity) - 애드몹(Admob) 광고 [내부링크]

애드몹을 통하여 간단하게 광고를 붙이는 방법을 알아보도록 하겠다. Releases · googleads/googleads-mobile-unity Official Unity Plugin for the Google Mobile Ads SDK - googleads/googleads-mobile-unity github.com 위 링크를 통해 애드몹 패키지를 다운 받을 수 있다. 글쓰는 날 기준으로 최신 버전인 8.5.2 유니티 패키지를 다운 받는다. 새 프로젝트르 생성하고 패키지를 더블 클릭한다. 위와 같이 임포트 창이 뜨면 임포트를 클릭하여 프로젝트에 포함시켜준다. 임포팅 중... 위 처럼 테스트 버튼 3개를 만들어 준다. 우리가 테스트할 광고들은 배너 광고, 전면 광고, 보상형 광고 3개이다. 광고 Api 추가 using GoogleMobileAds.Api; 초기화 MobileAds.Initialize(initStatus => { }); adRequest = new AdRequest.B

유니티(Unity) - 두지UI(DoozyUI) [내부링크]

두지UI는 유니티 에셋 중에 하나이며, UI 개발을 간편하게 관리하기 위한 도구이다. 조금 무거우며 최적화가 조금 아쉽지만 지속적으로 업데이트가 진행되고 있고 툴이 직관적이며 제공하는 기능들이 매우 많고 코딩 없이 UI 개발이 가능하다. 구매는 아래 링크를 통해 할 수 있다. 현재 두지UI도 유니티 봄 세일로 인하여 50% 할인하니 봄 세일에 대한 자세한 정보는 아래 링크를 참조바란다. 유니티(Unity) - 2023 봄 세일(최대 70%) 유니티 봄 세일이 시작됩니다. 기간은 2023년 5월 10일 8:00:00에 시작하여 2023년 6월 2일 8:00:00에 종료... blog.naver.com 두지UI에 대한 공식 영상을 참조하였으며 자세한 설명은 아래 영상을 참조 또한 두지UI의 버튼을 예로 들면 왼쪽부터 문서, API, 유튜브 영상 등 설명이 잘 되어있다. Tools - Doozy - UI Menu 클릭 다음과 같이 UI Menu 툴 창이 뜬다. Containers - Vi

유니티(Unity) - 2023 봄 세일(최대 70%) [내부링크]

유니티 봄 세일이 시작됩니다. 기간은 2023년 5월 10일 8:00:00에 시작하여 2023년 6월 2일 8:00:00에 종료됩니다. 2023 봄 세일 특징 판매 기간 동안 500개 이상의 자산을 50% 할인된 가격으로 사용할 수 있습니다. Daily Flash Deals에서 최대 70% 할인을 받을 수 있습니다. 각 플래시 딜이 시작되면 선택한 자산이 처음 12시간 동안 70% 할인된 후 다음 12시간 동안 60% 할인됩니다. 이러한 초기 할인 기간이 지나면 자산은 나머지 판매 기간 동안 50% 할인된 가격으로 제공됩니다. 플래시 딜 페이지 50% 할인 페이지 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일 부탁드립니다. [유니티 어필리에이트 프로그램] 아래는 유니티 구독 및 학습 등에 대한 정보이며, 해당 링크를 통해 유니티를 구독하시면 수익의 일부가 블로거에게 공유되어, 블로그 운영에 도움이 됩니다. Unity Plus Easy 2D, 3D, VR, & AR

유니티(Unity) - 두트윈(Dotween) [내부링크]

두트윈이란 유니티 에셋 중에 하나이며, Tweening 애니메이션을 생성하고 관리하는 데 필요한 모든 기능을 간단하게 사용할 수 있다. Tweening이란 두 개 이상의 상태를 서서히 변화시켜 애니메이션 효과를 만드는 것이다. Lerp도 Tweenig 중 하나이며, 두트윈에서는 더 다양한 효과를 줄 수 있다. 무료 버전과 유료 버전이 있으며, 유료 버전에서는 2D Toolkit 적용, TextMeshPro 적용, 인스펙터에서 사용가능한 툴 등 추가 기능이 있으며, 필수 에셋이라고 생각해도 무방하다고 생각한다. 무료 버전으로도 충분히 두트윈 사용이 가능하지만 지속적으로 개발을 할 분들이라면 유료 버전을 사는 것도 좋다고 생각한다. 아래 링크를 통해 무료, 유료 버전을 다운로드하면 된다. 현재 두트윈도 유니티 봄 세일로 인하여 50% 할인해서 $7.5이니 아래 링크를 참조바란다. 유니티(Unity) - 2023 봄 세일(최대 70%) 유니티 봄 세일이 시작됩니다. 기간은 2023년 5월

유니티(Unity) - 네비게이션<1>(Navigation) [내부링크]

유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 Nav Mesh Obstacle : 장애물 Off Mesh Link : 점프 및 포탈 등을 구현 이 중에서 Navigation과 Nav Mesh Agent를 먼저 알아보겠다. Nav Mesh Obstacle에 대해서는 아래 링크를 참조바란다. 유니티(Unity) - 네비게이션<2>(Navigation) 유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 ... blog.naver.com Off Mesh Link의 경우 아래 링크를 참조바란다. 유니티(Unity) - 네비게이션<3>(Navigation) 유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 ... blog.naver.com 1. Navigation 추가 Windo

유니티(Unity) - 네비게이션<2>(Navigation) [내부링크]

유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 Nav Mesh Obstacle : 장애물 Off Mesh Link : 점프 및 포탈 등을 구현 이 중에서 Nav Mesh Obstacle을 알아보겠다. Navigation 세팅 혹은 Navigation 자체 기능이나 Nav Mesh Agent 같은 경우 아래 링크를 참조바란다. 유니티(Unity) - 네비게이션<1>(Navigation) 유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 ... blog.naver.com Off Mesh Link 의 경우 아래 링크를 참조바란다. 유니티(Unity) - 네비게이션<3>(Navigation) 유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 ... blog.naver.com

유니티(Unity) - 네비게이션<3>(Navigation) [내부링크]

유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 Nav Mesh Obstacle : 장애물 Off Mesh Link : 점프 및 포탈 등을 구현 이 중에서 Off Mesh Link를 알아보겠다. Navigation 세팅 혹은 Navigation 자체 기능이나 Nav Mesh Agent 같은 경우 아래 링크를 참조바란다. 유니티(Unity) - 네비게이션<1>(Navigation) 유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 ... blog.naver.com Nav Mesh Obstacle 같은 경우 아래 링크를 참조바란다. 유니티(Unity) - 네비게이션<2>(Navigation) 유니티의 Navigation 기능과 관련된 컴포넌트가 총 3가지 있다. Nav Mesh Agent : 길을 따라가는 주체 ... blog.naver.com

What is 1+1?(두뇌 퍼즐 게임) [내부링크]

What is 1+1? - Apps on Google Play What is 1 plus 1? Is the answer you imagined right? play.google.com 구글 플레이 출시 연습을 위해 유니티로 간단하게 출시한 두뇌 퍼즐 게임이다. 각 조건과 문제는 랜덤으로 나오며, 10단계까지 있다. 시간제한은 있지만 횟수 제한은 없어서 무한 도전이 가능하다. give up 버튼을 통해 포기할 수 있다. 결과 창에서 Main화면을 누르면 광고가 나오도록 애드몹도 사용하여보았다. 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일 부탁드립니다. [유니티 어필리에이트 프로그램] 아래는 유니티 구독 및 학습 등에 대한 정보이며, 해당 링크를 통해 유니티를 구독하시면 수익의 일부가 블로거에게 공유되어, 블로그 운영에 도움이 됩니다. Unity Plus Easy 2D, 3D, VR, & AR software for cross-platform development

유니티(Unity) - 에셋번들(AssetBundle) [내부링크]

1. 프로젝트 생성 프로젝트 생성 후 에셋번들을 테스트할 캔버스와 이미지 그리고 프리팹을 만든다. 2. 에셋번들 지정 큐브 프리팹에는 cube, 이미지에는 image라고 에셋번들을 지정하였다. 3. Editor 폴더에 스크립트 생성 에셋번들을 생성할 스크립트를 만드는데 에디터 스크립트는 빌드에 포함이 되면 안되므로 특수 폴더인 Editor폴더를 만들어 그 안에 스크립트를 생성한다.(Editor 폴더의 위치는 중요하지 않다.) using System.IO; using UnityEditor; using static UnityEditor.PlayerSettings; public class AssetBundleMenuItem { // MenuItem으로 다음 이름의 메뉴를 만든다. [MenuItem("Tools/AssetBundleBuild Windows")] public static void AssetBundleBuildWindows() { // 경로는 Assets/Bundle로 지정한다

유니티(Unity) - 어드레서블(Addressable) [내부링크]

유니티(Unity) - 에셋번들(AssetBundle) 1. 프로젝트 생성 프로젝트 생성 후 에셋번들을 테스트할 캔버스와 이미지 그리고 프리팹을 만든다. 2. 에... blog.naver.com 어드레서블은 에셋번들 방식을 쉽게 사용할 수 있도록 한 패키지이다. 위 링크 프로젝트를 연결해서 하는 부분이기에 참고하면 좋다. 1. 어드레서블 설치 패키지 매니저에서 어드레서블을 다운로드한다. 2. 어드레서블 세팅 어드레서블을 다운로드하면 다음과 같이 Asset Management에 Addressables라고 생기며, 해당 목록 중에 Groups를 클릭한다. 생성을 누르면 위 창이 뜨는데 Convert를 누르면 에셋번들에서 어드레서블로 넘어가는 경우 지정된 에셋번들이 자동으로 어드레서블로 지정되어 세팅된다. Ignore는 무시하고 처음부터 세팅할 때 누르면 된다. 3. 그룹 생성 Group을 생성하기 위해서는 왼쪽 상단의 New를 통해서 하거나, 우클릭을 통해서도 할 수 있다. 4. 플레이

유니티(Unity) - 파이어베이스 설정 [내부링크]

1. 파이어베이스 유니티 SDK 다운로드 Unity 프로젝트에 Firebase 추가 | Unity용 Firebase Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기 이 페이지는 Cloud Translation API 를 통해 번역되었습니다. Switch to English Firebase Firebase 문서 Unity용 Firebase 기초 Unity 프로젝트에 Firebase 추가 이 페이지의 내용 전제 조건 1단계 : Firebase 프로젝트 생성 2단계 : Firebase에 앱 등록 3단계 : Firebase 구성 파일 추가 4단... firebase.google.com 해당 링크를 통해서 파이어베이스 유니티 SDK를 다운로드한다. 그럼 압축파일이 다운로드되는데 압축을 풀어준다. 2. 프로젝트 생성 후 SDK 임포트 유니티 프로젝트를 생성 후 실행한다. 1에서 푼 압

유니티(Unity) - 파이어베이스 이메일 로그인 [내부링크]

유니티(Unity) - 파이어베이스 설정(Firebase) 1. 파이어베이스 유니티 SDK 다운로드 해당 링크를 통해서 파이어베이스 유니티 SDK를 다운로드한다.... blog.naver.com 위 링크를 통해 파이어베이스의 기본적인 설정을 한다. 1. 유니티 패키지 임포트 FirebaseAuth 패키지를 임포트 해준다. (했으면 생략) 2. 파이어베이스 설정 빌드 - Authentication을 클릭한다. Sign-in method에 들어가면 여러 로그인 관련들이 있다. 이 중에 가장 기본적인 이메일/비밀번호를 클릭한다. 사용 설정을 하고 저장을 누른다. 그러면 사용 설정됨이 표시된다. 3. 유니티 씬 씬을 기본적으로 이렇게 설정했다. 중요한건 이메일/비밀번호 입력창과 회원가입, 로그인, 로그아웃 버튼만 있으면 된다. 4. 코드 using Firebase.Auth; using Firebase; using UnityEngine; using TMPro; using System; usi

유니티(Unity) - 파이어베이스 구글 플레이 게임즈(GPGS) 연동 [내부링크]

유니티(Unity) - 파이어베이스 설정 1. 파이어베이스 유니티 SDK 다운로드 해당 링크를 통해서 파이어베이스 유니티 SDK를 다운로드한다.... blog.naver.com 위 링크를 통해 파이어베이스의 기본적인 설정을 한다. 1. 유니티 패키지 임포트 FirebaseAuth 패키지를 임포트 해준다. (했으면 생략) Releases · playgameservices/play-games-plugin-for-unity Google Play Games plugin for Unity. Contribute to playgameservices/play-games-plugin-for-unity development by creating an account on GitHub. github.com 해당 깃허브에서 GPGS 패키지도 다운로드해준다. (v10.14) 압축을 풀고 해당 폴더 안에 유니티 패키지를 더블 클릭한다. 임포트 클릭 2. 파이어베이스 설정 빌드 - Authentication을

레드 블랙 트리(Red - Black Tree) [내부링크]

레드 블랙 트리는 C++ STL의 Map과 Set의 기반이 되는 알고리즘이다. 레드 블랙 트리가 형성되는 과정을 알아보겠다. 레드 블랙 트리는 자가 균형 이진 탐색 트리이며 아래의 조건들을 만족해야 한다. 1. 모든 노드는 빨간색 혹은 검은색이다. 2. 루트 노드는 검은색이다. 3. 모든 리프 노드들은 검은색이다. 4. 빨간색 노드의 자식은 검은색이다. (Double Red 금지) 5. 모든 리프 노드에서 Black Death는 같다. (루트 노드까지 가는 경로 중 거치는 검은색 노드의 수가 같다.) 추가로 삽입되는 노드는 모두 빨간색으로 설정하며 삽입 시 루트 노드부터 작은 값은 왼쪽 자식이 되고, 큰 값은 오른쪽 자식이 된다. 4번의 빨간색 노드의 자식으로 빨간색 노드가 온다면 더블 레드가 발생하는데 이를 방지하기 위해 두가지 방법이 있다. 우선 새로 삽입한 노드를 N 새로 삽입한 노드의 부모 노드를 P 새로 삽입한 노드의 조상 노드(부모 노드의 부모 노드)를 G 새로 삽입한 노

스택으로 큐(StackQueue), 큐로 스택(QueueStack) [내부링크]

#include <iostream> #include <stack> #include <queue> using std::cout; using std::endl; class StackQueue { private: std::stack<int> s1; std::stack<int> s2; public: void Push(int data) { s1.push(data); } int Pop() { if (s2.empty()) { while (!s1.empty()) { s2.push(s1.top()); s1.pop(); } } int data = s2.top(); s2.pop(); return data; } }; class QueueStack { private: std::queue<int> q1; std::queue<int> q2; public: void Push(int data) { if (q1.empty()) { q1.push(data); } else { while (!q1.empty()) { q

Win32API - 윈도우 데이터 타입 [내부링크]

Windows 데이터 형식(BaseTsd.h) - Win32 apps Windows 지원하는 데이터 형식은 함수 반환 값, 함수 및 메시지 매개 변수 및 구조체 멤버를 정의하는 데 사용됩니다. docs.microsoft.com 전체 데이터 타입은 위 링크를 참조바란다. typedef unsigned char BYTE; typedef int BOOL; typedef char CHAR; typedef unsigned long DWORD; typedef DWORD COLORREF; 어느정도 이해는 가는데 int형이 BOOL로 된다는건 조금 의외다.. typedef void* PVOID; typedef PVOID HANDLE; typedef HANDLE HDC; typedef HANDLE HGDIOBJ; typedef HANDLE HINSTANCE; typedef HANDLE HWND; 결국은 다 같은말로 H가 붙은 단어는 void* 라고 생각하면 될 것 같다. (4바이트 양의 정수) ty

Win32API - 인스턴스, 핸들, 헝가리안 표기법 [내부링크]

1. 인스턴스(Instance) 응용 프로그램의 아이디로 같은 종류의 프로그램은 같은 인스턴스를 가진다. 하나의 프로그램을 여러 개 띄워도 하나의 프로그램으로 인식한다. 2. 핸들(Handle) 운영체제에서 할당한 자원의 아이디로 하나의 프로그램을 여러 개 띄우면 각각의 아이디가 부여되어 여러 개의 프로그램으로 인식한다. (HANDLE, HDC... 등등) 인스턴스와 핸들의 공통점 운영체제에서 할당하는 값(아이디 값)으로 중복되지 않는 값이다. 인스턴스보단 핸들이 주로 쓰인다. 3. 헝가리안 표기법 BOOL, bool -> b char -> c int, short -> i, n long -> l float -> f double -> d 배열 -> a DWORD -> dw 문자열 -> sz, str 포인터 -> p 핸들 -> h 전역변수 -> g_ 윈도우 메시지 -> msg 해당 타입에 맞게 변수 앞에 붙여주면 된다. 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일

Win32API - WinMain(), WndProc() [내부링크]

C/C++ 에서 main 함수가 있다면 Win32API에는 WinMain과 WndProc가 있다. WinMain이 메인의 역할을 하고 WndProc는 메시지를 처리하는 담당을 한다. 1. 함수 원형 #ifdef _UNICODE #define _tWinMain wWinMain #else #define _tWinMain WinMain #endif 유니코드의 사용여부에 따라 앞에 w가 붙을수도 있다. 혹은 상관없이 _t가 있을 수도 있다. (WndProc()도 동일) #include <windows.h> 윈도우 헤더를 선언해준다. int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return 0; } WinMain의 원형인데 타입 재정의가 일어나서 복잡할 수 있다. int __stdcall wWinMain( void* hInstance, void* hPrevIn

Win32API - 리소스(Resource) [내부링크]

0. 리소스 뷰 리소스뷰를 확인하기 위해서는 리소스 파일의 프로젝트명.rc를 더블클릭한다. 1. 아이콘 리소스 아이콘 리소스를 외부에서 갖고 오기 위해서는 아이콘 파일 우클릭 후 리소스 추가 버튼을 클릭한다. 아이콘을 누른 상태에서 가져오기를 클릭 후 ico파일을 가져온다. png나 jpg 등을 ico로 변환 후 가져오면 된다. ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON2)); wcex.hCursor = LoadCu

유니티(Unity) - 전광판 효과 [내부링크]

특정 이미지 안에 글자가 연속적으로 지나가는 효과를 나타내 볼 것이다. 흔히 보이는 전광판 효과와 같다. 일반 텍스트도 가능하며 테스트는 TMPro의 TMP_Text로 진행한다. 1. 에디터 세팅 TMP_Text를 사용하면 위와 같이 뜨는데 둘다 Import 해준다. 이미지 아래에 TMP_Text를 추가한다. 아무 텍스트를 입력하면 위와 같이 이미지 밖으로 텍스트가 삐져나온다. 이미지에서 Mask 컴포넌트를 추가한다. 그러면 이미지 안에서만 텍스트가 잘려서 보이게 된다. 2. 소스 코드 [Header("이동 속도")] [SerializeField] private int moveSpeed = 150; public RectTransform imageRectTransform; public RectTransform textRectTransform; public TMP_Text text; private Vector2 startPos; private Vector2 direction; priva

유니티(Unity) - UniRx(Action 비교) [내부링크]

GitHub - neuecc/UniRx: Reactive Extensions for Unity Reactive Extensions for Unity. Contribute to neuecc/UniRx development by creating an account on GitHub. github.com 해당 깃허브 사이트에 들어가면 유니티용 UniRx를 다운받을 수 있고, 에셋 스토어에서도 무료 UniRx를 다운받을 수 있다. UniRx는 흔히 옵저버 패턴을 최적화하여 사용하기 쉽도록 한 라이브러리이다. 현업에서는 사용하기는 간편한 만큼 디버깅은 어렵다고 한다. 유니티 포트폴리오를 만들 때 쓴 Action과 유사하게 보인다. 기본적인 사용법을 알아보자. 1. Action과 Subject using System.Collections; using System.Collections.Generic; using UnityEngine; using UniRx; using System; public

아마존(Amazon) S3 - 버킷 접근 권한 퍼블릭으로 변경하는 법 [내부링크]

1. 아마존 s3 로그인 후 버킷 만들기 클릭 2. 버킷 이름과 AWS 리전 입력 3. 모든 퍼블릭 액세스 차단 체크 해제, 퍼블릭 상태 체크 4. 나머지 설정은 그대로 두고 버킷 만들기 5. 생성된 버킷 클릭 6. 권한 탭 클릭 7. 버킷 정책 편집 { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::버킷명/*" } ] } 버킷명에 생성한 버킷명 입력 8. CORS 편집 [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "HEAD", "GET", "PUT", "POST", "DELETE" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [] } ] 9. 최종 개인 공부 블로그입니다. 틀

언리얼(Unreal) - 레벨 시퀀스(Level Sequence) [내부링크]

레벨 시퀀스를 통해 애니메이션을 작동시키는 방법을 알아보겠다. 트리거에 닿으면 문이열리고 트리거를 벗어나면 문이 닫히는 간단한 예제이다. 1. 프레임과 문 배치 스타트 콘텐츠에서 프레임과 문을 배치한다. 2. 레벨 시퀀스 추가 상단의 시네마틱에서 레벨 시퀀스 추가를 누른다. 3. 애니메이션을 담당할 액터 추가 3번과 마찬가지 방법으로 애니메이션을 담당할 문 액터를 추가한다. 4. 애니메이션 제작 우선 0프레임에 회전축인 요를 +버튼을 눌러 저장한다. 저장이 되었다면 빨간 원이 표시된다. 그 다음 문이 완전히 열릴 프레임에 진행바를 가져다 놓는다. 에디터 상에서 문이 완전히 열린 상태를 만들어 두고 요의 +버튼을 누른다. 그럼 위와 같이 나오는데 진행바를 옮겨보면 문이 잘 작동하는 것을 볼 수 있다. 6. 모듈 추가 프로젝트명.Build.cs에 MovieScene, LevelSequence 모듈을 추가한다. 7. 코드 // Fill out your copyright notice in

언리얼(Unreal) - 클래스 정리 [내부링크]

개인 프로젝트 도중 클래스 파일 정리를 하고 싶은 적이 있었는데 에디터 상에서는 다음과 같이 새 폴더가 비활성화 되어있다. CDO때문에 에디터상에서는 수정을 못한다. 다음에 알아보고 해야지 했는데 이미 클래스가 너무 많아져서 더 많아지기 전에 해야겠다.. 언리얼(Unreal) - StaticClass()(CDO), GetClass() 언리얼에서 C++ 클래스 생성 시 UClass()라는 것이 붙는다. 이렇게 생성된 클래스는 언리얼의 관리를 받... blog.naver.com CDO에 대해서는 위 링크를 참조바란다. 1. 탐색기에서 코드 정리 프로젝트가 있는 경로에 Source파일에 클래스들이 있으니 각각 폴더별로 정리를 한다. 우선 Base 클래스가 있는 것들만 정리를 했는데도 남은게 많다.. 2. 비쥬얼 스튜디오 파일 재생성 가끔 알 수 없는 오류가 날때 이 방법을 쓰면 해결이 될 때가 있다. 빨간 박스 부분을 삭제해준다.(Saved도 삭제해도 되는데 데이터를 Saved에 저장해놓

언리얼(Unreal) - 디스트럭터블 메시(Destructable Mesh) [내부링크]

디스트럭터블 메시란 메시의 파편을 생성해주어 파괴 장면을 쉽게 만들어주는 메시이다. 예시를 통해 디스트럭터블 메시를 만들어보겠다. 템플릿은 1인칭으로 만들어준다. 1. 플러그인 설치 세팅의 플러그인으로 들어가서 apex로 검색 후 활성화를 시키고 우측 하단의 지금 재시작을 눌러 플러그인을 프로젝트에 적용시킨다. 2. 디스트럭터블 메시 생성 파괴를 원하는 메시를 우클릭 후 디스트럭터블 메시 생성을 클릭한다. 어두워서 잘 안보인다면 L키와 좌클릭을 누른상태에서 드래그하면 빛의 방향이 화살표로 표시된다. 3. 디스트럭터블 세팅 여러 세팅 값이 있는데 모두 이해는 못했기에 일부만 알아보겠다. Damage Threshold 데미지의 상한선인데 체력이라고 보면 될 것 같다. Damage Spread 데미지의 확장 범위이며 잘 깨지는 유리같은 경우 한 부분만 데미지가 들어와도 전체가 깨지는 듯한 효과가 가능하다. 단단한 돌 같은 경우 0.1보다 낮은 값이나 0으로 설정하여 그 부분만 깨지게 하는

RTTI, 가상함수테이블(V-Table), 가상함수포인터(V-Pointer) [내부링크]

순수 가상 함수(pure virtual function), 추상 클래스(abstract class), 인터페이스(interface) - 구조 앞에서 구조체 / 클래스 - 응용법 part2 3. virtual function에 대해 알아보았다. 링크를 따라서 들어가 보... blog.naver.com 가상함수에 대한 자세한 내용은 위 링크를 참조바란다. 1. RTTI Run Time Type Infomation의 약자로 런타임 즉 실행 중에 기반 클래스 타입의 실체 타입을 알고 싶을 때 사용한다. #include <iostream> #include <typeinfo> using namespace std; class A { public: void print() {} virtual void print2() {} }; class B : public A { public: void print() {} virtual void print2() {} }; int main() { A* a1 = new

언리얼(Unreal) - 프로젝트 BGM(레벨 이동 시 BGM 유지) [내부링크]

레벨이 이동되어도 BGM이 유지되도록 하기 위해 게임인스턴스 클래스에서 실행하도록 할 것이다. 게임 인스턴스에는 BeginPlay()가 없고 Init()과 OnStart()라는게 있는데 찾아본 정보로는 Init()에 하라고 되어있는데 Init()은 안되고 OnStart()에 하니 잘 작동하였다. 그리고 UAudioComponent를 만들어서 재생하면 안되고 UGameplayStatics에 있는 SpawnSound2D를 이용해야 한다. 테스트는 1인칭 템플릿에서 진행하였다. 1. 게임 인스턴스 클래스 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Engine/GameInstance.h" #include "MyGameInstance.generated.h" /** * */ UCLASS() class TEST_A

언리얼 RPG 프로젝트 [내부링크]

게임 설명 데모 형식의 RPG 게임이며, 튜토리얼, 일반 던전, 디펜스 던전, 보스 던전으로 구성되어있습니다. 플레이어는 기본 공격과 6개의 스킬, 보스는 기본 공격과 4개의 스킬, 일반 몬스터는 기본 공격만 가지고 있습니다. 캐릭터의 스탯이나 인벤의 아이템 목록이 변경될 경우 자동으로 저장됩니다. 코드 설명 AIBehaviorTree BTDecorator_CanAttack : 공격이 가능한 상태인지 여부 반환 BTDecorator_CanMove : 움직임이 가능한 상태인지 여부 반환 BTService_SearchTarget : 감지가능한 타겟이 있는지 여부 반환 BTTask_MoveToCharacter : 각 캐릭터의 사정거리에 들어올 때까지 타겟에게 이동 BTTaskNode_FindRandom : 다음에 이동할 좌표를 블랙보드 변수에 저장 BTTaskNode_SkillAttack : 랜덤한 스킬 실행 AIController BaseAIController : 모든 AIControl

언리얼(Unreal) - 화면 변환(카메라, 캐릭터 변환) [내부링크]

1. 3인칭 템플릿으로 프로젝트를 생성한다. 2. 키 매핑 카메라 변환과 캐릭터 변환을 할 키를 매핑한다. 3. 캐릭터에 카메라 추가 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) class USpringArmComponent* CameraBoom2; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) class UCameraComponent* FollowCamera2; 기존 스프링암과 카메라를 복사하여 2버전을 만든다. CameraBoom2 = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom2")); CameraBoom2->SetupAttachment(Ro

언리얼(Unreal) - 머티리얼 인스턴스(다이나믹) [내부링크]

1. 머티리얼 생성 다음과 같이 VectorParameter와 ScalarParameter를 만든다. Color는 머티리얼의 색상, Opacity는 투명도를 결정한다. 언리얼(Unreal) - 데칼(Decal), 공격 범위 설정(원, 도넛, 부채꼴) 데칼이란 머티리얼을 액터의 표면에 투영하는 것을 말한다. 데칼을 통해 공격 범위를 설정하는 법을 알아보... blog.naver.com 데칼을 통해 알아볼 것인데 자세한 머티리얼 생성은 위 링크를 참조바란다. 2. 머티리얼 인스턴스 생성 머티리얼을 우클릭하여 머티리얼 인스턴스 생성을 누른다. 생성된 인스턴스를 더블 클릭하면 우리가 생성한 변수들이 보일 것이다. 에디터 상에서 수정하기 위해서는 체크하여 수정해보면 된다. 3. 데칼 액터 생성 데칼 액터를 생성한다. // Fill out your copyright notice in the Description page of Project Settings. #pragma once #includ

언리얼(Unreal) - PoseableComponent(잔상) [내부링크]

스켈레탈 메쉬의 표면을 복사하여 렌더링하는 PoseableComponent를 통해 잔상효과를 낼 수 있다. 3인칭 템플릿에서 테스트를 진행하였다. 1. 머티리얼 생성 프레넬을 통해 외곽이 빛나는 형태의 머티리얼을 만들 수 있다. 머티리얼을 만든 후 인스턴스를 생성한다. 머티리얼을 적용하지 않으면 캐릭터 모습 그대로의 잔상이 남는다. 언리얼(Unreal) - 머티리얼 인스턴스(다이나믹) 1. 머티리얼 생성 다음과 같이 VectorParameter와 ScalarParameter를 만든다. Color는 머티리얼의 색... blog.naver.com 다이나믹 인스턴스에 대해서는 위 링크를 참조바란다. 2. 액터 생성 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #incl

언리얼(Unreal) - 대쉬 기능 [내부링크]

캐릭터의 대쉬 기능을 위해서는 위치를 바꿔주거나 속도를 바꿔주는 방법이 있다. 여러 방법이 있겠지만 간편하게 사용 가능한 3가지 대쉬 기능을 알아보겠다. 언리얼(Unreal) - PoseableComponent(잔상) 스켈레탈 메쉬의 표면을 복사하여 렌더링하는 PoseableComponent를 통해 잔상효과를 낼 수 있다. 3인칭 ... blog.naver.com 영상을 통해 차이점을 알아볼 것인데 잔상효과는 위 링크를 참조바란다. void ATestCharacter::Dash() { FVector Forward = GetActorForwardVector(); float Velocity = 5000.f; float DeltaTime = GetWorld()->DeltaTimeSeconds; float MoveDistance = 500.f; float Move = FMath::FInterpTo(0.f, MoveDistance, DeltaTime, 3.f); // A GetMovement

언리얼(Unreal) - 액터 중심으로 각도 회전한 벡터 구하기 [내부링크]

언리얼(Unreal) - 적 위치 판단, 각도 구하기(CosineAngle2D, DotProduct, CrossProduct) 플레이어가 공격이나 스킬을 시전 시 적이 맞는 범위에 있는지 판단을 해야한다. 충돌영역을 지정하여 오버... blog.naver.com 위 링크를 참조하면 이해하기 쉬울 것이다. 위 링크를 참조해보면 FVector의 CosineAngle2D 함수를 이용한다. 여기서도 같은 함수를 이용할 것인데 이 함수는 월드의 y축을 기준으로 각도를 계산한다. 월드를 위에서 바라봤을 때 y축을 기준으로 주황색 동그라미인 각도를 계산한다. 하지만 우리는 정면을 x축으로 잡고 있기 때문에 원하는 각도에서 90도를 뺀만큼을 계산한다. 중심을 기준으로 원의 좌표는 반지름 x sinΘ, 반지름 x cosΘ이다. FVector(FMath::Sin(FMath::DegreesToRadians(90 - Angle)), FMath::Cos(FMath::DegreesToRadians(90 -

언리얼(Unreal) - SceneCaptureComponent2D(씬캡쳐) [내부링크]

씬캡쳐를 통해 CCTV 같은 것을 나타낼 수 있다. 테스트는 3인칭 템플릿으로 진행한다. 1. 캔버스 렌더 타깃 생성 후 머티리얼 생성 랜더 타깃 또는 캔버스 랜더 타깃을 선택하고 위와 같이 이름을 지정하였다. 캔버스면 UI에 더 맞는 느낌(?)이지 않을까.. 2. 액터 클래스 생성 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "Capture2D.generated.h" UCLASS() class TEST_API ACapture2D : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties ACapture2D(); protected: // C

언리얼(Unreal) - ProgressBar 이미지 적용(원형 Hp Bar) [내부링크]

UMG의 ProgressBar는 기본적으로 사각형의 형태이다. 하지만 원형 형태나 기타 형태로 ProgressBar를 적용하는 방법을 알아보겠다. 1. 위젯 블루프린트 생성 2. ProgressBar 와 Image 생성 추가하면 위와 같은 모습이 된다. 3. ProgressBar 설정 앵커를 전체로 잡아준다. 그럼 Image의 사이즈에 맞게 ProgressBar가 조정된다. 오프셋은 이미지와 사이즈가 맞게 0으로 맞춰준다. BackGround는 알파값을 0으로 해서 안보이게 해주고 Fill Image를 원하는 형태의 이미지를 삽입한다. HpBar를 구현할 것이므로 색상을 빨간색으로 하고 Margin값을 0으로 해준다. 차오르는 정도는 확인하기 위해 Percent는 0.5로 해주고 아래에서 차오르도록 Bottom to Top으로 설정한다. Fill Color 역시 빨간색으로 해주고 알파 값은 1로 하니 너무 빨간색이라 0.7 정도로 해주었다. 색상은 원하는대로 하면 된다. 4. Ima

언리얼(Unreal) - 스플라인 컴포넌트(SplineComponent) [내부링크]

스플라인이란 쉽게 말해서 자유롭게 그려진 곡선을 의미한다. 에디터에서 원하는 스플라인을 그린 후 해당 스플라인을 따라가는 액터를 구현할 것이다. 1. 액터 클래스 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MyActor.generated.h" UCLASS() class TEST_API AMyActor : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AMyActor(); protected: virtual void OnConstruction(const FTransform& Transform) override; // Called w

언리얼(Unreal) - 파티클(Particle), 머티리얼(Material) 속성 변경 [내부링크]

파티클과 머티리얼의 속성이 게임 진행 중일 때 바뀌어야할 때 이 방법을 사용한다. 1. 파티클 설정 파티클을 창에 들어가서 색상을 바꾼다고 가정하겠다. Distribution에 Parameter를 선택한다. 선택하고 나면 Parameter Name을 설정할 수 있다. 2. 머티리얼 설정 머티리얼을 생성 후 VectorParameter를 선택한다. 변수 명이 될 이름을 지정해주고 베이스 컬러에 연결 후 아무 색이나 지정해준다. 3. 코드 UPROPERTY() UStaticMeshComponent* Mesh; UPROPERTY() UParticleSystem* Particle; 헤더 파일에 두 개의 변수를 생성한다. // Fill out your copyright notice in the Description page of Project Settings. #include "MyActor.h" #include "Kismet/GameplayStatics.h" #include "Particl

언리얼(Unreal) - 액터에서 입력 받기 [내부링크]

게임에서 특정 구역에 들어갔을 때 특정 액터를 입력에 의해 조작하는 경우 액터에서 입력을 받아야한다. 액터에서 입력은 EnableInput을 통해 입력을 받으며, DisableInput을 통해 입력받는 것을 중지한다. 인자로는 플레이어 컨트롤을 넘겨주면 된다. 액터 클래스 코드 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MyActor.generated.h" UCLASS() class TEST_API AMyActor : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AMyActor(); protected: // Called whe

언리얼(Unreal) - 오브젝트 풀링 [내부링크]

1. 오브젝트 풀링 적용 여부를 결정하는 액터 생성 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "ObjectWithinPool.generated.h" UCLASS() class OBJECTPOOLINGTEST_API AObjectWithinPool : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AObjectWithinPool(); virtual void SetLifeSpan(float LifeSpan = 2.f) override; void SetActive(bool InActive); bool IsActive(); protec

언리얼(Unreal) - 열거형(Enum) 이름 추출(FName, FString) [내부링크]

1. 열거형 작성 UENUM(BlueprintType) enum class ELevelName : uint8 { StartStage UMETA(DisplayName = StartStage), FirstStage UMETA(DisplayName = FirstStage), SecondStage UMETA(DisplayName = SecondStage), }; 2. UEnum 생성 const UEnum* CharEnum = FindObject<UEnum>(ANY_PACKAGE, TEXT("ELevelName"), true); UEnum을 생성하여 우리가 작성한 열거형의 이름을 두번째 이름에 작성하면 해당 정보가 저장된다. 3. 인덱스를 통한 이름 추출 for (int i = 0; i < CharEnum->NumEnums(); i++) { ELevelName LevelName = (ELevelName)(CharEnum->GetValueByIndex(i)); UE_LOG(LogTemp, Wa

언리얼(Unreal) - 문자열 타입을 람다함수에서 사용 시 주의할 점 [내부링크]

void AUnrealProjectGameModeBase::ChangeLevel(ELevelName InLevel) { const UEnum* CharEnum = FindObject<UEnum>(ANY_PACKAGE, TEXT("ELevelName"), true); auto ChangeLevelName = FName(CharEnum->GetNameStringByValue((int64)InLevel)); ChangeMenuWidget(GameInstance->GetLoadingUI()); FTimerHandle WaitHandle; float WaitTime = 1.f; GetWorldTimerManager().SetTimer(WaitHandle, FTimerDelegate::CreateLambda([=]() { UGameplayStatics::OpenLevel(GetWorld(), ChangeLevelName); }), WaitTime, false); } void AUnrealPro

언리얼(Unreal) - 데칼(Decal), 공격 범위 설정(원, 도넛, 부채꼴) [내부링크]

데칼이란 머티리얼을 액터의 표면에 투영하는 것을 말한다. 데칼을 통해 공격 범위를 설정하는 법을 알아보겠다. 1. 데칼 머티리얼 생성 머티리얼을 생성하고 디테일창의 머티리얼 도메인과 블렌드 모드를 다음과 같이 설정한다. 간단하게 VectorParameter를 생성하여 베이스 컬러에 적용해주고 원하는 색상을 설정한다. 2. 데칼 액터 생성 후 데칼 머티리얼 적용 데칼 액터를 월드에 배치한 후 우리가 만든 머티리얼을 적용해준다. 데칼의 범위가 표면에 오버랩되어있을 경우만 투영되어 적용되며 기본적으로 사각형의 형태를 띄게 된다. 큐브를 배치해보니 큐브 위에도 데칼이 투영되어 나타나는 것을 볼 수 있다. 큐브에는 데칼이 적용되지 않게하려면 큐브에서 Receives Decals 속성의 체크를 해제해주면 된다. 3. 원 형태의 데칼 SphereMask라고 되어있지만 투영되면 원과 같으니 해당 마스크를 생성한다. 다음 두 개를 생성한다. SphereMask와 연결해주는데 A는 데칼의 원점을 의미

언리얼(Unreal) - 마우스 클릭 이동(SetInputMode) [내부링크]

마우스를 클릭하여 캐릭터를 이동시키는 방법을 알아보겠다. 0. 모듈 추가 AIModule과, NavigationSystem을 프로젝트명.Build.cs에서 추가해준다. 1. 키 매핑 오른쪽 마우스 버튼을 누르면 이동하도록 키를 설정한다. 2. 플레이어 컨트롤러 클래스 생성 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/PlayerController.h" #include "MyPlayerController.generated.h" /** * */ UCLASS() class TEST_API AMyPlayerController : public APlayerController { GENERATED_BODY() public: AMyPlayerController(); }; // Fill out

언리얼(Unreal) - 캐릭터 부드럽게 회전하는 법 [내부링크]

bUseControllerRotationPitch = false; bUseControllerRotationYaw = false; bUseControllerRotationRoll = false; GetCharacterMovement()->bOrientRotationToMovement = true; 캐릭터의 회전 값을 컨트롤러가 아닌 이동방향에 맞게 부드럽게 회전하기 위해서는 위의 3가지 옵션을 꺼준 후 bOrientRotationToMovement를 true로 체크해준다. 플레이어 캐릭터나 AI를 사용하는 적 캐릭터 모두 해당된다. 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일 부탁드립니다.

언리얼(Unreal) - 발사체(Projectile) [내부링크]

3 - 발사체 구현 일인칭 슈팅 게임에 발사체를 구현하는 법입니다. docs.unrealengine.com 공식 문서를 참조하였으며, 공식 문서에서의 블루프린트 내용을 해당 글에서는 모두 C++로 작성하고 전체적인 코드를 간단하게 수정하였다. 터렛을 하나 두고 HUD의 조준점을 통해 공을 발사하는 코드를 작성할 것이다. 0. 프로젝트 세팅 입력에서 발사를 담당하는 Fire와 터렛의 좌우 회전을 위한 Yaw를 각각 매핑한다. 콜리전에서 오브젝트 채널을 하나 생성한 뒤 기본 반응을 블록으로 하고 프리셋을 생성한다. 우선 모든 유형과 충돌이 가능하게 설정했다. 1. Ball.h, Ball.cpp - 공 클래스 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include

언리얼(Unreal) - 파티클(Particle), 사운드(Sound) 재생 [내부링크]

파티클과 사운드를 재생하는 방법에는 여러 가지가 있다. 쉬운 방법은 노티파이를 이용하는 것이다. C++로 하는 방법 중에는 원하는 위치에 재생하는 방법과 원하는 컴포넌트에서 재생하는 방법이 있다. 차이점은 위치에 재생을 하면 해다 위치에 고정이 되지만 컴포넌트에서 재생을 하면 컴포넌트가 이동함에 따라 같이 이동되는 점이다. 테스트는 1인칭 템플릿에서 진행하였다. 프로젝트명 + Projectile 클래스만 수정하면 된다. UPROPERTY() UParticleSystem* ExplosionParticle; UPROPERTY() USoundBase* ExplosionSound; 헤더 파일에 파티클과 사운드를 저장할 변수를 선언한다. #include "Kismet/GameplayStatics.h" #include "Particles/ParticleSystem.h" #include "Sound/SoundBase.h" cpp파일에 위의 헤더를 추가한다. static ConstructorHel

언리얼(Unreal) - 커스텀 클래스(유틸 클래스, 열거형, 구조체) [내부링크]

테스트는 모든 클래스가 공용으로 쓸 수 있는 유틸 클래스를 만들어 보는 것으로 함수를 포함하여 열거형이나 구조체도 공용으로 사용가능하게 만들어 볼 것이다. 1. 클래스 생성 부모 클래스를 없음으로 지정 후 클래스를 생성한다. // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" /** * */ class TESTPROJECT_API Custom { public: Custom(); ~Custom(); }; 그럼 위와 같이 생성이 된다. #include "Custom.generated.h" 헤더 추가 부분 맨 아래(CoreMinimal.h 아래에)에 generated 헤더를 추가한다.(Custom은 클래스 명) 2. 열거형 UENUM(BlueprintType) enum class ECustomEnum : uint8 { Test1 UM

언리얼(Unreal) - UMG(UI) [내부링크]

0. UMG 모듈 추가 프로젝트명.Build.cs에 UMG 모듈을 추가한다. 1. GameMode // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "TestProjectGameModeBase.generated.h" /** * */ UCLASS() class TESTPROJECT_API ATestProjectGameModeBase : public AGameModeBase { GENERATED_BODY() public: ATestProjectGameModeBase(); UFUNCTION() void ChangeMenuWidget(TSubclassOf<UUserWidget> NewWidgetClass); protected: virtual void BeginPlay() override; UPRO

언리얼(Unreal) - 데이터 저장 및 불러오기(.sav) [내부링크]

1. SaveGame을 상속받는 클래스 생성 2. SaveGame 코드 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/SaveGame.h" #include "TestSaveGame.generated.h" /** * */ UCLASS() class TEST_API UTestSaveGame : public USaveGame { GENERATED_BODY() public: UPROPERTY(VisibleAnywhere, Category = SavedValues) FString SlotName; UPROPERTY(VisibleAnywhere, Category = SavedValues) uint32 PlayerIndex; UPROPERTY(VisibleAnywhere, Category =

언리얼(Unreal) - 타임라인(Timeline) [내부링크]

타임라인을 이용하여 간단한 애니메이션등을 만들 수 있다. 별도의 Tick함수를 추가한다고 보면 된다. 1. 커브 커브에는 3가지 종류가 있는데 각각의 값을 커브를 통해 조절한다. Vector를 사용해보겠다. 좌측의 색상을 통해 각 축에 해당하는 색상을 알 수 있다. 처음에는 축이 겹쳐 있는 것이다. 키 추가를 통해 키를 추가할 수 있으며 마우스로 조정이 가능하다. 키를 추가하여 각 축을 분리하여 구분이 가능하게 한다. 정밀한 값은 좌측 상단에서 조절할 수 있다. 좌측이 시간 우측이 값이다. 이렇게 하면 10초까지 z축과 y축의 값이 변동한다. 2. 코드 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "Components/TimeLineComponen

언리얼(Unreal) - AI MoveTo 끊김 현상 [내부링크]

비헤이비어 트리의 MoveTo를 이용하여 타겟의 위치를 쫓고 있었는데 중간 중간 갱신이 안되는지 애니메이션이 끊기는 현상이 발생했다. (블랙보드의 키 선택에 오브젝트가 뜨지 않아서 타겟의 위치 키를 하나 더 만들어서 진행하였다.) 오브젝트의 베이스 클래스를 액터로 바꿔주니 선택이 되고 끊김 현상이 해결되었다. 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일 부탁드립니다.

언리얼(Unreal) - 적 위치 판단, 각도 구하기(CosineAngle2D, DotProduct, CrossProduct) [내부링크]

플레이어가 공격이나 스킬을 시전 시 적이 맞는 범위에 있는지 판단을 해야한다. 충돌영역을 지정하여 오버랩되는지 판단하면 되지만 부채꼴 형태의 범위나 기타 형태의 범위라면 그 범위를 지정해야한다. 좌우 45도로 벌어진 부채꼴 형태라면 구 형태의 충돌범위를 구현 후 액터가 좌우 45도보다 안에 있는지 밖에 있는지 판단해야한다. 테스트를 통해 두 액터사이의 각도를 구해보겠다. 두 액터는 플레이어와 적으로 간주하며, 모든 것은 플레이어 기준이다. 테스트에는 3가지 함수가 이용된다. CosineAngle2D : 플레이어와 적의 각도 2D가 붙어있는 이유는 높이 축인 Z축은 무시하고 XY평면에 투영하여 각도를 코사인으로 계산한 값을 반환하기 때문이다. DotProduct : 적의 앞/뒤 위치 판단 벡터의 내적 CrossProduct : 적의 좌/우 위치 판단 벡터의 외적 플레이어로 사용할 액터와 적으로 사용할 액터 클래스를 만든 후 적으로 사용할 액터는 메쉬를 입혀준다. (코드는 생략) 플레이

언리얼(Unreal) - 네비게이션 시스템(NavigationSystem) [내부링크]

1. 네비게이션 경로 지정 네비게이션 경로로 쓸 공간을 볼륨을 통해 감싸준다. 볼륨이 선택된 상태에서 P를 누르면 갈 수 있는 경로가 녹색으로 표시된다. 2. 모듈 추가 위의 코드에 NavigationSystem 모듈을 추가해준다. 3. 클래스 생성 AIController를 상속받는 클래스를 만들어준다. 4. 코드 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "AIController.h" #include "MyAIController.generated.h" /** * */ UCLASS() class MYPROJECT_API AMyAIController : public AAIController { GENERATED_BODY() public: virtual void OnPossess(APawn* InPawn)

언리얼(Unreal) - 비헤이비어 트리(BehaviorTree) [내부링크]

AI를 구현할 때 쓰이는 기능으로 비헤이비어 트리가 있다. AI의 행동을 상태 머신 혹은 머신 러닝으로 구현할 수 있게 제공한다. 1. 모듈 추가 AIModule과 GameplayTasks 모듈을 추가한다. 2. 비헤이비어 트리 생성 인공 지능 탭에 블랙 보드와 비헤이비어 트리를 생성한다. 인바이런먼트 쿼리란 인공 지능을 더욱 정교한 인공지능을 만들 때 사용하는 것 같다. 나중에 다뤄보겠다. 3. 비헤이비어 트리 구성 블랙보드(Blackboard) AI의 데이터를 저장하는 DB라고 생각하면 될 것 같다. 데이터를 추가할 수 있는 새 키 버튼이 있고 기본적으로 자기자신을 가르키는 SelfActor키가 있다. 비헤이비어트리(BehaviorTree) - 루트(Root) AI의 첫 시작점으로 블랙보드의 데이터를 기반으로 시작하는 것을 볼 수 있다. 빨간색 부분을 마우스로 끌면 화살표가 나오는데 빈 공간에 드롭하면 Composites를 선택할 수 있다. 하나씩 알아보자. - 셀렉터(Selec

언리얼(Unreal) - Collision, Overlap 이벤트 [내부링크]

액터가 충돌 혹은 오버랩되었을 때 발동되는 이벤트에는 Notify~로 되어있는 함수와 OnComponent~로 되어있는 델리게이트가 있다. 0. 콜리전 세팅 프로젝트 세팅의 콜리전에서 오브젝트 채널 3개를 생성한다. 테스트이므로 일단 기본 반응은 모두 무시로 한다. 프리셋도 동일하게 3개를 생성한다. 콜리전은 겹침과 블록을 모두 판단해야함으로 Collision Enabled로 해준다. 충돌 및 오버랩을 판단할 오브젝트로 CollisionActor는 블록, OverlapActor는 겹침으로 체크한다. Ball 오브젝트와 충돌만 체크할 것이므로 Physics Only로 해주고 Ball에만 블록으로 체크해준다. Ball 오브젝트와 오버랩만 체크할 것이므로 Query Only로 해주고 Ball에만 겹침으로 체크해준다. 1. Collision 관련 액터 클래스 // Fill out your copyright notice in the Description page of Project Setti

언리얼(Unreal) - AI 시각, 청각 [내부링크]

AI에게 시각과 청각을 부여해보는 방법을 알아보겠다. 간단한 테스트이기에 플레이어가 가만히 있는 AI라고 할 경우의 예시이다. 1. 모듈 추가 우선 프로젝트명.Build.cs에 AIModule을 추가한다. 2. 플레이어 코드 // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "PlayerCharacter.generated.h" UCLASS() class TESTPROJECT_API APlayerCharacter : public ACharacter { GENERATED_BODY() public: // Sets default values for this character's properties APlayerCharacter(); protected:

언리얼(Unreal) - 데이터 저장 및 불러오기(.csv) [내부링크]

1. GameInstance를 상속받는 클래스 생성 언리얼에서는 싱글톤 패턴과 유사하게 GameInstance라는 것을 제공한다. 해당 클래스를 통해 데이터를 불러오고 공유할 수 있다. 2. GameInstance 코드 #include "Engine/DataTable.h" 헤더 파일에 데이터테이블을 include 해준다. USTRUCT() struct FPlayerData : public FTableRowBase { GENERATED_BODY() public: UPROPERTY(EditAnywhere) int32 Level; UPROPERTY(EditAnywhere) int32 MaxHp; UPROPERTY(EditAnywhere) int32 Attack; UPROPERTY(EditAnywhere) FString Description; }; 데이터 테이블 구조를 FTableRowBase를 상속받는 구조체로 생성한다. UCLASS() class PROJECTUG_API UMyGameI

언리얼(Unreal) - 애니메이션 리타겟팅 [내부링크]

애니메이션 리타켓팅이란 골격구조가 비슷한 스켈레톤에 같은 애니메이션을 적용하는 것을 말한다. 애니메이션을 재사용하는 것이다. 1. 리타깃 매니저 리타깃 매니저를 누르면 좌측에 해당 화면이 나온다. 2. 릭 셋업 릭 셋업에서 선택 가능한 릭을 선택한다. 그럼 위와 같이 각 구조를 리타깃할 수 있는데 자동으로 할당되니 저장을 눌러준다. 구조가 비슷해야 리타깃이 제대로 적용된다.(인간형이면 인간형 몬스터형이면 비슷한 형태의 몬스터형) 3. 애님 애셋 리타깃 리타깃 하고 싶은 애니메이션을 우클릭하여 애님 애셋 리타깃을 눌러준다. 그럼 아까 저장한 스켈레톤이 뜨고 리타깃을 눌러주면 해당 애니메이션이 저장된다. 개인 공부 블로그입니다. 틀린 점이나 기타 문의는 댓글 혹은 메일 부탁드립니다.

언리얼(Unreal) - 델리게이트(Delegate) [내부링크]

델리게이트란 옵저버 패턴의 일종이다. 델리게이트를 호출한 즉시 해당 델리게이트에 등록된 함수들이 호출...

언리얼(Unreal) - Socket(무기 교체) [내부링크]

캐릭터 클래스를 생성 후 이름은 MyCharacter로 하였다. 1. MyCharacter.h PostInitializeComponent...

언리얼(Unreal) - 파일 소스을(를) 열 수 없습니다.(E1696) [내부링크]

언리얼을 하다 보면 해당 오류가 자주 뜨는 편인 것 같다. 파일 경로에 대한 문제인데 파일 경로를 지정해...

언리얼(Unreal) - 함수 반복 호출 및 지연 호출 (월드 시간 속도, 액터 시간 속도) [내부링크]

1. FTimerHandle 선언 시간 관리를 담당할 FTimerHandle 변수를 선언해준다. 2. TimerInstance 월...

언리얼(Unreal) - Iterator(반복자) [내부링크]

TArray, TMap, TSet 모두 사용이 가능하다. CreateIterator는 읽기와 쓰기가 모두 가능하다 Creat...

언리얼(Unreal) - 애니메이션 블루프린트 (애니메이션 애셋) [내부링크]

애니메이션 모드에는 3가지가 있다. Animation Blueprint : 블루프린트를 이용한 애니메이션 Animation ...

언리얼(Unreal) - 애니메이션 몽타주(Montage) [내부링크]

생성한 클래스들은 위 링크와 연결된다. 몽타주란 하나의 애셋에 들어있는 애니메이션을 합쳐서 재생시키는...

언리얼(Unreal) - 애니메이션 노티파이(Notifiy) [내부링크]

애니메이션 노티파이란 애니메이션의 특정 시점에 이벤트를 발생시키기 위한 표시이다. 걷기 애니메이션이...

언리얼(Unreal) - 블렌드 스페이스(Blend Space) [내부링크]

앞에서 한 내용을 참조바란다. 블렌드 스페이스는 애님 그래프에서 샘플링할 수 있는 특수 애셋으로, 두 입...

언리얼(Unreal) - TSet [내부링크]

1. 선언 2. Add(), Emplace(), Append() - 추가 Add와 다르게 Emplace는 임시 생성을 피할 수 있다. 3...

언리얼(Unreal) - 캐릭터 움직임 및 카메라 시점 [내부링크]

캐릭터의 움직임과 시점 설정을 하는 방법을 알아보겠다. 전체 코드는 마지막에 있다. 1. 축 매핑 프로젝트...

언리얼(Unreal) - Collision Preset(LineTrace, Sweep, DrawDebug) [내부링크]

콜리전을 설정하면 콜리전 프리셋을 설정할 수 있게 디테일창이 있다. 다른 오브젝트와 충돌 설정을 어떻게...

언리얼(Unreal) - Object, Actor 검색 (GetTransform) [내부링크]

월드의 오브젝트와 액터를 찾는 방법에는 여러 가지가 있다. 0. 헤더 포함 1. FObjectIterator - 모든 ...

언리얼(Unreal) - 리플렉션(Reflection) [내부링크]

C++에는 C#과 달리 리플렉션 기능이 없기에 언리얼 자체적으로 제공하는 리플렉션 기능을 이용해야 한다....

언리얼(Unreal) - TArray(배열) [내부링크]

C++의 std::vector와 유사한 역할을 하는 언리얼의 동적 배열이다. 1. 선언 2. Init, Add, Emplace, I...

언리얼(Unreal) - TMap, TMultiMap [내부링크]

TMap과 TMultiMap의 차이는 키의 고유성 보장 유무이다. 1. 선언 2. Add(), Emplace(), Append() -...

언리얼(Unreal) - 컴포넌트 추가 [내부링크]

액터를 상속받는 클래스를 만든 후 디테일창을 보면 유니티와 다르게 transform 창이 없지만 컴포넌트를 추...

언리얼(Unreal) - 애셋 불러오기 [내부링크]

1. 애셋 컴파일 시 로드 FObjectFinder&lt;&gt;()를 통해 애셋을 불러올 수 있으며, Succeeded()를 통...

유니티(Unity) - 파티클 충돌 감지(Sub Emitters) [내부링크]

스킬 이펙트를 가진 파티클이 오브젝트에 충돌 시 해당 오브젝트를 감지할 수 있는 방법에 대해 알아보겠다...

유니티(Unity) - 방치형 Defense RPG [내부링크]

게임 소개 - 스폰되는 몬스터들을 제거하여 성장하는 방치형 디펜스 RPG게임이다. - 몬스터는 스테이지...

유니티(Unity) - 현재 시간 가져오기(시간 보상) [내부링크]

프로젝트 진행 중 오프라인 시 시간 보상을 지급하기 위해 시간을 가져올 필요가 있었다. 게임 종료 시에 ...

언리얼(Unreal) - UE_LOG(로그 출력) [내부링크]

1. UE_LOG 인자 UE_LOG를 통해 로그를 출력한다. 첫 번째 인자(로그 카테고리) 일반적으로 Log...

언리얼(Unreal) - StaticClass()(CDO), GetClass() [내부링크]

언리얼에서 C++ 클래스 생성 시 UClass()라는 것이 붙는다. 이렇게 생성된 클래스는 언리얼의 관리를 받...

유니티(Unity) - 이동 관련(상하좌우 이동) [내부링크]

Position을 이용한 이동 방법에는 Transform과 Rigidbody를 이용한 방법이 있다. 앞/뒤/좌/우 이동에 관...

유니티(Unity) - 시점 관련(카메라, 1인칭, 3인칭) [내부링크]

_playerCamera는 플레이어 오브젝트의 하위 오브젝트로 있으며, 플레이어 오브젝트에서 하위 오브젝트의 ...

유니티(Unity) - ThrowAndLive [내부링크]

게임 소개 - 4곳에서 스폰되는 몬스터들을 제거하여 최대한 오래살아남는 미니게임이다. - 좌우 버튼을 눌...

유니티(Unity) - Json 파일로 저장하기 [내부링크]

위에서 JsonUtility를 이용한 변환 방법을 알았다. Json 데이터를 불러와 변환하는 방법은 알았고, 이제...

유니티(Unity) - 비동기 화면 전환(로딩 화면 구현) [내부링크]

한 씬에서 다음 씬으로 넘어갈 때 나오는 로딩 화면 구성을 테스트를 통해 알아보겠다. 1. 오브젝트 생성 ...

유니티(Unity) - Visual Studio 연동 끊길 때(프로젝트 명 바꾸는 법) [내부링크]

유니티에서 비쥬얼 스튜디오 연동이 잘 되다가 가끔 끊겨 있는 경우가 있다. 위와 같이 뜨는 경우인데 해결...

유니티(Unity) - 제이슨(JsonUtility) [내부링크]

JsonUtility 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 1. FromJson&lt;&gt;() 일반 변...

유니티(Unity) - 지정 축 기준으로 이동하는 법 [내부링크]

로켓을 플레이어에게 발사되도록 하던 와중에 LookAt()을 사용하였는데 로켓 프리팹의 z축 기준으로 발사...

유니티(Unity) - Collider 제한하는 법 [내부링크]

콜라이더를 통해 충돌기를 재현하면서 특정 오브젝트에서는 충돌기가 작동하지 않도록 하고 싶어서 방법을 ...

유니티(Unity) - 스크린 좌표를 캔버스 좌표로 변환하는 법(조이스틱 구현) [내부링크]

조이스틱을 구현 후 해상도를 맞추기 위해 UI 스케일 모드를 Scale With Screen Size로 돌린 후 조이...

AvoidRocket(미사일 피하기) [내부링크]

게임 소개 - 플레이어는 우주선을 조이스틱으로 움직이면서 날아오는 로켓들을 피하는 간단한 미니 게임이...

유니티(Unity) - 게임 오브젝트 던지는 법 [내부링크]

게임을 만드는 도중 게임 오브젝트를 드래그로 가지고 다닐 수 있으며, 드래그 앤 드롭으로 언제든지 던질 ...

깃허브(Github) - SSH Key 생성하는 법(깃 허브, 소스 트리 등록) [내부링크]

예전에 깃허브를 사용할 때 어찌어찌하여 SSH Key를 생성하였는데, 소스트리를 사용하다가 SSH Key...

유니티(Unity) - 오브젝트 위치 판단하는 법(시야각 구현) [내부링크]

플레이어 기준에서 적의 위치를 판단하는 법 중에 벡터의 외적과 내적을 통해서 플레이어의 앞/뒤 혹은 좌/...

유니티(Unity) - n단 점프 구현 [내부링크]

Rigidbody와 같은 물리 계열은 프레임이 일정하지 않은Update()문에서 사용하면 프레임 드랍 현상이 발생...

유니티(Unity) - 2D 플랫폼 측면 마찰력 없애는 법 [내부링크]

2D 플랫폼에서 AddForce로 이동 시 바닥이 비어있고 옆에 벽이 있는 경우 벽으로 계속 이동하면 마찰력...

깃허브(Github) - Waiting for your editor to close the file... (Visual Studio Code) [내부링크]

git 명령어 실행 중 Waiting for your editor to close the file... 파일 경로 에러가 떴다. 지정 경로에...

유니티(Unity) - 미니맵 구현 및 최적화 [내부링크]

프로젝트 도중 미니맵을 구성해야하는데 과정은 생각보다 쉬웠다. 테스트 프로젝트를 통해 미니맵 구현을 ...

유니티(Unity) - UI 이미지에 애니메이션 넣는 법(스킬 쿨타임 구현) [내부링크]

UI 이미지에 애니메이션을 넣는 법을 스킬 쿨타임 구현 테스트를 통해 알아보겠다. 1. UI - Image 생...

유니티(Unity) - 랜덤(Random) [내부링크]

Random 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 1. insideUnitCircle Vector2 형태로...

유니티(Unity) - 씬매니저(SceneManager) [내부링크]

SceneManager 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 0. Scene 빌드 방법 유니티 좌...

유니티(Unity) - 코루틴(Coroutine) [내부링크]

Coroutine 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 코루틴을 사용하기 위해서는 반환 타...

유니티(Unity) - 콜리젼(Collision) [내부링크]

Collision 공식 문서를 참조하였으며, 자세한 정보는 아래 링크 참조 1. body, articulationBody, rigidb...

유니티(Unity) - 레이캐스트(Raycast) [내부링크]

Raycast에 관련된 Ray, RaycastHit 공식 문서를 참조하였으며, 공식 문서에 참조로 설명된 Physics.R...

유니티(Unity) - 리소스(Resources) [내부링크]

Resources 공식 문서를 참조하였으며, 자세한 정보는 아래 링크 참조 리소스 클래스는 Assets 폴더 어디...

유니티(Unity) - 콜라이더(Collider) [내부링크]

Collider 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 1. attachedArticulationBody, atta...

유니티(Unity) - 이벤트시스템(EventSystems) [내부링크]

EventStstems 공식 문서를 참조하였으며, 자세한 정보는 아래 링크 참조 이후 설명할 인터페이스의 Poin...

유니티(Unity) - 컴포넌트(Component) [내부링크]

Component 공식 문서를 참조하였으며, 자세한 정보는 아래 링크 참조 1. CompareTag() 해당 게임오브젝...

유니티(Unity) - 리지드바디(Rigidbody) [내부링크]

Rigidbody 공식 문서를 참조하였으며, 자세한 정보는 아래 링크 참조 1. angularDrag 회전저항값을 나타...

유니티(Unity) - 카메라(Camera) [내부링크]

Camera 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 1. allCameras, allCamerasCount, G...

유니티(Unity) - 캔버스(Canvas) [내부링크]

Canvas 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 1. rootCanvas, isRootCanvas rootC...

유니티(Unity) - 벡터(Vector) [내부링크]

Vector 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 Vector2, Vector3, Vector4가 있는데...

유니티(Unity) - 쿼터니언(Quaternion) [내부링크]

Quaternion 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 쿼터니언은 회전을 생성하기 위해 ...

유니티(Unity) - 트랜스폼(Transform) [내부링크]

transform 공식 문서를 참조하였으며, 자세한 정보는 아래 링크 참조 1. position, localPosition 월드 공...

유니티(Unity) - 입력(Input) [내부링크]

Input 함수의 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 1. Input.anyKey, Input.anyK...

유니티(Unity) - OnApplicationPause 함수 호출 안될 때 [내부링크]

게임의 일시 정지 구현 시 호출하는 함수이다. OnApplicationFocus의 경우 호출이 잘되는데 Pause의 경...

유니티(Unity) - 시간(Time) [내부링크]

Time 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 1. Time.time 이번 프레임의 시작 시간을...

유니티(Unity) - 이벤트 함수 실행 순서 [내부링크]

이벤트 함수 실행 순서의 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 ---------------------...

유니티(Unity) - 게임오브젝트(GameObject) [내부링크]

GameObject 공식 문서를 참조하였으며, 자세한 사항은 아래 링크 참조 1. 게임오브젝트(GameObject) 생...

주사위(1041번) [내부링크]

chvj7567님의블로그

제곱수 찾기(1025번) [내부링크]

chvj7567님의블로그

램프(1034번) [내부링크]

chvj7567님의블로그

감소하는 수(1038번) [내부링크]

chvj7567님의블로그

언리얼(Unreal) - 프로젝트 파일 생성 시도 중 오류가 발생했습니다 [내부링크]

프로젝트 생성 도중 해당 에러가 발생 시 해결하는 방법은 간단하다. 에러의 마지막 부분을 보면 .NET ...

언리얼(Unreal) - 프로젝트 생성 [내부링크]

1. 언리얼 엔진 실행 에픽 게임즈 또는 바탕화면의 아이콘을 통해 언리얼 엔진을 실행할 수 있다. 2. 새 프...

진법 변환 알고리즘 - 구현 [내부링크]

진법 변환 알고리즘은 10진수의 수를 n진수로 변환하여 문자열 형태로 반환해주는 알고리즘이다. 재귀함수...

제곱수의 합(1699번) [내부링크]

chvj7567님의블로그

이항 계수 2(11051번) [내부링크]

chvj7567님의블로그

타일 채우기(2133번) [내부링크]

chvj7567님의블로그

이동하기(11048번) [내부링크]

chvj7567님의블로그

동전 2(2294번) [내부링크]

chvj7567님의블로그

정규 표현식(Regex) - 함수, 사용법 [내부링크]

C++ 11부터 문자열의 형식을 지정할 수 있는지 검사할 수 있는 정규표현식이 나왔다. regex 헤더를 포함시...

Contact(1013번) [내부링크]

chvj7567님의블로그

냅색(Knapsack) 알고리즘 - 구현 [내부링크]

냅색 알고리즘은 흔히 배낭 문제로 자주 출제된다. 동적 프로그래밍(DP)의 대표 문제라고도 하니 잘 알아...

스마트 포인터(Smart Pointer) - shared_ptr [내부링크]

C++ 에서는 new 키워드를 통해 동적으로 할당받은 메모리는 반드시 delete 키워드를 이용해 할당받은 메모...

스마트 포인터(Smart Pointer) - weak_ptr [내부링크]

C++ 에서는 new 키워드를 통해 동적으로 할당받은 메모리는 반드시 delete 키워드를 이용해 할당받은 메모...

비주얼 스튜디오(Visual Studio) - LNK 1168 : 쓰기용으로 열 수 없습니다 에러 [내부링크]

비주얼 스튜디오에서 터미널 창이 정상적으로 종료되지 않았을 때 해당 에러가 뜬다. 이럴 때는 강제적으로...

오르막 수(11057번) [내부링크]

chvj7567님의블로그

동전 1(2293번) [내부링크]

chvj7567님의블로그

평범한 배낭(12865번) [내부링크]

해당 알고리즘은 추후에 자세하게 다룰 예정이다.

이친수(2193번) [내부링크]

chvj7567님의블로그

파도반 수열(9461번) [내부링크]

chvj7567님의블로그

2xn 타일링 2(11727번) [내부링크]

chvj7567님의블로그

퇴사(14501번) [내부링크]

chvj7567님의블로그

다리 놓기(1010번) [내부링크]

chvj7567님의블로그

01타일(1904번) [내부링크]

chvj7567님의블로그

스티커(9465번) [내부링크]

chvj7567님의블로그

LCS(9251번) [내부링크]

chvj7567님의블로그

깃허브(GitHub) - push 비밀번호 안될 때 [내부링크]

깃허브를 쓴 지는 얼마 되지 않았는데 공부를 하다가 push하는 단계가 되었는데 아이디 비번을 써야했다. ...

무브(move), 포워드(forward) - 사용법(l-value, r-value) [내부링크]

move, forward를 설명하기에 앞서 l-value와 r-value를 설명하겠다. 쉽게 말하면 &#x3D;(대입 연산자)를 ...

스마트 포인터(Smart Pointer) - unique_ptr [내부링크]

C++ 에서는 new 키워드를 통해 동적으로 할당받은 메모리는 반드시 delete 키워드를 이용해 할당받은 메모...

이진 / 이분 탐색(Binary Search) - 구현 [내부링크]

이진 탐색은 반복문 또는 재귀 함수를 이용해 구현이 가능하며, 이진 탐색을 위해서는 배열이 정렬되어 있...

유니온-파인드(Union-Find) - 구현 [내부링크]

유니온 파인드 알고리즘은 최상위 부모 노드 즉, 루트 노드를 찾거나 루트 노드가 같은지 확인하거나 루트 ...

크루스칼(Kruskal) MST - 구현 [내부링크]

MST(Minimum Spanning Tree)는 최소 신장 트리를 의미한다. 각 노드를 연결하는 간선의 가중치가 있...

다익스트라(Dijkstra) - 구현 [내부링크]

다익스트라는 목표 노드 부터 각 노드까지 최단경로를 구할 때 쓰는 알고리즘이다. 아래 그림을 통해 확인...

1로 만들기(1463번) [내부링크]

chvj7567님의블로그

2xn 타일링(11726번) [내부링크]

chvj7567님의블로그

RGB거리(1149번) [내부링크]

chvj7567님의블로그

계단 오르기(2579번) [내부링크]

chvj7567님의블로그

정수 삼각형(1932번) [내부링크]

chvj7567님의블로그

연속합(1912번) [내부링크]

chvj7567님의블로그

포도주 시식(2156번) [내부링크]

chvj7567님의블로그

리스트(list) - 구조 part1 [내부링크]

list란 포인터를 이용해 연결된 데이터들의 집합이다. 한 데이터가 데이터에 대한 자료와 다음 데이터에 대...

리스트(list) - 구조 part2 [내부링크]

리스트 구조 part1은 아래 링크를 참조바란다. 1. remove(), remove_if() remove()는 동일한 값을 가지는 ...

이분 그래프(1707번) [내부링크]

chvj7567님의블로그

빙산(2573번) [내부링크]

chvj7567님의블로그

트리의 지름(1967번) [내부링크]

chvj7567님의블로그

트리의 지름(1167번) [내부링크]

chvj7567님의블로그

텀 프로젝트(9466번) [내부링크]

chvj7567님의블로그

트리(1068번) [내부링크]

chvj7567님의블로그

치즈(2638번) [내부링크]

chvj7567님의블로그

물통(2251번) [내부링크]

chvj7567님의블로그

람다(lambda) / 익명(anonymous) 함수(function) - 사용법 [내부링크]

람다 / 익명 함수란 이름이 없는 함수라는 뜻이다. 코드의 간결함을 위해 간단한 함수는 람다 / 익명 함수...

열거형(enum, enum class) - 사용법 [내부링크]

열거형이란 정수 값의 집합을 정의하는데 사용된다. 기존 enum에서 C++ 11부터 enum class라는 것이 추가...

예외(exception) 처리 - try, catch, throw, noexcept [내부링크]

예외 처리란 프로그램 실행 도중 발생하는 에러를 처리하기 위한 것이다. try를 통해 코드를 실행하고 실행...

계수 정렬(Counting Sort) - 구현 [내부링크]

계수 정렬은 특정 범위의 숫자가 배열에 있을 때 가능한 정렬이다. 숫자의 크기에 따라 임시 배열이 필요하...

기수 정렬(Radix Sort) - 구현 [내부링크]

기수 정렬은 0 ~ 9까지의 숫자를 담는 Bucket 공간이 필요하다. 한 버킷당 하나의 큐가 필요하기에 총 10...

함수 포인터, function, bind, placeholders, ref - 사용법 [내부링크]

function, bind, placeholders, ref를 사용하기 위해서는 functional 헤더 선언이 필요하다. function과 bi...

영역 구하기(2583번) [내부링크]

chvj7567님의블로그

촌수계산(2644번) [내부링크]

chvj7567님의블로그

내리막 길(1520번) [내부링크]

chvj7567님의블로그

순수 가상 함수(pure virtual function), 추상 클래스(abstract class), 인터페이스(interface) - 구조 [내부링크]

앞에서 구조체 / 클래스 - 응용법 part2 3. virtual function에 대해 알아보았다. 링크를 따라서 들어가 보...

알고리즘(algorithm) - 함수 part1 [내부링크]

알고리즘 헤더는 많은 함수를 제공한다. 그 중에서 많이 쓰고 쓸법한(?) 함수들만 보겠다. 알고리즘 함수들...

알고리즘(algorithm) - 함수 part2 [내부링크]

알고리즘(algorithm) - 함수 part1은 아래 링크를 참조바란다. 1. binary_search() 함수 사용 전에 오름차...

토마토(7576번) [내부링크]

chvj7567님의블로그

숨바꼭질(1697번) [내부링크]

chvj7567님의블로그

연구소(14502번) [내부링크]

chvj7567님의블로그

섬의 개수(4963번) [내부링크]

chvj7567님의블로그

안전 영역(2468번) [내부링크]

chvj7567님의블로그

적록색약(10026번) [내부링크]

chvj7567님의블로그

토마토(7569번) [내부링크]

chvj7567님의블로그

알파벳(1987번) [내부링크]

chvj7567님의블로그

미로 탐색(2178번) [내부링크]

chvj7567님의블로그

셋(set), 멀티셋(multiset), unordered_set - 구조 [내부링크]

set과 multiset은 완전 이진 트리 구조로 자동 정렬되는 레드 블랙 트리로 만들어져 있다. set과 multiset...

DFS와 BFS(1260번) [내부링크]

chvj7567님의블로그

바이러스(2606번) [내부링크]

chvj7567님의블로그

유기농 배추(1012번) [내부링크]

chvj7567님의블로그

병든 나이트(1783번) [내부링크]

chvj7567님의블로그

강의실 배정(11000번) [내부링크]

chvj7567님의블로그

수 묶기(1744번) [내부링크]

chvj7567님의블로그

네임스페이스(namespace) - cin, cout, endl 구현 [내부링크]

네임스페이스란 클래스라고 보면 편할거라고 생각한다. 여러 사람과 협업하여 프로그래밍을 한다고 생각해...

기타줄(1049번) [내부링크]

chvj7567님의블로그

보석 도둑(1202번) [내부링크]

chvj7567님의블로그

5와 6의 차이(2864번) [내부링크]

chvj7567님의블로그

행렬(1080번) [내부링크]

chvj7567님의블로그

스택(stack) - 구조 [내부링크]

스택의 구조는 FILO(Firtst In Last Out) 또는 LIFO(Last In First Out)이다. 먼저 들어간...

큐(queue), 우선 순위 큐(priority_queue) - 구조 [내부링크]

큐의 구조는 FIFO(Firtst In First Out) 또는 LILO(Last In Last Out)이다. 먼저 들어간 ...

저울(2437번) [내부링크]

chvj7567님의블로그

수리공 항승(1449번) [내부링크]

chvj7567님의블로그

문서 검색(1543번) [내부링크]

chvj7567님의블로그

데큐(deque) - 구조 [내부링크]

데큐는 스택과 큐를 합쳐놓은 형태로 양쪽 끝에서 삽입 삭제가 가능한 구조이다. 쉽게 비교하자면 프링글스...

맵(map), 멀티 맵(multimap) - 구조 [내부링크]

map은 완전 이진 트리 구조로 자동 정렬되는 레드 블랙 트리로 만들어져 있으며, key와 value 쌍인 데이터...

벡터(vector) - 동적 배열 [내부링크]

malloc이나 new를 이용한 동적 선언이 있지만 이 또한 상황에 맞게 크기를 지정해주어야 하는 불편함이 있...

보물(1026번) [내부링크]

chvj7567님의블로그

거스름돈(5585번) [내부링크]

chvj7567님의블로그

로프(2217번) [내부링크]

chvj7567님의블로그

전자레인지(10162번) [내부링크]

chvj7567님의블로그

30(10610번) [내부링크]

chvj7567님의블로그

수들의 합(1789번) [내부링크]

chvj7567님의블로그

주유소(13305번) [내부링크]

chvj7567님의블로그

신입 사원(1946번) [내부링크]

chvj7567님의블로그

단어 수학(1339번) [내부링크]

chvj7567님의블로그

캠핑(4796번) [내부링크]

chvj7567님의블로그

뒤집기(1439번) [내부링크]

chvj7567님의블로그

A→B(16953번) [내부링크]

chvj7567님의블로그

페어(pair) - 타입 [내부링크]

pair는 데이터 타입 두 가지를 하나로 묶어주는 일종의 데이터 타입이다. 1. make_pair() - 선언 utility ...

튜플(tuple) - 타입 [내부링크]

tuple은 데이터 타입 두 가지 이상을 하나로 묶어주는 일종의 데이터 타입이다. 1. make_tuple - 선언 tupl...

이터레이터(iterator) - 반복자 [내부링크]

C++ STL는 여러 컨테이너가 일부를 제외하면 대부분 반복자를 지원한다. 컨테이너 클래스에 내부 클래...

template, auto, decltype - 타입 추론 [내부링크]

C++ 11부터는 template 뿐만 아니라 auto, delctype 같은 타입 추론이 생겼다. 여러모로 유용한 것 같다. ...

배열(array) - 정적 배열 [내부링크]

C에서는 정적 배열을 int arr [3] 이런 식으로 작성했지만 C++ STL에서는 더욱 안정적인 array를 제공...

DFS(깊이 우선 탐색) - 구현 [내부링크]

DFS는 깊이 우선 탐색으로 스택으로 표현한다. 아래 그래프를 예시로 보겠다. 시작 노드를 정해준 뒤 인...

BFS(너비 우선 탐색) - 구현 [내부링크]

BFS 너비 우선 탐색으로 큐로 표현한다. 아래 그래프를 예시로 보겠다. 시작 노드를 정해준 뒤 인접 노...

cin / cin.get() / cin.ignore() - 문자 입력 [내부링크]

c++의 대표적인 입력 스트림 cin ch, ch2, ch3는 각 한 문자씩 입력을 받는다. 하지만 a를 입력하고 enter...

cin.getline() / getline() / sstream - 문장 입력 [내부링크]

getline은 2가지 헤더에 정의되어있다. 첫번째는 iostream 헤더 정의 첫번째 argument는 배열 c의 주소를 ...

char[] / char* 타입 - 메모리 [내부링크]

char 타입은 한 문자를 저장하는 데이터 타입이다. 그럼 여러 문자를 가진 문자열은 어떻게 저장하는 방식...

string 타입 - 초기화 [내부링크]

c에서 문자열 타입을 쓰기 위해 char* 이나 char[]을 써왔다면 c++에서는 string이라는 문자열 타입을 아예...

string 타입 - 메소드 part1 [내부링크]

size(), length() - 크기와 길이 size()와 length()는 항상 동일한 값을 출력한다. 하지만 그 의미는 다르...

string 타입 - 메소드 part2 [내부링크]

compare() - 비교 compare() 메소드는 단순히 문자열이 같은지 다른지의 유무를 판별하는 것이 아니다. 문...

char[] / char* 타입 - 메소드 [내부링크]

c 타입의 문자열 메소드는 안정성을 위해 s(size) 키워드를 붙여서 사용하는 것이 디버깅에도 좋으며 컴파...

구조체 / class - 차이점 [내부링크]

c++ 에서 구조체와 클래스의 차이는 무엇일까? 그것은 접근 제어 지시자에 있다. 구조체와 클래스에는 3가...

구조체 / 클래스 - 응용법 part1 [내부링크]

구조체와 클래스에 대해선 접근 지시 제어자를 제외하면 같다는 것을 확인했다. 잘 모르겠다면 아래 링크를...

구조체 / 클래스 - 응용법 part2 [내부링크]

클래스에는 3가지 접근 지시 제어자가 있다. 관련 부분은 아래 part1 링크를 참조 바란다. 1. friend 키워...

포인터 / 레퍼런스 - 구조(기본) [내부링크]

포인터와 레퍼런스를 그림과 비유를 통해 기본 구조를 알아보겠다. 포인터와 레퍼런스는 lvalue와 rvalue에...

포인터 / 레퍼런스 - 구조(심화) [내부링크]

기본편에서 본 이해를 토대로 그림으로 포인터와 레퍼런스의 구조를 알아보겠다. 1. 포인터 위 소스의 14번...

버블 정렬(Bubble Sort) - 구현 [내부링크]

버블 정렬은 두 수를 모두 비교하여 큰 수부터 뒤로 이동시키며 정렬하는 방법이다. 사이즈가 n인 arr배열...

삽입 정렬(Insertion Sort) - 구현 [내부링크]

삽입 정렬은 인덱스 순서대로 자기보다 인덱스 번호가 낮은 순으로 비교해서 자기보다 작은 값이 나오면서 ...

선택 정렬(Selection Sort) - 구현 [내부링크]

선택 정렬은 최솟값을 찾아 처음 인덱스부터 정렬하는 방법이다. 사이즈가 n인 arr배열을 선택 정렬할 경우...

합병 정렬(Merge Sort) - 구현 [내부링크]

합병 정렬은 배열이 한 개가 될 때까지 분할하여 각각 정렬 후 다시 합병하면서 정렬하는 방법이다. 사이즈...

쉘 정렬 (Shell Sort) - 구현 [내부링크]

쉘 정렬은 사이즈에 따른 간격 값을 정해 그 간격을 기준으로 삽입 정렬하며, 간격이 1이 될 때까지 반복하...

힙 정렬(Heap Sort) - 구현 [내부링크]

힙 정렬은 완전 이진 트리를 이용해 최댓값, 최솟값을 찾아 정렬하는 방법이다. 사이즈가 n인 arr배열을 힙...

퀵 정렬(Quick Sort) - 구현 [내부링크]

퀵 정렬은 분할 정복 알고리즘으로 임의의 값을 기준으로 정렬을 분할하여 정렬을 완료한 후 합치는 방식이...