Project

· Oh My Sword
개요프로젝트가 완성 되어 어떤 결과물이 나왔고 프로젝트를 진행하며 무엇을 느꼈는지 정리한 글입니다.  게임 개요이름Oh My Sword장르캐주얼, 경쟁개발 도구Unity, C#개발 기간 2023.11.01 ~ 2023.11.21 인원3인 게임 소개Oh My Sword는 io게임과 같이 게임에 접속한 플레이어들이 함께 즐기는 게임입니다. 친구와 짧은 시간 간단하고 유쾌하게 즐길 수 있는 게임을 만들고자 제작하게 되었습니다.  액티브 레그돌, 점점 길어지는 검 등 게임 속에 웃을 수 있는 기믹들을 구현하여 가벼운 분위기를 가진 게임을 만들었습니다.  결과물 게임 영상 게임 빌드본 OH_MY_SWORD.zip drive.google.com 깃허브 GitHub - Kiwi-Tanghulu/OhMySword: 오..
개요프로젝트가 완성 되어 어떤 결과물이 나왔고 프로젝트를 진행하며 무엇을 느꼈는지 정리한 글이다.  게임 개요이름강강술래잡기장르캐주얼, 경쟁개발 도구C++, winapi개발 기간2022.11.20 ~ 2022.12.15인원2인  게임 소개강강술래잡기는 하나의 컴퓨터로 친구와 둘이서 즐기는 술래잡기 게임입니다.  친구와 짧은 시간 간단하게 즐길 수 있는 게임을 만들고자 제작하게 되었습니다.  포탈, 점프대와 중력 반전, 입력 반전 등의 환경 변화요소들을 통해 단순하게 술래잡기를 하기 보단 여러 요소를 이용하여 게임을 더욱 풍성하게 즐길 수 있도록 하였습니다.  결과물 게임 영상 게임 빌드본 ganggang_chugmeukil - Google Drive이 폴더에 파일이 없습니다.이 폴더에 파일을 추가하려면 ..

UE5

· UE5
Animation Retargeting하나의 애니메이션을 스켈레톤이 다른 캐릭터들에게도 사용할 수 있도록 하는 기능이다. Rig이라고 하는 중간 오브젝트를 사용하여 스켈레톤의 본이 Rig를 공유하는 다른 스켈레톤의 본에 정보를 전달하는 것이다.  IK Rig 생성리타겟팅을 하기 위해서는 애니메이션과 호환되는 스켈레탈 메시의 IK Rig와 애니메이션을 적용하고자 하는 스켈레탈 메시의 IK Rig가 필요하다.아래의 경로로 IK Rig를 생성고 스켈레탈 메시를 선택하면 된다. IK Rig를 생성한 후 두 에셋 모두 pelvis 본을 리타켓 루트로 설정해준다.  IK Retargeter 생성리타겟팅 기능을 제공하는 IK Retargeter에셋을 생성한다.생성하면 IK Rig를 선택하는 창이 나오는데 애니메이션과..
· UE5
Enhanced InputEnhanced Input은 언리얼의 입력 시스템이다. 입력 데이터에 대한 필터링 및 확장 기능을 제공하고 입력에 따른 액션을 쉽게 변경할 수 있는 입력을 쉽게 제어할 수 있는 기능이다. 유니티의 New Input System이라고 생각하면 될 듯 싶다. 생성 Input/Input Action, Input Mapping Context이 enhanced input과 관련된 에셋이다.  Input Action입력 시스템과 코드를 연결하는 에셋이다. 이름 그대로 입력에 대한 액션을 나타낸다. Value Type : 입력 시 발생하는 데이터의 타입이다. bool, float, Vector2D, Vector3D가 있다.Triggers : 입력 스테이트를 나타낸다. Started(눌림), ..
· UE5
5.4버전에 모션 매칭을 플러그인으로 쉽게 사용할 수 있게 되어 한 번 사용해 보고 사용 방법을 정리해 보았다. 아래 영상을 참고하였다.https://www.youtube.com/watch?v=S4aBd64t-hY   모션 매칭(Motion Matching)?언리얼에서의 모션 매칭이 정리된 문서가 있어 그것을 보면 좋을 것 같다.  https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine Motion Matching In Unreal Engine | Unreal Engine 5.4 Documentation | Epic Developer CommunityUse Motion Matching to cr..

Study

· 기타
객체 지향 프로그래밍은 잘못된 방법으로 사용되기 쉽다. 프로그래밍 언어들은 객체지향에 필요한 요소들을 제공하는 것에 불과하고 결국 객체 지향적으로 사고하고 코드를 작성하는 것은 사람이 하는 것이기 때문이다. 그렇기 때문에 객체 지향 프로그래밍의 길잡이 역할을 해주는 5가지 법칙(SOLID 법칙)이 존재한다. 5가지 법칙은 각각 단일책임의 원칙(SRP : Single Responsibility Principle), 개방폐쇠 원칙(OCP : Open Close Principle), 리스코브 치환의 원칙(LSP : Liskov Substitution Principle), 인터페이스 분리의 원칙(ISP : Interface Segregation Principle), 의존성역전의 원칙(DIP : Dependenc..
· 기타
이 글을 쓰는 시점에서 대략 2년 정도 C#, C++로 프로그래밍 공부를 하였고 내가 객체 지향적으로 코딩을 하는 능력이 매우 부족하다는 것을 느끼게 되었다. 그래서 처음으로 돌아가 객체 지향의 기본적인 개념들을 다시 공부해 보려고 한다.  객체 지향 프로그래밍(Object Orient Programming, OOP)객체 지향 프로그래밍이란 프로그램 구현에 필요한 객체들을 정의하고 그 객체들 간의 상호작용으로 프로그램을 만드는 것으로 "어떤 객체가 어떤 작업을 수행할 것인가"가 핵심이 된다.   객체(Object)실생활 속에서의 객체는 눈에 보이는 물건, 사람, 논리, 사상, 철학 등 우리가 인지할 수 있는 모든 요소라고 말할 수 있다. 객체 지향 프로그래밍에서의 객체란 이런 실생활 속의 객체들의 특성을..
· C++
왜 알아야 할까메모리는 프로그램이 실행되며 그에 맞게 할당된다. 할당된 메모리는 한정되어 있기 때문에 잘 관리해 주지 않고 너무 많은 양을 사용하게 되면 프로그램의 속도가 느려지거나 뻗어버린다. 프로그램의 컨텐츠가 아무리 좋아도 메모리 관리가 잘 안돼서 실행이 원활히 되지 않으면 사용자 입장에서는 그냥 쓰레기가 되는 거다. 따라서 개발자는 메모리 관리를 신경 써야 하고 잘 하기 위해서는 메모리 구조를 알아야 하는 것이다.   프로그램 실행 및 작동 원리메모리 구조를 그냥 외우기 보다는 프로그램의 작동 원리를 이해한다면 메모리 구조를 이해하기 쉬워진다. 프로그램 작동 원리는 이렇다.사용자가 운영체제에 프로그램 실행을 요청한다.운영체제는 하드디스크에 저장된 프로그램을 읽어 메모리의 코드 영역에 저장한다.CP..

Unity

· 유니티
결과물 쉐이더 그래프 unlit shader로 제작하였다. 쉐이더 생성 후 Graph Settings의 Surface Type은 Transparent, Blending Mode는 Addtive로 설정해준다. Transparent는 투명도를 설정할 수 있고 Addtive는 색을 더하는 방식으로 색을 정하는 설정이다.(가색혼합) 이렇게 설정만 해주어도 기본적인 느낌이 잡힌다. 여기서 색을 넣어주기 위해 필요한 노드는 Frenel Effect, Multiply 두개면 된다. Fresnel Power(float) : fresnel의 강도 조절 Fresnel Color(Color, HDR) : 기본 베이스 색 Fresnel Effect는 보는 각도에 따라 반사율을 다르게 하는 노드로 바라보는 각도에 따라 색의 강..
· 유니티
결과물 쉐이더 바다 자체는 에셋 스토어에서 구하였고 주로 물체를 바다 위에 띄우는 작업을 하였다. 바다에 물체를 뛰우기 위해서는 바다 버텍스의 y위치를 구해야 한다. 그러기 위해서 쉐이더를 일부 수정하였다. 가장 중요한 것이 버텍스의 y값을 정하는 텍스처의 uv값을 월드 좌표계를 이용하여 뽑아내야 한다는 것이다. 그 외에도 쉐이더를 어떻게 구현했는지에 따라 수정해야 하는 부분이 더 생길 수 있다. 쉐이더를 수정한 후 버텍스의 y높이를 구하는 부분을 스크립트로 따로 계산하여 쉽게 사용할 수 있게 해주어야 한다. 스크립트 쉐이더 수정이 끝나면 스크립트로 쉐이더에서 수행한 연산을 따로 구현해주면 된다. public class Ocean : MonoBehaviour { public static Ocean Ins..
· 유니티
개요갱 비스트라는 게임의 플레이어처럼 흐물흐물 거리는 플레이어 오브젝트 구현을 정리한 글이다. 결과물내용이 너무 길어 노션에 따로 정리를 하였다. 아래 링크를 통해 확인할 수 있다. 2023-11-04 [Active Ragdoll] | Built with Notion개요attractive-cream-cea.notion.site

Latest

· 기타
드로우콜CPU가 GPU에게 오브젝트를 렌더링하라고 명령 내리는 것을 드로우콜이라고 한다.  렌더링에는 메시, 쉐이더, 텍스처 등의 정보들이 필요하다. 이러한 정보들은  HDD, SSD 등의 데이터 저장 장치에 저장된다. 이러한 정보들은 CPU 메모리에 복사되어 옮겨지게 되고 GPU의 렌더링 작업을 위해 CPU 메모리에서 GPU 메모리에 데이터를 복사하는 과정을 거쳐 GPU에게로 데이터가 넘겨진다. 여기서 렌더링에 사용할 쉐이더, 텍스터의 주소, 알파 블랜딩 사용 여부 등의 렌더링 정보들이 필요하게 되고 이 정보들은 GPU의 렌더링 상태를 저장하는 테이블인 Render States에 저장된다. 이렇게 세팅된 정보들을 바탕으로 GPU는 CPU의 Draw Primitive Call이라는 명령을 받고 렌더링을 ..
· 네트워크
TCP/IP네트워크 통신에 사용되는 프로토콜은 다양하다. 그 중 라우팅에는 IP프로토콜이 주로 사용되고 IP를 기반으로 하여 통신 제어에는 TCP프로토콜이 많이 사용된다. TCP를 기반으로 하는 프로토콜로는 HTTP, SMTP, FTP 등 다양하다. 많은 프로그램등이 TCP와 IP를 기반으로 하여 통신하는 데 이를 묶어 TCP/IP라고 한다. IPIP는 3계층에 해당하는 프로토콜로 데이터를 패킷으로 변환하고 라우팅에 사용되는 IP주소를 설정한다. 이것으로 데이터는 전달될 수는 있겠지만 패킷이 손상되거나 전송 순서가 뒤죽박죽이 되는 등 전송에 대해서는 관여하지 않는다. 이것을 보환하기 위해 TCP가 사용된다. TCPTCP는 4계층에 해당하는 프로토콜로 패킷이 손상되거나 누락되지 않았는지 확인하거나 수신한 ..
· 네트워크
개념OSI모델은 네트워크 프로토콜을 기능별로 7개의 계층으로 나누어 표현한 것으로 다양한 통신 시스템이 서로 통신할 수 있도록 표준을 제시하는 개념이다. 각 계층은 명확한 역할이 있기 때문에 네트워크 통신에서 문제가 발생하였을 때 원인에 따라 어느 계층에서 문제가 발생하였는지 빠르게 파악하여 대처할 수 있다. 각 계층은 하위 계층의 기능만을 사용하고 상위 계층에게 기능을 제공한다.   7계층(응용 프로그램 계층)사용자의 데이터와 직접적으로 상호작용하는 계층이다. 에플리케이션은 이 계층에 의존하여 네트워크 통신을 시작한다. 대표적인 프로토콜로 HTTP가 있다.  6계층(프레젠테이션 계층)데이터의 변환을 담당하는 계층이다. 데이터를 송신할 때 수신 장치의 인코딩 방법에 맞게 데이터를 변화하며 암호화 작업을 ..
개념스레드들은 각자의 스택 메모리를 가지며 힙 메모리, 데이터 영역은 다른 스레드와 공유한다. 스택 메모리는 함수의 실행 정보, 지역 변수가 저장되며 데이터 영역에는 전역 변수, 정적 변수가 저장된다.이것으로 알 수 있는 것은 모든 스레드는 전역, 정적 변수를 다른 모든 스레드들과 공유하고 자신만의 고유한 전역 변수는 가질 수 없다는 것이다. 이 문제를 해결하기 위한 방법이 TLS이다. 기본적으로 각 스레드들은 TLS슬롯을 가지고 있다. 그리고 TLS변수를 선언하면 각 스레드는 그 변수에 대한 값을 저장할 메모리를 확보하고 그 주소값을 TLS배열에 저장한다. 위의 그림의 경우 TLS변수가 gdwTlsIndex1, gdwTlsIndex2이고 이 변수에 대해 스레드가 생성한 메모리의 주소값을 TLS슬롯에 저..
lock은 세 가지 방법으로 구현할 수 있다. 변수를 점유할 때 까지 쉬지않고 계속 점유를 시도하는 방법점유에 실패하면 일정 시간을 대기하고 점유를 시도하는 방법점유 종료 시점에 발행되는 이벤트를 사용하여 점유를 시도하는 방법세 가지의 lock을 구현하고 아래의 코드로 테스트 할 것이다.class Program{ static Lock _lock = new Lock(); static int number = 0; static void Thread_1() { for(int i = 0; i  1번(SpinLock)첫 번째 방법으로 구현하는 lock이다. public class Lock { //여러 스레드에서 사용되므로 volatile로 가시성 확보 ..
wnstjd
wnstjd0605