루미앗

일단 C++ 기반의 일인칭 프로젝트를 만든다. 초반 과정은 생략하자.


그 다음 빌드 해서 디버그 하면 언리얼 엔진이 뜨는데, 프로젝트 세팅에 들어가 입력 관련해서 Reload를 추가 후 버튼을 매핑 하자.


이제 우리가 Character에서 정의해야 할 건 다음과 같다.


  • 탄환 값
  • 재장전 버튼
  • 재장전 버튼에 의한 재장전 구현

Character.h를 열어 정수로 이루어질 탄환 값과 재장전 함수를 정의하자. 우리는 하나의 캐릭터만 가지고 있고, 총기 자체도 캐릭터에 귀속되어 하나 밖에 없으니 그냥 자체적으로 최대 장탄수를 넣는 게 낫다.


/** Simple Reload System */
void Reload();

int32 GunAmmo;


아직 재장전이 완성된 것은 아니다. 이제 구현부로 가서 재장전 키를 인식하는 것과 실제로 작동하는 재장전을 만들어보자. 아까도 말 했지만 총기가 하나 밖에 없으니 그냥 고정된 값을 쓰는 게 이해에 도움이 더 잘 될 것이다.


InputComponent->BindAction("Reload", IE_Pressed, this, &AFPSCppCharacter::Reload);
void AFPSCppCharacter::Reload() {
	GunAmmo = 10;
}


초기 장탄 값은 아직 초기화 되어있지 않지만, 어쨌든 우리는 10으로 설정하면서 탄을 10번 밖에 쏘지 못 하도록 정의했다. 그럼 지금부터 발사 구현 부에서 총알이 0이라면 발사되지 않도록 만들어 보자.

OnFire() 함수에서 구현할 것은 다음과 같다.


  • 장탄 수가 0인지 체크
  • 쏘고 나면 장탄 수 감소
별로 어렵지 않다. 프로그래밍의 기초만 있으면 구현 가능하다.


void AFPSCppCharacter::OnFire() {
	if (GunAmmo != 0) {

		...중략...

		GunAmmo--;
	}

}


실제로 앞서 말했듯, 한 거라곤 고작 기존 코드를 if문으로 감싸서 지금 탄창이 0이 아니면 원래대로 진행하는 코드를 만들었을 뿐이다. 그리고 다른 모든 코드를 진행하고 마지막에 장탄 값 하나를 빼주는 것 뿐이고, 그 이외의 구현할 것은 아무것도 없다.


이제 BeginPlay()로 가서 초기 탄창 값을 초기화 해주자.


GunAmmo = 10;


소스를 모두 저장하고, 이제 언리얼 엔진으로 가서 컴파일을 누른 뒤 총을 발사 해보자. 10발을 모두 발사하면 더 이상 발사되지 않고, R키를 누른 후 다시 발사 된다. 간단한 재장전 시스템을 만들었다. 물론 현실적으로 게임을 만들 때 이런 식으로 만들면 문제가 많지만, 좀 더 자세하게 구현해낸다고 해도 이런 형식으로 굴러간다. 즉 재장전의 개념이 탄창을 꽉 채운다는 개념만으로 만들었기 때문에 재장전 딜레이도 없고, 기존 코드 특성상 발사 속도 제한도 없어 매우 허술해 보이지만, 차근차근 만들어 나간다면 분명 좋은 게임을 만들 수 있을 것이다.

Comment +0