오늘 학습 키워드

최종 팀 프로젝트

오늘 학습 한 내용을 나만의 언어로 정리하기

이펙트 입히기

private async void OnTriggerEnter2D(Collider2D other)  
{  
    if (controller.Attack.isStartParry)  
    {  
        if (other.TryGetComponent(out ICountable countable))  
        {  
            Debug.Log("[플레이어] 플레이어 패링 시도");  
            if (countable.CounterAttacked())  
            {  
                controller.Attack.successParry = true;  
                controller.Attack.JustSpecialAttack(other.gameObject.GetComponentInChildren<Animator>());  
                await EffectManager.Instance.PlayEffectsByIdAsync(PlayerEffectID.Parrying, EffectOrder.Player, null,   
                    controller.transform.position + ((other.transform.position - controller.transform.position).normalized   
                    * Vector2.Distance(other.transform.position, controller.transform.position) * 0.5f));  
                Debug.Log("[플레이어] 플레이어 패링 성공");  
            }  
        }  
  
        return;  
    }  
  
    if (controller.Attack.isStartJustAttack)  
    {  
        if (other.TryGetComponent(out ICountable countable))  
        {  
            if (other.TryGetComponent(out MonsterAttackController attackController))  
            {  
                if (attackController.GetIsCountable())  
                {  
                    Debug.Log("[플레이어] 플레이어 저스트 어택!");  
                    controller.Attack.successJustAttack = true;  
                    controller.Condition.SetInvincible(0.5f + controller.Attack.justAttackStopTime);  
                    controller.Attack.SetDamage(controller.Data.justSpecialAttackDamage);  
                    controller.Attack.JustSpecialAttack(other.gameObject.GetComponentInChildren<Animator>());  
                    await EffectManager.Instance.PlayEffectsByIdAsync(PlayerEffectID.SpecialAttack, EffectOrder.Player, null,   
                        controller.transform.position + ((other.transform.position - controller.transform.position).normalized   
                                                         * Vector2.Distance(other.transform.position, controller.transform.position) * 0.5f));  
                    countable.CounterAttacked();  
                    controller.Attack.successJustAttack = false;  
                }   
            }  
            else  
            {  
                controller.Condition.SetInvincible(0.5f + controller.Attack.justAttackStopTime);  
                countable.CounterAttacked();  
            }  
        }  
    }  
          
    if (other.TryGetComponent<IDamagable>(out var damagable))  
    {  
        ShakeCameraUsingState();  
        if (!controller.Attack.successJustAttack) await EffectManager.Instance.PlayEffectsByIdAsync(PlayerEffectID.NormalAttack,  EffectOrder.Player,   
            null,   
            controller.transform.position + ((other.transform.position - controller.transform.position).normalized   
                                             * Vector2.Distance(other.transform.position, controller.transform.position) * 0.5f));  
        damagable?.TakeDamage(attack.AttackDamage + attack.AdditionalDamage);  
        Debug.Log($"[플레이어] 플레이어가 몬스터에게 {attack.AttackDamage + attack.AdditionalDamage} 만큼 데미지 줌");  
    }   
}

백그라운드 이펙트 변경

  • 플레이어 + 모든 몬스터가 까맣게 변하도록 변경
public override async UniTask EffectAsync(EffectOrder order, CancellationToken token, GameObject target = null, Vector3 position = default(Vector3))  
{  
      
    try  
    {  
       //빨강. 컬러를 이 SO의 PointColor로 바꾸기  
        //검정. 컬러를 검정으로 바꾸기  
        ChangeMapColor(StageManager.Instance.ColorBgs, PointColor);  
        ChangeMapColor(StageManager.Instance.BlackBgs, blackColor);  
  
         
        ChangeCharacterColor(PlayerManager.Instance.player.gameObject, blackColor);  
        for (int i = 0; i < StageManager.Instance.currentStageController.aliveMonsters.Count; i++)  
        {  
            ChangeCharacterColor(StageManager.Instance.currentStageController.aliveMonsters[i], blackColor);  
        }  
          
  
        //Duration초 동안 지속되도록 하기  
        //끝나면 원래대로 돌려놓기  
        await UniTask.Delay((int)(Duration * 1000), cancellationToken: token);  
          
    }   
    catch (OperationCanceledException)  
    {  
        Debug.LogWarning($"[이펙트: UniTask (ID : {effectId})] EffectAsync operation cancelled");  
    }  
    catch (Exception e)  
    {  
        Debug.LogError($"[이펙트: UniTask (ID : {effectId})] EffectAsync operation failed: {e}");  
    }  
    finally  
    {  
        ChangeMapColor(StageManager.Instance.ColorBgs, Color.white);  
        ChangeMapColor(StageManager.Instance.BlackBgs, Color.white);  
          
        ChangeCharacterColor(PlayerManager.Instance.player.gameObject, Color.white);  
        for (int i = 0; i < StageManager.Instance.currentStageController.aliveMonsters.Count; i++)  
        {  
            ChangeCharacterColor(StageManager.Instance.currentStageController.aliveMonsters[i], Color.white);  
        }  
          
    }  
}  
  
private void ChangeMapColor(List<Renderer> renderers, Color color)  
{  
    MaterialPropertyBlock mpb = new MaterialPropertyBlock();  
    for (int i = 0; i < renderers.Count; i++)  
    {  
        renderers[i].GetPropertyBlock(mpb);  
        mpb.SetColor(ColorID, color);  
        renderers[i].SetPropertyBlock(mpb);  
    }  
}  
  
private void ChangeCharacterColor(GameObject parent, Color color)  
{  
    SpriteRenderer characterRenderer = parent.GetComponentInChildren<SpriteRenderer>();  
  
    if (characterRenderer == null) return;  
  
    MaterialPropertyBlock mpb = new MaterialPropertyBlock();  
    characterRenderer.GetPropertyBlock(mpb);  
    mpb.SetColor(ColorID, color);  
    characterRenderer.SetPropertyBlock(mpb);  
}

저스트 섬단 시 이펙트가 섬단의 방향을 따라가도록

private void OnEnable()  
{  
    Vector2 playerToMonster = (Vector2) gameObject.transform.position - PlayerManager.Instance.player.Attack.justAttackStartPosition;  
    float seeAngle =  Mathf.Atan2(playerToMonster.y, playerToMonster.x) *  Mathf.Rad2Deg;  
    transform.rotation = Quaternion.Euler(0, 0, seeAngle);  
    Debug.Log($"[이펙트] 섬단 이펙트 회전 {transform.localRotation.eulerAngles}");  
}

학습하며 겪었던 문제점 & 에러

  • 문제&에러에 대한 정의

  • 내가 한 시도

  • 해결 방법

  • 새롭게 알게 된 점

  • 이 문제&에러를 다시 만나게 되었다면?

내일 학습 할 것은 무엇인지