~초 동안 무적 및 깜빡거림으로 무적 상태 알림

2024. 9. 13. 18:41·기능 구현 방법 정리

게임을 하다 보면 연속으로 공격을 맞는 불합리한 판정을 없애기 위해 피격 대미지 계산 후 일정 시간 동안 무적을 두고는 합니다.

 

주로 무적 시간 동안 깜빡이는 효과로 플레이어들에게 무적 상태임을 알려주고는 했습니다.

 

따라서 이를 구현해 보았습니다.

 

1. 무적은 코루틴으로 처리해주기로 했기에 필요한 아래 네임스페이스가 필요합니다.

    using System.Collections;

 

2. 글로벌 bool 변수를 하나 선언해 줍니다

     bool isInvincilbe = false;

 

3. 무적 상태 진입/해제 및 효과를 아래 메서드 하나로 만들어 줍니다. 

    // 매개변수(초) 동안 무적 상태 처리
    IEnumerator Invincible(float second)
    {
        // 무적 상태 진입
        isInvincible = true;

        // 깜빡깜빡 무적 상태 표시
        
        // 반투명하게 해주기 위해서는 색상의 알파 값을 조정해줘야 하는데
        // 스프라이트/메터리얼 색상 알파값에 직접 접근하여 바꿀 수 없음
        
        // 하지만! 항상 방법은 있는 법
        // 색상 변수를 하나 만들어서 알파 값을 변경
        // > 반투명하게 된 색상 값을 집어넣어 변경

        // 현재 반투명도를 나타낼 색상
        Color tempColor = Color.white;
        // 코루틴 시작(무적 시작) 후 얼마나 진행되었나 세어줄 카운터
        float loopCount = 0f;
        
        // 알파값(투명도) 변화량
        float alphaChange = 0.1f;

        // 무적 시간 내내 반복
        while (isInvincible)
        {
            // 루프 1번당 = 0.02초
            // 20번 반복하면 1번 깜빡임 = 0.4초

            // 좀 더 천천히 깜빡이게 하고 싶으면
            // 알파값 변화량을 줄이고, 루프 횟수를 늘리면 됨
            for (int j = 0; j < 20; j++)
            {
            	// 투명도 변화
                if (j < 10)
                    tempColor.a -= alphaChange;
                else
                    tempColor.a += alphaChange;
                Leon_mat1.color = Leon_mat2.color = tempColor;
                
                // 0.02초 대기
                yield return new WaitForFixedUpdate();
                loopCount += 0.02f;
                
                // 설정한 무적 시간이 지났다면
                if(loopCount >= second)
                {
                    // while 루프를 벗어날 수 있도록 설정 및 무적 시간 종료 
                    isInvincible = false;
                    // for루프 즉시 벗어나게끔
                    break;
                }
            }
        }
        // 마지막에는 원래 색상으로 복구
        Leon_mat1.color = Leon_mat2.color = Color.white;
    }

 

4. 무적 상태로 진입할 상황에서 사용해주기

예시로 제가 만들고 있던 코드 일부를 가져왔습니다.

            // 창병 > 체력 -2
            case "Spearman":
                // 무적 상태에서는 처리하지 않음
                if (isInvincible)
                    break;
                // 돌격 스킬 사용 가능한 상태에서는 스킬만 발동하고 맞지 않음
                if (GameManager.instance.GetChargeReady)
                {
                    StartCoroutine(Invincible(1.5f));
                    GameManager.instance.player_Exp.AddExp(1);
                }
                // 예외 상황이 아니라면 대미지
                else
                    HpChange_Current(-2);
                GameManager.instance.InitSpeed();
                other.gameObject.SetActive(false);
                soldier_hit.SummonHit(soldier_hit.Spearmans);
                break;

 

<< 결과 >> 

처음 충돌한 창병은 스킬 발동 후 무적 상태로 진입

뒤의 창병은 무적 중 상호작용 없이 통과

저작자표시 비영리 동일조건 (새창열림)

'기능 구현 방법 정리' 카테고리의 다른 글

유니티, 스파인) 머티리얼 교체 없이 색상만 바꾸고 싶을 때  (0) 2024.11.25
게임 연출 팁 - 총알  (0) 2024.11.19
스크립트로 스파인 스킨 변경  (0) 2024.08.31
유니티, 스파인) 기초적인 임플란트다. 산데비스탄 잔상 효과 만들어보기  (2) 2024.08.30
유니티) 일시 정지 상태의 게임에서 무언가 진행되도록 하고 싶다면?  (0) 2024.04.12
'기능 구현 방법 정리' 카테고리의 다른 글
  • 유니티, 스파인) 머티리얼 교체 없이 색상만 바꾸고 싶을 때
  • 게임 연출 팁 - 총알
  • 스크립트로 스파인 스킨 변경
  • 유니티, 스파인) 기초적인 임플란트다. 산데비스탄 잔상 효과 만들어보기
ybbro
ybbro
대부분의 포스팅은 pc에서 작성되었습니다. 모바일에서 볼 때 설명이 잘리면 데스크탑 모드를 사용해보길 바랍니다.
  • ybbro
    어떻게든 굴리는 게임 공방
    ybbro
  • 전체
    오늘
    어제
    • 전체 N
      • 스파르타코딩클럽_Unity개발과정 N
      • Unity 2D
        • 카드게임
        • 플랫포머 게임
        • 뱀서라이크
      • Unity 3D
        • 닷지
        • 유니티 짱
        • 디펜스 게임
      • Unity 에러 노트
      • 기능 구현 방법 정리
      • 셰이더 그래프
        • 2D
        • 3D
      • 프로그래머스
      • 자료구조
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    sprite mask
    unity
    세이브
    유니티
    유니티 애니메이터 파라미터 초기화
    스파인
    다크모드
    텍스트매시프로
    hello
    64비트
    앱이 휴대전화와 호환되지 않아 설치되지 않았습니다
    룰렛
    갤럭시 S24
    무료스킨
    삭제
    UI
    잔상
    마스크
    직렬화
    대시
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ybbro
~초 동안 무적 및 깜빡거림으로 무적 상태 알림
상단으로

티스토리툴바