의식의 흐름대로 게임 만들기 7. 플레이어 사격 제한

2023. 7. 22. 20:15GAME/Unity

안녕하세요.

 

사격에 대해서 한가지 빼먹은것이 있습니다. 바로 사격 제한 시간입니다.

현재 플레이어는 마우스를 클릭 하기만 하면 제한시간이 없이 마구마구 발사되는 모습입니다.

 

굉장히 이상하죠. 그리고 버튼을 클릭하야만 발사가 나갑니다. 버튼을 꾹~ 누르고 있어도 발사가 되면 좋겠습니다.

이것을 한번 고쳐보도록 합시다.

 

 

Player Fire 코드에서 보면

Input.GetMouseButtonDown() 이라는것이 있습니다. 이것은 버튼을 클릭 했을때를 의미합니다.

Down도 있듯 Up도 있습니다. 이것은 버튼을 때엇을때를 의미하겠죠.

 

우리가 하고싶은 행위는 버튼을 클릭했을 때 부터 때기 전까지의 처리입니다. 즉 홀딩 상태이죠.

이것은 Down/Up 이라는 키워드를 빼면 됩니다.

 

 

이렇게 한다면 눌렀을때 계속 실행되니까 수많은 총알들이 생성되면서 선이 되는것처럼 보이네요..

대기시간의 필요성이 확고해졌습니다.

 

대기 시간 이라는것은 전에 학습한 내용으로 구현이 가능합니다.

 

바로 시간을 나타내는 개념이 있죠. Time.deltatime입니다. 

Time.deltatime을 뭐라고 했었죠? 바로 이전 프레임에서 현재 프레임까지 걸린 시간이죠.

 

결론은 시간입니다.

 

프레임이 흐르면서 생기는 시간을 누적한다면 그것이 시간의 흐름이 되는것이죠.

 

자 그럼 이것을 코드로 구현 해 본다면.

 

먼저, 흘러가는 시간을 누적시킬 변수와 발사 대기 시간 그리고 발사 가능 상태 변수를 만듭니다.

 

Update문에서 시간을 누적시킬 currnetTime에 흘러가는 시간을 더하고 

만약 누적 시간이 대기 시간보다 크거나 같아진다면 결국 시간은 대기 시간까지 흘러갔음을 나타내죠.

대기가 완료됨으로서 발사 가능 상태를 참으로 만들고 

 

처음부터 다시 시간을 잴 것이니 누적 시간을 0으로 초기화 해 줍니다.. 간단하쥬?

 

그렇다면 이제 발사 가능 상태를 가지고서 진짜 발사를 해야합니다. 하지만 기능이 추가되면서 코드의 가독성이 떨어진 것 같습니다. 

 

속성은 변수이고 기능은 결국 함수입니다. 함수로 만드는것이 좋습니다.

 

Fire() 함수에 이런 기능을 넣습니다.

그리고 마지막 줄에는 발사를 했으니 IsFire을 false로 바꾸어야 하죠.

그리고 시간을 처음부터 재야하기 때문에 누적 시간을 0으로 초기화 해 줍니다.

 

이게 처음에는 어려울수도 있습니다. 근데 생각을 최대한 간단히하면 이해하기 쉽습니다.

코딩이라는게 정말 생각을 간단히 해야지 좋거든요.

 

게임을 하다보면 스킬이 있잖아요? 

근데 그 스킬을 사용하는데 사용이 가능하면 밝은 화면으로 뜨고 사용이 불가능 하면 검은 화면으로 뜨잖아요? Isfire가 그겁니다. 참과 거짓을 나타내죠. 

 

스킬 쿨타임이 됬을때는 재사용이 가능하게 밝은 화면으로..

아직 쿨타임이 되지 않았을때는 검은 화면으로... OK?

 

스킬을 사용했을때는 처음부터 게이지가 차니까... currentTime을 0으로... Isfire을 false로 하는거죠.

 

이정도면 이해가 되셨을거에요.

 

마지막으로 이렇게 쓴다면...

 

발사 대기 시간이 구현되었네요!