
오늘 학습 키워드
최종 팀 프로젝트
오늘 학습 한 내용을 나만의 언어로 정리하기
특정 몬스터가 패링이 안됨
- 알고보니 패리 성공 시 공격 위치가 몬스터랑 부딪히지 않아서 생긴 문제
- 플레이어의 패링 공격 정도를 조절해서 해결
Time.timeScale을 쓰지 않고 히트스탑 구현하기
- 대신에 그냥 애니메이터의 속도를 멈추기
IEnumerator TimeStop(Animator monsterAnimator, float time)
{
/*Time.timeScale = 0;*/
// 이거 안통함
/*controller.Animator.animator.speed = 0f;*/
monsterAnimator.speed = 0f;
yield return new WaitForSecondsRealtime(time);
/*Time.timeScale = 1;*/
/*controller.Animator.animator.speed = 1f;*/
monsterAnimator.speed = 1f;
justAttackCoroutine = null;
}- 다만? 왜인지 모르겠으나 플레이어 애니메이터의 경우에는 멈추질 않음. 왤까?
- ㄴㄴ 멈춤 다른 방법 찾아냄
IEnumerator TimeStop(Animator monsterAnimator, float time)
{
// 별로면 이 부분만 빼면 됨
controller.Animator.animator.speed = 0f;
monsterAnimator.speed = 0f;
yield return new WaitForSecondsRealtime(time);
controller.Animator.animator.speed = 1f;
monsterAnimator.speed = 1f;
justAttackCoroutine = null;
}색깔 바꾸기
public override async UniTask EffectAsync(EffectOrder order, CancellationToken token, GameObject target = null)
{
//스테이지 매니저에서 레이어 두 개 찾기 (빨강, 검정)
GameObject pointColorObject = StageManager.Instance.color;
GameObject blackColorObject = StageManager.Instance.black;
//빨강. 컬러를 이 SO의 PointColor로 바꾸기
//검정. 컬러를 검정으로 바꾸기
ChangeMapColor(pointColorObject, PointColor);
ChangeMapColor(blackColorObject, blackColor);
// 타겟 (맞은 몬스터)이 있으면 걔도 같이 검정색으로
if (target != null)
{
ChangeCharacterColor(target, blackColor);
ChangeCharacterColor(PlayerManager.Instance.player.gameObject, blackColor);
}
//Duration초 동안 지속되도록 하기
//끝나면 원래대로 돌려놓기
await UniTask.Delay((int)(Duration * 1000), cancellationToken: token);
ChangeMapColor(pointColorObject, Color.white);
ChangeMapColor(blackColorObject, Color.white);
if (target != null)
{
ChangeCharacterColor(target, Color.white);
ChangeCharacterColor(PlayerManager.Instance.player.gameObject, Color.white);
}
}
private void ChangeMapColor(GameObject parent, Color color)
{
if (parent.GetComponentsInChildren<SpriteRenderer>().Length != 0)
{
foreach (var renderer in parent.GetComponentsInChildren<SpriteRenderer>())
{
renderer.color = color;
}
}
if (parent.GetComponentsInChildren<Tilemap>().Length != 0)
{
foreach (var renderer in parent.GetComponentsInChildren<Tilemap>())
{
renderer.color = color;
}
}
}중간에 끊어지면 어떡하지? 에 대한 답변
public override async UniTask EffectAsync(EffectOrder order, CancellationToken token, GameObject target = null)
{
//스테이지 매니저에서 레이어 두 개 찾기 (빨강, 검정)
GameObject pointColorObject = StageManager.Instance.color;
GameObject blackColorObject = StageManager.Instance.black;
try
{
//빨강. 컬러를 이 SO의 PointColor로 바꾸기
//검정. 컬러를 검정으로 바꾸기
ChangeMapColor(pointColorObject, PointColor);
ChangeMapColor(blackColorObject, blackColor);
// 타겟 (맞은 몬스터)이 있으면 걔도 같이 검정색으로
if (target != null)
{
ChangeCharacterColor(target, blackColor);
ChangeCharacterColor(PlayerManager.Instance.player.gameObject, 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(pointColorObject, Color.white);
ChangeMapColor(blackColorObject, Color.white);
if (target != null)
{
ChangeCharacterColor(target, Color.white);
ChangeCharacterColor(PlayerManager.Instance.player.gameObject, Color.white);
}
}
}- UniTask는 중간에 끊어질 경우 OperationCanceledException 이 발생함.
- 그러면 finally를 무조건 거치기 때문에 색을 안정적으로 돌려놓을 수 있음.
그래서 나온 저스트 섬단 이펙트
