- FPS Project - 7 [ Spawn 및 죽은 몬스터 통과]2025년 04월 11일
- SiJun-Park
- 작성자
- 2025.04.11.:29
7에서는 레벨에 따른 몬스터를 생성을 하는 것을 목표로 하였습니다.
public class LivingObjects : MonoBehaviour, IDamageable { [Header("유저 부가 정보")] [Space(10)] [Header("체력")] public float HP; [Header("피해 화면")] [SerializeField] Image HitScreen; [Header("몬스터 부가 정보")] [Space(10)] [Header("Prefab")] [SerializeField] HpTextControl MonsterHP; [Header("폰트 사이즈")] [SerializeField] int size; [Header("폰트 위치")] [SerializeField] float pos; [Header("SkinRenderer")] [SerializeField] SkinnedMeshRenderer[] SkinRenderer; [Header("색이 지속되는 속도")] [SerializeField] float ChangeSpeed = .2f; protected bool Dead = false; protected bool HitCheck = false; protected Coroutine CurrentCoroutine; public event System.Action OnDeath;
이전에 만들어 두었던 LivingObjects에 event로 OnDeath를 연결을 해주었습니다.
몬스터만 특별히 처리하는 것인데 굳이 LivingObjects에 있을 필요가 없다고 생각해서 따로 이벤트로 연결 하였습니다.
void OnDeath() { if (--LiveMonster <= 0) Invoke("OnSpawn", 3f); }
그래서 몬스터가 죽을 경우 OnDeath라는 함수를 호출을 하고, 만약에 살아있는 몬스터가 0마리보다 적거나 같다면 onSpawn이라는 함수를 3초 후에 시작을 하게 하였습니다
이는 대기시간을 주기 위해서입니다.
void OnSpawn() { CurrentLevel++; MonsterCount = 3 + CurrentLevel; LiveMonster = MonsterCount; CurrentSpawnTime = 0; float Calculate = (CurrentLevel / 10f); NextSpawnTime = 2 - Calculate; HP = 1 + Calculate; Speed = 0.07f + (CurrentLevel / 100f); if (NextSpawnTime < 0) NextSpawnTime = 0.1f; }
OnSpawn함수에서는 레벨을 증가시켜주고, 레벨에 따른 몬스터의 수, 체력, 다음 몬스터가 생성이 될 텀, 속도 정보를 주게 하였습니다.
void Update() { if(MonsterCount > 0 && Time.time > CurrentSpawnTime) { MonsterCount--; CurrentSpawnTime = Time.time + NextSpawnTime; EnemyManager spawnenemy = Instantiate(Enemy, Vector3.zero, Quaternion.identity) as EnemyManager; spawnenemy.OnDeath += OnDeath; // event 연결 spawnenemy.HP = HP; spawnenemy.NavMeshAgent.speed = Speed; } }
업데이트에선 소환을 하여야 할 MonsterCount가 0보다 많고 생성을 할 주기가 맞다면 현재 소환을 해야할 MonsterCount를 감소시켜 주고 다음 생성 할 주기를 설정 해줍니다.
그 뒤에는 OnDeath라는 Event를 연동을 해주어 몬스터가 죽었을 시 OnDeath라는 함수를 불러올 수 있게 하였습니다.
마지막으로는 레벨에따른 HP와 Speed를 설정을 해줌으로써 완성을 하였습니다.
case "Enemy": LivingObjects damageable = other.GetComponent<LivingObjects>(); if (damageable != null) { if (damageable.GetDead() == true) break; damageable.Hit(1, other.gameObject, Owner); } Destroy(gameObject); break;
그리고 이전 총알에서는 몬스터가 데미지를 입을 수 있다면 데미지를 주는 형식으로 하였는데
이렇게 한다면 죽은 몬스터에게 지속적으로 총알이 들어가기 때문에 몬스터가 죽었으면 다음 오브젝트로 넘어가게 하여서 수정을 하였습니다.
결과 'Unity > FPS Project' 카테고리의 다른 글
FPS Project - 9 [ Sound, 발소리 구현] (0) 2025.04.14 FPS Project - 8 [ 점프 ] (0) 2025.04.13 FPS Project - 6 [ 장전 ] (0) 2025.04.08 FPS Project - 5 [ 몬스터 이동 및 공격 ] (0) 2025.04.06 FPS Project - 4 [ 데미지2 ] (0) 2025.04.05 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)