EasyCastleUNITY

드래곤 플라이트 모작 개발일지4 (드래곤 사망시 이펙트 구현) 본문

2D 프로젝트 개발 일지(드래곤 플라이트 모작)

드래곤 플라이트 모작 개발일지4 (드래곤 사망시 이펙트 구현)

EasyCastleT 2023. 9. 14. 12:14

드래곤 플라이트는 여러가지 연출이 많이 들어간 게임입니다.

이번에는 그 중에서도 드래곤이 죽으면 그 위치에 연기 이펙트(애니메이션)이 시행되도록 해보겠습니다. 

먼저 연기 리소스가 필요한데, 드래곤 플라이트의 연기 역할을 하는 리소스는 아래 그림입니다.

이 하나의 이미지를 가지고 먼저 애니메이션을 만들었습니다.

처음에는 퍼지듯이 나오고, 마지막 즘에는, 각 이미지의 alpha값을 서서히 줄여 사라지는 듯한 연출을 했습니다.

사망 이펙트

드래곤 사망처리

이제 앞에서 총알과 드래곤의 충돌처리를 했었는데, 드래곤에게 hp를 만들고, 그 hp가 0이되면, Destroy해보겠습니다.

Dragon 스크립트 수정,hp는 흰색은 5 골드는 8로 임의로 설정

총알과 부딫치면, hp가 감소하고, 0이되면 사라지도록했습니다.

총알을 맞고 드래곤 사라짐 ,조금 기다리면 영상 나옴

대리자 활용

Dragon 스크립트에서 죽었을 때의 좌표를 대리자를 활용하여 

메인으로 넘기고, 메인에서 드래곤이 죽었을 때, 그 자리에 사망 애니메이션을 생성하도록 했습니다.

Dragon 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Dragon : MonoBehaviour
{
    public System.Action <Vector3> onDie;
    enum eDragonType
    {
        White,Gold
    }
    [SerializeField] private eDragonType dragonType;
    private float moveSpeed;
    private int hp;
    private Vector3 deadPos;
    // Start is called before the first frame update
    void Start()
    {
        this.moveSpeed = 3f;    
        if(this.dragonType == eDragonType.White)
        {
            this.hp = 5;
        }
        else if(this.dragonType == eDragonType.Gold)
        {
            this.hp = 8;
        }
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        this.transform.Translate(Vector2.down * Time.deltaTime * this.moveSpeed);
        this.SelfComeback(); 
    }
    //테스트용 코드
    private void SelfComeback()
    {
        if (this.transform.position.y < -5.5f)
        {
            this.transform.position = new Vector3(this.transform.position.x, 5.86f, this.transform.position.z);
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Bullet"))
        {
            Debug.LogFormat("<color=cyan>{0} Dragon이 총알과 충돌함</color>",this.dragonType);
            this.HitDamage();
        }
    }

    private void HitDamage()
    {
        this.hp -= 1;
        if (this.hp <= 0)
        {
            this.deadPos = this.transform.position; //죽었을 때의 좌표를 저장
            onDie(this.deadPos);
            Destroy(this.gameObject);
        }
    }
}

GameMain

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameMain : MonoBehaviour
{
    [SerializeField] private Player player;
    [SerializeField] private Dragon[] dragons;
    [SerializeField] private BulletGenerator bulletGenerator;
    [SerializeField] private GameObject dustPrefab;
    // Start is called before the first frame update
    void Start()
    {
        foreach(var dragon in dragons)
        {
            dragon.onDie = (deadPos) => {
                GameObject dust = Instantiate(this.dustPrefab);
                dust.transform.position = deadPos;
            };
        }
    }

    // Update is called once per frame
    void Update()
    {
        this.bulletGenerator.Shoot();
    }
}

시연영상

사망 애니메이션이 같은 것만 나오면, 사용자의 몰입감을 방해할 수 있습니다.

그래서 사망 애니메이션을 여러 개 만들고 랜덤으로 등장하도록 해보겠습니다.

사망 애니메이션 추가 제작

2번째 사망 애니메이션

기본적으로 처음 형태를 잡은 다음에, 애니메이션 녹화 기능을 활용하여, 조금씩 이동 및 회전, 알파 값을 조정하여

만들었습니다. 

3번째 사망 애니메이션

이 3번째 애니메이션도 2번째와 같은 방법으로 만들었습니다. 

랜덤함수를 통해 3개의 애니메이션 중 하나가 실행되도록 하였습니다.

랜덤으로 나오는 애니메이션

이렇게 드래곤이 죽으면 사망 이펙트가 생기는 것에 대한 구현을 마쳤습니다.