변수와 가변성 기본적으로 변수는 변경이 불가능 하다. 하지만 필요하다면 변수를 변경할 수 있게 선언할 수도 있다. 확인을 위해 variables 라는 프로젝트를 만들자 fn main() { let x = 5; println!("x의 값: {}", x); x = 6; println!("x의 값: {}", x); } 위 코드 작성후 빌드를 실행하면 에러가 발생한다. 에러 메시지를 읽어보면 불변 변수 x에 값을 두번 할당했기 때문이라고 나온다. 변수 이름 앞에 mut 키워드를 추가하면 가변 변수를 선언할 수 있다. fn main() { let mut x = 5; println!("x의 값: {}", x); x = 6; println!("x의 값: {}", x); } 이후 프로그램을 다시 실행하면 다음 결과가 ..
1~100사이의 난수를 생성해서 입력을 받아 입력한 값이 더 큰지 작은지 알려주어 숫자를 맞추는 게임을 구현해보자. 새 프로젝트 셋업하기 책에서는 cargo new 명령어를 통해 새프로젝트를 생성하라고 되어있지만 나는 IntelliJ를 통해 guessing_game 프로젝트를 생성하였다. 플레이어가 예측한 값 처리하기 먼저 플레이어에게 예측한 값을 묻는 코드를 작성해보자 use std::io; fn main() { println!("숫자를 맞혀봅시다!"); println!("정답이라고 생각하는 숫자를 입력하세요."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("입력한 값을 읽지 못했습니다."); println!("입..
시작하며 Rust 언어를 공부하기위해 한국어로 번역된 유일한 책인 이 책을 구매하였다. 그리고 지인의 추천으로 IntelliJ에서 Rust를 사용하고자 한다. 설치 러스트 설치 책을따라 https://www.rust-lang.org/tools/install 주소에 들어가서 rustup을 이용해 러스트를 설치하였다. 설치후 rustc --version 명령어를 통해 버전을 확인하였다. IntelliJ 설치 우선 IntelliJ 부터 설치하자. https://www.jetbrains.com/idea/ 해당 주소에서 커뮤니티 버전을 다운받아 설치하였다. 이제 rust 플러그인을 설치해보자. 플러그인 탭에서 rust를 검색하여 rust 플러그인을 설치하였다. rust 플러그인을 설치하기위해서는 toml 플러그인..
이 책을 고른 이유 언리얼 엔진 관련하여 C++로 개발관련된 책은 얼마 없었다. 그 중에서도 이 책은 책제목에 정석 이라는 단어를 썼다는 점에서 높은 신뢰감을 얻을 수 있었고, 바로 구매하여 책을 따라하기 시작하였다. 느낀 점 챕터 1부터 간단한 게임을 차례대로 만들어보며 구현해 나가는 점에서 성취감과 보람을 느낄 수 있었고, 에디터의 설정이라든지 결과 화면등을 스크린샷으로 보여주고 있어 따라하는데 큰 문제가 없었다. 게임모드, 게임 캐릭터, 모델링, 애니메이션, 월드, 레벨이동, UI 처리 등 게임에서 다뤄야할 필수적인 부분들을 차례대로 설명해주고 있어, 전반적인 기능을 훑어보게되어 좋았다.기술 서적들을 읽으면서 필요한 부분만 읽고 마는 경우가 있었는데, 이 책은 처음부터 끝까지 진행해야만 끝낼 수 있..
💻 Code : https://github.com/tedison7/ArenaBattle 게임 데이터의 저장과 로딩 플레이어의 데이터를 저장하고 불러오는 로직을 구현해보자. 언리얼 엔진은 게임의 데이터를 저장하고 불러들이는 기능을 제공한다. SaveGame이라는 언리얼 오브젝트를 상속받은 클래스를 설계해보자. ABSaveGame 클래스를 생성하였다. 이후 SaveGame을 PlayerState 등에 연결하여 UI에 플레이어 데이터가 나타나도록 예제를따라 코드를 작성하였다. 그리고 플레이어 데이터가 초기화되어 적용된 화면을 확인할 수 있다. 이어서 플레이어 관련 데이터가 변경될 때마다 저장하도록 해보자 그리고 PlayerState의 HighScore 값을 HUD UI에 연동하자 빌드후 플레이를 눌러서 NPC..
💻 Code : https://github.com/tedison7/ArenaBattle 캐릭터의 스테이트 설정 플레이어 캐릭터와 AI 캐릭터의 기능을 체계적으로 관리하기 위해 캐릭터에도 스테이트 머신 모델을 구현해 보자 PREINIT 스테이트 : 캐릭터 생성 전의 스테이트, 캐릭터와 UI를 숨겨둔다 LOADING 스테이트 : 선택한 캐릭터 애셋을 로딩하는 스테이트, AI인지 플레이어인지 구분 가능, 로딩이 완료될때 까지 조종을 비활성화 READY 스테이트 : 캐릭터 애셋 로딩이 완료된 스테이트, 숨겨둔 캐릭터와 UI를 보여주며, 이때부터는 대미지 처리가 가능하며 캐릭터를 조종할수 있다. DEAD 스테이트 : 캐릭터가 HP를 소진하여 사망하는 스테이트, 죽는 애니메이션을 재생하고 UI를 끄는 한편 충돌을 ..
💻 Code : https://github.com/tedison7/ArenaBattle 프로젝트의 정리와 모듈의 추가 언리얼 소스코드는 오브젝트에 관련된 헤더들은 Classes 폴더를 사용하고, 외부에 공개하는 선언 파일은 Public 폴더에서, 외부에 공개하지 않는 파일은 Private 폴더에서 보관하고 있다. 이와같이 폴더 구조를 변경해보자. Source/ArenaBattle 폴더안에 Public, Private 폴더를 생성한다. 그리고 헤더파일(.h)은 Public으로, cpp파일은 Private 폴더오 옮겨 놓는다. 그리고 uproject 파일을 우클릭하여 Generate Visual Studio project files를 선택하여 프로젝트가 재생성될 수 있도록 하자. 컴파일을 하고 에디터를 실행..
💻 Code : https://github.com/tedison7/ArenaBattle AIController와 내비게이션 시스템 플레이어가 조종하지 않는 캐릭터를 NPC(Non Player Character)라고 한다. 드래그하여 배치한 ABCharacter 액터에 인공지능을 추가해 플레이어를 공격할 수 있도록 해보자. AIController를 상속받는 ABAIController 클래스를 생성하였다. 그리고 ABCharacter가 ABAIController를 사용하도록 설정한다. 왜인지 모르겠지만 현재 레벨을 step3 이름의 다른 레벨로 저장하였고, NavMeshBoundsVolume 을 배치하였다. 배치후 뷰포트에서 P 키를 눌러보면 녹색의 네비메시 영역을 확인할 수 있다. 네비메시를 생성한 이유는..
💻 Code : https://github.com/tedison7/ArenaBattle 엑셀 데이터의 활용 엑셀에 저장돼 있는 캐릭터 스탯 데이터 테이블을 언리얼 엔진에 불러들이는 기능을 구현해보자. 언리얼 엔진은 게입을 관리하기 위한 용도로 게임 인스턴스라는 언리얼 오브젝트를 제공한다. 이 게임 인스턴스가 게임의 데이터를 관리하도록 작업하고자 한다. GameInstance 클래스를 상속받는 ABGameInstance클래스를 생성하고. 생성한 ABGameInstance클래스가 게임을 관리하도록 지정하기 위해 프로젝트 세팅의 맵&모드 탭에서 GameInstance 항목을 ABGameInstance로 지정하였다. 그리고 ABGameInstance의 Init함수를 구현하여 로그를 찍어보자 컴파일후 시작시 로그..
💻 Code : https://github.com/tedison7/ArenaBattle 캐릭터 소켓 설정 캐릭터 무기 추가를 위해 마켓 플레이스에서 InfinityBlade: Weapons 를 프로젝트에 추가하자. 무기는 캐릭터에 트랜스폼으로 배치하는 것이 아니라 메시에 착용해야 캐릭터 애니메이션에 따라 무기가 같이 움직인다. 언리얼 엔진은 아이템을 캐릭터에 부착하기 위해 소켓 시스템을 제공한다. hand_rSocket 소켓에 검을 부착해보자. 그리고 위치값을 조정해서 자연스럽게 보이도록 하자. 코드를 통해무기 스켈레탈 메시 컴포넌트를 캐릭터 메시에 부착해보자. 컴파일후 플레이를 해보면 캐릭터손에 무기가 쥐어진 것을 확인할 수 있다. 무기 액터의 제작 필요에 따라 무기를 바꿀수 있게 하려면 무기를 액터로..
💻 Code : https://github.com/tedison7/ArenaBattle 콜리전 설정 언리얼 엔진의 물리 엔진을 활용하려면 콜리전(Collision)이라는 충돌 영역에 대해서 학습해야한다. 크게 세가지 방법으로 제작할 수 있다. 스태틱메시 애셋 : 스태틱메시 애셋에 콜리전 영역을 심는 방법 기본 도형 컴포넌트 : 구체, 박스, 캡슐의 기본 도형을 사용해 충돌 영역을 지정하는 방법 피직스 애셋 : 캐릭터의 각 부위에 충돌영역을 설정하는 방법, 래그돌 효과를 구현할 때 사용 물리 설정은 크게 세 가지로 구분된다. 콜리전 채널과 기본 반응 콜리전 채널의 용도 다른 콜리전 채널과의 반응 충돌체는 반드시 하나의 콜리전 채널을 설정해야한다. 엔진에서는 기본적으로 8개의 콜리전 채널을 제공한다. Wor..
💻 Code : https://github.com/tedison7/ArenaBattle 애니메이션 몽타주 주어진 4개의 공격 애니메이션을 가지고 애니메이션 몽타주를 활용하여 콤보 공격을 구현해보자. 캐릭터 애니메이션 창을 열고 애님 몽타주 생성 메뉴를 눌러 몽타주 애셋을 생성한다. 몽타주는 섹션(Section) 단위로 애니메이션을 관리한다. 몽타주 애셋을 생성하면 기본으로 Default 이름의 섹션이 주어진다. 섹션을 선택하고 디테일 창에서 섹션 이름을 Attack1로 변경하였다. Attack1 ~ Attack4 까지 애니메이션을 섹션에 드래그로 등록하고 각 애니메이션들의 끝시간 항목을 수정하여 연속 공격 모션처럼 보이도록 하였다. 그리고 입력 설정창으로 가서 Action Mappings에 Attack ..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.