유니티 챌린지/서브프로젝트

0429_ R&D 보스 때린 후 사망 -> 아이템 떨구기 -> 먹으면 사라짐

minquu 2021. 4. 29. 18:15
반응형

## 게임을 제작할 때는 항상 타임 테이블이나 스케쥴 표를 사용해서 어떤 것을 몇시까지 하는지 정하고 하자

 

습관을 들일 필요가 있음 

 

 

 

-----

 

0.보스를 만들어줘서, 전에 했던 몬스터와 같은 구조를 넣어준다. 

 

체력을 가지고, 공격을 입으면, 데미지를 입는다 

-> 나중에는 상속 구조로 해야할 것 (체력을 가진 것들, 죽을 수 있는 것들 등등 )

 

 

1. 먼저 보스가 데미지를 입고 체력이 0이 되면 죽는 애니메이션을 만들어준다.

이건 Animator로 되어있기 때문에, Trigger 를 달아준다.

 

 

  void Update()
    {
        if (this.bossHp <= 0 && this.bossDie == false) {
            StartCoroutine(Die()); 
        }
    }

 

사망 시 (체력이 0 && 죽음bool 값이 false 일때)

 

사망 코르틴 시작.

 

  IEnumerator Die() {
        this.anim.SetTrigger("die");
        this.bossDie = true;
        this.DropItem();
        yield return new WaitForSeconds(6f);
        Destroy(gameObject);
        this.onDie();
    }

 

코르틴 시작시, 애니메이터에서 "die" 애니 플레이

bossDie를 true로 

6초 후 (애니메이션 끝나는 시작)

게임 오브젝트 사라지게하기

 

 

 

 

 

2. 보스가 죽으면 아이템을 인스턴스한다(인스턴스 할 때는 아이템 setActive(false)로 가져와서 숨기기 

그리고 사라진 후에 이벤트 델리게이트 소환해서, 죽은 후 이벤트 달아줘서, setActive(true)로 만들어준다.

 

onDie; (죽는 걸 알려줄 ★이벤트 댈리게이트 // 조금씩 쓰는 법을 알겠음)

 this.DropItem();

DropItem 메서드를 오브젝트가 사라지기전에 달아줘서, 아이템을 만들어준다.

 

Destroy(gameObject);
        this.onDie();

사라지고 난 다음에 onDie() 이벤트를 실시해준다.

 

 public void DropItem()
    {
        var itemGo = Instantiate<GameObject>(this.itemPrefab);
        itemGo.transform.position = this.gameObject.transform.position;
        itemGo.SetActive(false);
        this.onDie = () =>
        {
            itemGo.SetActive(true);
        };
    }
 var itemGo = Instantiate<GameObject>(this.itemPrefab);

아이템 프리팹을 하이라키에 만들어준다.

 

itemGo.transform.position = this.gameObject.transform.position;

생성된 아이템의 포지션을 현재 보스의 위치로 바꿔준다.

 

itemGo.SetActive(false);

아이템을 false해준다 (안 보이게 하기 위해서)

 

this.onDie = () =>
        {
            itemGo.SetActive(true);
        };

이벤트에서 보스가 사라진 걸 알려주게 되면, true로 바꿔주면 아이템이 보이게 된다.

 

 

 

아이템이 잘 뜨는 걸 확인 할 수 있다.

 

 

3. 아이템과 플레이어 충돌 체크해서, 닿으면 아이템 사라지게하기

 

히어로의 콜라이더 충돌에서 other 태그가 아이템이면 로그를 띄워주고, other의 게임 오브젝트를 사라지게 만듭니다.

 

  else if (other.tag == "item") {
            Debug.Log("아이템을 먹었습니다.");
            Destroy(other.gameObject);
        }

 

 

반응형