1. FoodSpawner (음식 생성)
2. Food (추락, 삭제)
3. PlayerHealth (HP시스템)
이번에는 음식을 생성하는 스크립트를 작성 할 것이다.
FoodSpawner는 음식을 생성하는데, 생성될 위치를 캐릭터의 위치 주변으로 할 것이다.
FoodSpawner스크립트이다.
먼저 캐릭터를 target으로 가져오고 생성할 food를 Gameobject 배열에 추가한다.
이후에 캐릭터로 부터 음식이 생성될 범위인 X,Y,Z를 정해주고, 생성될 위치인 InsFoodPosition로 선언하였다.
생성하는 코드는 Coroutine으로 작성하였으며, 일단은 Start에서 코루틴을 한번만 실행하고 Coroutine내부에서 whlie(true)로 계속해서 생성되게끔 하였다.
InsFoodPosition은 X,Z의 생성범위를 랜덤으로 하고, 캐릭터의 위치값을 더해주었다.

이때 내가 해맨 곳이 있었는데,
제일 처음에는 InsFoodPosition의 자료형을 Transform으로 잡고 코드에서는 InsFoodPosition.position = ~~ 이런식으로 작성하였더니,
NullReferenceException: Object reference not set to an instance of an object
라는 오류가 발생하게 되었다.
그래서 찾아봤더니, Transform을 선언만 하고, 따로 초기화나 데이터를 넣어주지 않았기 때문에 InsFoodPosition은 Null이라는 값을 가졌고 이 상태에서 .position에 접근하려 했기때문에, 오류가 났다.
그래서 자료형을 Vector3로 고치고, 새롭게 작성하였다.
이후, Instantiate에서 생성할 음식을 랜덤으로 돌리고, 생성위치, 회전값을 정해주었다.
(내가 이해한 Transform 과 Vector3의 관계)

이후 Food Spawner를 생성하고 스크립트를 부착해준다. 이후 기호에 맞게 Inspector를 건드려준다.
이번에는 Food라는 음식이 떨어지도록 하는 스크립트를 만들 것이다.
Food는 여러 음식에 부착할 것이고 일단은 그냥 떨어지도록만 하게끔 만들 것이다.

fallSpeed로 떨어지는 속도를 변수로 잡고, Update로 계속해서 떨어지게끔 만들었다.
이후 Food스크립트를 떨어질 Prefab에다가 부착시키고, fallSpeed를 조정해주었다.

플레이를 해본 결과, 음식의 크기가 굉장히 작다고 판단되어 조금씩 변경하였다.

현 상태
이번에는 음식의 삭제를 만들어볼 것이다.
음식은 땅에 떨어지거나, 플레이어와 부딧혔을때 삭제가 될 것이다.

먼저 Food의 코드를 이렇게 작성하고, 캐릭터의 태그를 Player로, road의 태그를 Ground로 바꿔주겠다.
또한 road나 음식중에 Rigidbody가 존재해야 접촉함수(OnCollisionEnter)가 호출되기에 음식에다가 Rigidbody를 추가해주었다(중력사용 X)

생각해보니까 음식을 Trigger접촉으로 사용해도 될것 같아서 코드를 저렇게 고치고, Collider의 Trigger를 체크박스 해주었다.
이후, 음식의 생성빈도를 추가적으로 고쳤다. (1초 -> 0.2초)

이제야 좀 게임 같이 보인다.
이번에는 캐릭터의 체력시스템을 만들어 볼 것이다.
캐릭터의 체력은 일단 계속해서 감소되어야 하고, 음식을 먹으면 증가될 것이다.

PlayerHealth 스크립트.
우선 최대체력,현재체력,감소체력,감소시간을 변수로 잡아주었고,
HealthUpdate라는 함수로 체력변화를 시킨다.
DecreaseHealth 코루틴으로 계속해서 체력을 감소시킨다.

변수의 값을 이렇게 임시로 잡아주었고,
게임 실행을 해보면 0.5초마다 100에서 1씩 체력이 감소하는 것을 볼 수 있다.
이번에는 음식을 먹었을 때 PlayerHealth를 증가시켜 볼 것이다.

Food의 스크립트를 다음과 같이 변경해준다.
Player태크와 부딧쳤을 때 PlayerHealth를 가져오고 HealthUpdate를 자신이 가지고 있는 체력 증가값을 매개변수로 삼아 호출시킨다.

이렇게 음식에다가 체력 증가값을 넣고, 실행해보면 음식을 먹었을 때 최대 체력을 넘어가는 현상이 나타난다. 음식을 먹어 체력이 증가해도, 최대체력을 넘어서면 안되기 때문에 코드를 수정해야 할 필요가 있다.
나는 이 문제를 프로퍼티로 해결해보기로 했다.

PlayerHealth스크립트
먼저 health를 프로퍼티로 사용하기 위해 Health라는 프로퍼티를 만들고 중요한 것은 값을 넣을때 넣을 값이 최대체력보다 클 경우 넣는 값을 최대체력으로 하는 프로퍼티를 작성하였다.

이렇게 체력이 100을 넘지 않는 것을 볼 수 있다.

Console창에 체력의 증감,
Hierarchy창에 음식의 생성과 삭제를 볼수있다.
개발기간 250413,250415 (14일날 쉼..)