소멸 이펙트

Eunho Bae·2022년 5월 24일

화살을 맞으면 사망 이펙트

화살을 맞은 적이 바로 사망 이펙트를 재생하도록 만들어보자

  1. 소멸 이펙트가 있는 스프라이트 중 첫번째 모션을 가져와서 Animator 컴포넌트를 붙인다. (Sprite Renderer의 order in layer는 높은 숫자로)
  2. Animator controller를 만들고 소멸 이펙트를 전부 드래그 앱 드롭해서 붙여주고 Resources->Animations->Effect 폴더에 적절한 이름으로 저장한다.
  3. 1번에서 가져왔던 게임 오브젝트를 프리팹으로 만들어준다.

소스

몬스터는 화살을 맞거나 플레이어의 펀치 공격을 받을 때 바로 소멸함과 동시에 소멸 이펙트를 그 자리에 재생시키도록 하였다.
이 경우 확장성을 위해 이펙트를 재생하고 오브젝트를 소멸시키는 코드를 화살이 닿을 때 또는 플레이어가 펀치 공격을 할 때 하드코딩해서 넣어주는 것이 아닌 OnDamaged()라는 함수를 따로 만들어 필요할 때마다 그 함수를 호출해주는 방식을 채택했다.

MonsterController

   public override void OnDamanged()
    {
        GameObject effect = Managers.Resource.Instantiate("Effect/DieEffect");
        effect.transform.position = transform.position;
        effect.GetComponent<Animator>().Play("DieStart");
        GameObject.Destroy(effect, 0.5f);

        Managers.Obj.Remove(gameObject);
        Managers.Resource.Destroy(gameObject);
    }

ArrowController


...

  protected override void UpdateIdle()
    {
        if (_dir != MoveDir.None) // 유닛 한칸 이동 끝날때까지 입력 못받게
        {
            Vector3Int destPos = CellPos;
            switch (Dir)
            {
                case MoveDir.Up:
                    destPos += Vector3Int.up;
                    break;
                case MoveDir.Down:
                    destPos += Vector3Int.down;
                    break;
                case MoveDir.Left:
                    destPos += Vector3Int.left;
                    break;
                case MoveDir.Right:
                    destPos += Vector3Int.right;
                    break;
            }

            State = CreatureState.Moving;

            if (Managers.Map.CanGo(destPos))
            {
                GameObject go = Managers.Obj.Find(destPos);
                if (go == null)
                {
                    CellPos = destPos;
                }
                else
                {
                    CreatureController controller = go.GetComponent<CreatureController>();
                    if (controller != null)
                        controller.OnDamanged();

                    Managers.Resource.Destroy(gameObject);
                }
            }
            else
            {
                Managers.Resource.Destroy(gameObject);
            }
        }
    }

PlayerController

 IEnumerator CoStartPunch()
    {
        GameObject go = Managers.Obj.Find(GetFrontCellPos()); // 내가 바라보고 있는 방향 +1
        if(go != null)
        {
            CreatureController controller = go.GetComponent<CreatureController>();
            if (controller != null)
                controller.OnDamanged();
        }

        _rangeSkill = false;
        yield return new WaitForSeconds(0.5f);
        State = CreatureState.Idle;
        _coSkill = null;
    }
profile
개인 공부 정리

0개의 댓글