유니티 플레이어 체온 구현과 뜨거운 곳, 차가운 곳 들어갔을 때 효과 구현
저번 글에서 플레이어 체온 구현 글을 작성했다.
하지만!!
수정할게 많았다. 우선 체온을 텍스트로 표현하니 뭔가 UI가 이쁘지 않았다.
그래서 이미지를 활용하여 체온 uibar를 만들었고,
뜨거운 곳에 들어가면 체온이 높아졌다가 빠져나오면 서서히 다시 36.5도로 돌아가도록 만들었다.
그리고 뜨거운 곳이나 차가운 곳에 들어갔다하여 바로 데미지를 입는 것이 아니고,
체온이 38도 이상이거나 34도 이하일 때 데미지를 입게 하였다.
코드 설명 들어가보겠다.
순서대로 현재체온, 시작체온, 최대체온, 최소체온, 감소하거나 증가하는 체온, 회복체온, 체온이미지바이다.
그 다음 데미지를 줘야하니 데미지존에 들어갔을 때 데미지, 데미지주기, 데미지타이머(이건 후에 설명)
그리고 Indicator가 뭐지? 싶을거다 이게 뭐냐면 뜨거운 곳에 들어갔을 때 화면 전체에 붉은색 이미지를
차가운 곳에 들어갔을 때 화면 전체에 푸른색 이미지를 표현해주는 것이다.
그래서 표현해 줄 이미지(indicatorImage), 이미지주기이다.
여기서 주기는 give가 아니고 rate 즉, 얼마나 자주 이미지를 껏다켯다할것이냐를 말하는 것이다.
그 다음 이미지를 코루틴으로 접근할 것이기때문에 코루틴, 그리고 코루틴이 켜져있는지를 체크하고
템프존, 즉 뜨거운 곳이나 차가운 곳을 들어가있는지를 체크할 것이다.
이제 시작이다.
스타트에서 현재체온에다가 시작체온 값을 넣어준다.
그 다음 업데이트에서 체온bar를 가져와준다.(GetPercentage함수는 바로 뒤 이미지에서 설명하겠다.)
그리고 if문으로 체온이 38도 이상이거나 34도 이하일때 데미지를 입게하는데 바로 테이크데미지를 넣어버리면
데미지가 1초에 여러번 들어갈 수 있으니
데미지타이머를 프레임단위로 재생시켜 데미지타이머가 데미지주기보다 숫자가 커지면 if문이 발동되도록 하였다.
나는 damageRate를 1초로 설정해놨기 때문에 1초마다 이 if문이 발동되는 것이다.
if문이 발동되면 다시 타이머를 0으로 설정해서 무한 반복해준다.
그리고 여기가 지금 TempZone. 즉, 뜨거운 곳이거나 차가운 곳인지 체크하고 아니라면
현재체온을 36.5도로 서서히 회복하도록 한다.
그리고 GetPercentage함수 로직을 작성해준다.
이게 뭐냐면 최소 체온, 최대 체온 범위에서 현재체온 값을 반환해준다.
예를 들자면 최소 체온이 10이고 최대 체온이 20이고 현재체온이 15이면 0~1사이에서 값을 반환해주는데 이 경우에는
0.5를 반환해준다. 이해되지?
그 다음 핫함수와 콜드함수를 작성한다.
핫함수는 뜨거운 곳에 들어갔을 때 발동되는거니까 내가 지금 템프존에 들어와있는지를 true로 만들어주고
현재 체온에다가 Mathf.Min(현재체온+ (올라갈체온 * 프레임단위), 최대 체온) 을 넣어주는데 이게 뭐냐면
콤마 앞에 값이 지금 계속 더해지는 구존데 최대 체온 이상으로 올라가면 더 이상 안올라가는 함수이다.
그리고 ShowIndicator함수로 Indacator이미지를 발동시킨다.
쇼인디케이터 함수는 뭐냐면 우선 if문으로 이미지가 널이아니면, 즉 이미지가 있다면
안으로 들어가는데 또 if문이 있다. 현재 코루틴이 이미 실행중이라면 이미지 색을 타겟컬러에 아까 전에 저장해둔
컬러의 색을 넣어준다. 그리고 만약 코루틴이 널이아니라면 즉, 코루틴이 있다면 코루틴을 멈춰준다.
그 다음 인디케이터이미지를 켜주고, 색도 넣어준다. 그러고 코루틴을 실행해준다.
그리고 코루틴을 실행하면 어떤 거를 실행할지 적어준다.
먼저, 코루틴이 실행중인거를 true로 만들어주고, 스타트알파라는 변수에다가 현재 인디케이터이미지 컬러의 알파값을
넣어준다.
그리고 알파라는 변수에다가 이 스타트알파변수값을 넣어준다.
그리고 알파가 0이상일 때 계속 반복되는 와일문을 실행해준다.
이 알파값을 계속 깎아주는데 startAlpha / flashSpeed를 프레임단위로 곱해서 빼준다.
나는 flashSpeed에다가 0.5를 넣어서 0.5초가 되면 와일문을 종료한다.
그리고 인디케이터 컬러에다가 아까 핫함수와 콜드함수에서 준 컬러값을 집어넣고 알파값은 와일문으로 인해 계속 줄어들어 0까지 줄어든다. 그러고 코루틴을 종료한다.
코루틴을 종료했기때문에 인디케이터이미지를 꺼주고, 코루틴중인지 체크하는 bool값도 false로 한다.
그리고 마지막으로 ExitTempZone함수를 실행해준다. 이 함수가 실행되면 현재 TempZone인지를
체크하는 bool 값을 false로 해준다.
이 글을 다 읽어보신분들은 의아할거다
그래서 지금 함수만 주구장창쓰고 사용하는 곳이 없는데 언제 사용할건데??
자. 어디서 사용하냐면 차가운 곳이나 뜨거운 곳인 오브젝트를 만들면 그 오브젝트에다가 스크립트를
새로 만들어서 넣어줘야한다. 그 새로운 스크립트는 다음 글에서 작성해보겠다!!