
오늘 학습 키워드
최종 팀 프로젝트
오늘 학습 한 내용을 나만의 언어로 정리하기
이펙트 입히기
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}");
}학습하며 겪었던 문제점 & 에러
-
문제&에러에 대한 정의
-
내가 한 시도
-
해결 방법
-
새롭게 알게 된 점
-
이 문제&에러를 다시 만나게 되었다면?