유니티 방치형 프로젝트 - 타겟을 향해 날아가는 스킬 구현하기 #2

반응형

 

타겟 공격 ( 풀에서 Bullet 꺼내기 )

플레이어가 .타겟 몬스터를 공격하면 공격 애니메이션이 실행되면서 애니메이션 이벤트에서 아래의 Bullet 메서드를 실행한다.

// Character.cs
protected virtual void Bullet()
    {
       Base_Mng.Pool.Pooling_Obj("Bullet").Get((value) =>
        {
            value.transform.position = m_BulletTransform.position;
            value.GetComponent<Bullet>().Init(m_Target,10,"CH_01");
        });
    }

 

Bullet 시작 위치 설정

m_BulletTransform.position은 지팡이 머리쪽의 Transform변수이며 Bullet이 시작되는 위치이다. 보통 총알은 무기에서 발사되니까 ! 어찌 되었든 value 즉 Bullet 오브젝트의 시작위치를 지팡이 위치로 설정하고 타겟 몬스터, 대미지, 이펙트이름을 Init 메서드의 인자로 넣어 실행한다.

 

Init 메서드에서는 무엇을 할까?

일단 Bullet.cs 의 Init 메서드가 실행하기 전에 위 코드에서 Get 람다식을 통해 풀에있는 Bullet을 꺼낼 때 Bullets 이 Awake 되는데 (최초 1회이긴 함 Awake라서) Awake에서는 날아가는 이펙트와 충돌시 터지는 이펙트를 아래와 같이 for 문을 통해 딕셔너리에 저장한다

 

Bullet 오브젝트 살펴보기

위 코드에서 Awake에서 transform getchild 0,1 하는 부분은 아래의 Projectiles와 Muzzles 오브젝트의 Trnasform을 변수에 넣으려 하는 것이다 그리고 보면 각각 잡아놓은 것을 for문으로 돌리면서 자식오브젝트 개수만큼 돌리면서 결국은 딕셔너리에 키(오브젝트이름값) 값(오브젝트 or 파티클)형태로 넣는 것이다.

 

어떤 이펙트를 사용할까?

이제 이렇게 하는 이유를 말할 수 있다 앞서 말한 Init 메서드에서 CH_01 스트링값 보낸것을 _characterName에 저장하고 좀 전에 위에서 딕셔너리에 넣었던 것을 _projectiles[_characterName]으로 찾아서 SetActive(true)하기 위함이다.

 

쉽게 설명하면 나중에 캐릭터가 많아지는데 캐릭터별로 발동할 스킬을 Init 매게변수로 다르게해서  Bullet 프리팹 하나에서 발동시킬 스킬을 홀성화 할 수 있다.

 

어떻게 날라가는데?

Bullet오브젝트는 타겟을 실시간으로 추적하는게 아니다 targetPos에 현재 위치를 한 번 넣어놓고 그 위치로 향해 이동하는 것이다 그러다가 타겟과 0,1 이내로 가까워지면 데미지도 주고 딕셔너리에서 켜놨던것을 다시 Setactive false 시켜서 비활성화 한다 그리고 Muzzle의 재생시간을 구해서 코루틴에 전달하고 일정시간뒤에 풀에 Bullet자체를 반납한다.

 

데미지 표시 처리는

이제 데미지를 타겟 오브젝트 위에 표시되도록 해보자 

우선 데미지 맞기 처리는 Monster 스크립트의 GetDamage로 받는다

 

여기서 value.Getcomponent<HitText>() 해서 풀에서 가져오고 init을 통해 데미지 표시를 어디에 할건지 얼마 데미지를 표시할건지 크리티컬on 인지 등 인자로 넘긴다.

 

 

여기서 중요한건 풀로 꺼내진 HitText는 TextComponent이기 때문에 화면상에 보여질려면 Canvas 자식으로 설정되어야 한다 그래서 아래와 같이 하였다

transform.parent = Base_Canvas.instance.transform;

2초 뒤에 다시 풀로 반환하고...return 클래스에서는 반환한 오브젝트의 부모를 캔버스 -> 풀 그룹 으로 이동시킨다.

 

반응형