ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Electric Attack 구현하기 ( +Overlap)
    Unity/제로부터 구현 2023. 12. 11. 18:01
    728x90

    오늘의 구현

    1. n명에게 전이되는 번개 공격 구현하기

     

    순서

    1. VFX로 번개 이펙트 만들기
      • 공격시작 이펙트 : 공격시 전류를 모아주는 이펙트
      • 전류 이펙트 : 전류 생성
    2. 적을 탐색해 n명에게 번개 공격하기(Overlap)

     

     

    1. VFX로 번개 이펙트 만들기

    기존에 만들어 놓은 번개 이펙트를 응용해  하나는 캐스팅 이펙트, 하나는 공격 이펙트 두가지 이펙트를 만들어 줍니다.

    두 이펙트를 프리팹으로 만들어주고 스킬을 시전했을때 캐스팅 이펙트를 instantiate 해주고, 정해진 카운트 만큼 번개가 전이 되면서 전이가 다 끝나면 캐스팅 이펙트가 페이트 아웃되게 만들 것 입니다.

     

    공격 이펙트의 경우 4가지 위치값을 이용해 베지어 곡선을 설정하고 noise를 더해 전류처럼 보이게 만들 것 입니다.

     

    2. 적을 탐색해 n명에게 번개 공격하기

    번개 전이는 Physics.OverlapSphere()를 사용해 플레이어 주변에 구형태의 overlap을 만들어 적의 레이아웃을 감지해 콜라이더에 담아 해결할 것 입니다.

     

     - Physics.OverlapSphere() 설정 , 물리 시뮬레이션에 기반한 작업을 수행하기 때문에 FixedUpadate 에 사용

       private void FixedUpdate()
       {
        colliderArr = Physics.OverlapSphere(transform.position, 5f,lay) ;
       }
       
       scene에서 범위 확인 하기 위해 기즈모를 그려 확인 가능
       private void OnDrawGizmos()
       {
        Gizmos.DrawSphere(transform.position, 5f);
       }

     

    - enemy를 감지했을 경우에만 공격할 것이며, 가장 가까운 적부터 시작해 정해진 카운트만큼 번개 공격을 해줍니다.

     

    IEnumerator ElectricArcActiveCo()
        {
            if(colliderArr.Length > 0)
            {
           	//전류 시작
            GameObject enemy = colliderArr[0].gameObject;
            GameObject electricSTRPrefeb =  Instantiate(electricSTR, electricHolder.position, Quaternion.identity);
            electricSTRPrefeb.transform.parent = electricHolder;
            yield return new WaitForSeconds(1.5f);
            
            GameObject electricArc = Instantiate(electricArcFrepeb); 
            //ElectricArcActiv 클래스 SetEnemy(시작지점,끝나는 지점) 설정.
            electricArc.GetComponent<ElectricArcActive>().SetEnemy(electricHolder.transform, enemy.transform);        
    
                yield return new WaitForSeconds(electricSpeed);
    			//elcAttackMaxCount(공격횟수)를 초과할 수 있으니 클램핑 해줍니다.
                int colliderClamp = Mathf.Clamp(colliderArr.Length, 0, elcAttackMaxCount);
    
                for (int i = 1; i < colliderClamp; i++)
                {
                    GameObject newElc = Instantiate(electricArcFrepeb);
                    
                    newElc.GetComponent<ElectricArcActive>().SetEnemy(colliderArr[i - 1].transform, colliderArr[i].transform);
                    
                    yield return new WaitForSeconds(electricSpeed);
                }
            StartCoroutine(FadeOutScale(electricSTRPrefeb));
            Destroy(electricSTRPrefeb,3f);
    
            }
          
        }

     

    페이드 아웃

        IEnumerator FadeOutScale(GameObject obj)
        {
    
            while( obj.transform.localScale.x > 0)
            {
                obj.transform.localScale -= new Vector3(fadeOutELectricSTRSpeed, fadeOutELectricSTRSpeed, fadeOutELectricSTRSpeed);
                yield return new WaitForSeconds(.1f);
            }
    
            obj.transform.localScale = Vector3.zero;
        }

     

    완성

     

    728x90
Designed by Tistory.