Chapter 8-3. 모닥불 : 불 옮겨 붙기

Date:     Updated:

카테고리:

태그:

인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

Chapter 8. 모닥 불에 고기 굽기

불에 닿으면 옮겨 붙게 하기

🚖 플레이어에게 옮겨 붙을 불 프리팹

image

  • 이름은 Burn Effect Prefab
  • 모닥 불 프리팹인 Flame 파티클 시스템과 거의 비슷하므로 일단 복사해서 만들어 주었다.
    • 검은 연기 Smog는 지웠다.
    • 컴포넌트로 붙은 Collider 와 📜Fire.cs 는 제거했다.
    • Emission 에서 방출되는 입자를 좀 적게 해주었다. 모닥불과는 다르게 좀 약한 규모의 불이므로.


📜Burn.cs

플레이어에게 옮겨 붙는 불. Player에게 붙인다.

  • 플레이어에게 옮겨 붙은 불은 플레이어에게 일정 시간동안 데미지를 준 후 사라진다.
  • 옮겨 붙는 불은 플레이어를 따라다녀야 하므로 플레이어에게 옮겨 붙는 불 프리팹을 따로 만들어, 플레이어가 불에 닿으면 플레이어의 자식으로 태어나게 해야 한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Burn : MonoBehaviour
{
    private bool isBurning = false;

    [SerializeField] private int damage;  // 옮겨 붙은 불의 데미지

    [SerializeField] private float damageTime;
    private float currentDamageTime;

    [SerializeField] private float durationTime;
    private float currentDurationTime;

    [SerializeField]
    private GameObject flame_prefab;  // 불 붙으면 프리팹 생성
    private GameObject go_tempFlame;  // 붙은 불 프리팹을 Instantiate 해서 이 곳에 담을 것. (파괴시킬 거라 담아두는게 필요)

    public void StartBurning()
    {
        if(!isBurning)
        {
            go_tempFlame = Instantiate(flame_prefab, transform.position, Quaternion.Euler(new Vector3(-90f, 0f, 0f)));
            go_tempFlame.transform.SetParent(transform);
        }
        isBurning = true;
        currentDurationTime = durationTime;
    }

    void Update()
    {
        if (isBurning)
        {
            ElapseTime();
        }
    }

    private void ElapseTime()
    {
        if (isBurning)
        {
            currentDurationTime -= Time.deltaTime;

            if (currentDurationTime <= 0)
                Off();

            if (currentDamageTime > 0)
                currentDamageTime -= Time.deltaTime;

            if (currentDamageTime <= 0)
                Damage();
        }
    }

    private void Damage()
    {
        currentDamageTime = damageTime;
        GetComponent<StatusController>().DecreaseHP(damage);
    }

    private void Off()
    {
        isBurning = false;
        Destroy(go_tempFlame);
    }
}

  • StartBurning() 👉 플레이어게 붙을 불 생성
    • 플레이어가 모닥불과 충돌했을 때인 📜Fire의 OnTriggerStay(Collider other) 에서 호출 시킬 것이므로 public
    • 이미 불이 붙어 있을 때 또 붙게 하면 안되므로 !isBurning 상태일 때만 프리팹을 생성하도록 한다.
      • 불 입자들은 하늘 위로 날아가야 하므로 회전갑은 X : -90 으로 준다.
      • 태어날 위치는 플레이어인 transform.position
    • 플레이어를 따라다닐 수 있도록 플레이어를 불의 부모로 설정한다.
  • 이미 불이 붙어 있을때 또 불 붙게 하거나 추가 데미지를 가하면 안되므로 isBurning 필요
  • 나머지는 📜Fire.cs 와 비슷.
GetComponent<StatusController>().DecreaseHP(damage);

이 코드 때문에 📜StatusController.cs 를 📜Burn.cs 과 같게 Player에 붙는 것으로 옮겨 주었다.

image

  • 옮겨 붙은 불은 0.5 초 마다 2 의 데미지를 주며 3 초 뒤에 사라진다.
  • 📜StatusController.cs 를 Player에 옮김.


📜Fire.cs

    private void OnTriggerStay(Collider other)
    {
        if(isFire && other.transform.tag == "Player")
        {
            if (currentDamageTime <= 0)
            {
                other.GetComponent<Burn>().StartBurning();
                thePlayerStatus.DecreaseHP(damage);
                currentDamageTime = damageTime;
            }
        }
    }

image

플레이어에게 불이 붙은 것을 확인할 수 있다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기