[UE5]RayTrace(2) Progress bar

dain·2022년 10월 22일
1

1차

  • BP_ThirdPersonCharater
    • if (ray에 Hit된 액터 있음) && (isHit == False)
      : 위젯 뷰포트에 생성하고 isHit = True
    • if (ray에 Hit된 액터 없음) && (isHit == True)
      : 위젯 제거하고 isHit = False
      (isHit 변수는 위젯 중복 삭제로 인한 오류 방지)
  • Generator
  • Progress bar
  • 현재 상황 고쳐야 할 부분이 너무 많다. UI 두개 중 하나는 RayTrace로 구현했는데 다른 하나(progress bar)는 트리거 오버랩으로 구현한 거라 수정해야 한다. 원래는 유튜브 동영상은 참고만 하고 현재 내 프로젝트에 맞춰 구현하려고 했는데 오류가 너무 많이 나서 일단 다 따라하기만 했다. 근데 동영상도 이해 안된 부분이 많고... 뷰포트에서 UI 삭제할 때 왜이렇게 오류가 많이 나는지 모르겠다ㅠㅠ 블루프린트끼리 통신하는 법도 어렵구... 위젯 이미지랑 텍스트도 클래스마다 다르게 설정하고 싶은데 어떻게 해야할지 모르겠다. 유니티에선 그냥 SetActive랑 UpdateText하면 됐었는데... 언리얼 짱이라고 했던 거 취소야 ಥ__ಥ


2차

  • 수정 방향

    1. RayTrace에 콜리전 프리셋이 Generator인 액터 충돌
      → 마우스 이미지 UI 활성화
      (나중에 텍스트는 클래스에 따라 업데이트할 수 있도록 수정)
    2. 마우스 왼쪽 버튼 클릭
      → 'Progress Bar'와 '발전기를 수리하려면 G키를 누르세요` UI 활성화
    3. G키 누르는 동안 Progress bar의 게이지 일정 속도로 채우기
    4. G키를 떼거나 Ray 범위를 벗어나면 (G키를 누르고 있더라도) 그동안 Progress bar의 게이지 일정 속도로 감소
    5. 게이지가 0이 되기 전에 상호작용을 시도하면 그 게이지부터 시작, 아니면 0부터 다시 시작
    6. 게이지가 다 차면 발전기의 수리가 완료되며 (수리 완료 UI & 특수효과) 더이상 상호작용 시도할 수 없음

  • Progress bar 공부
    (https://www.youtube.com/watch?v=SD6RuyaqO9c&t=908s)

    • BP_Generator
      • 설정한 오브젝트의 트리거와 캐릭터가 오버랩 됐을 경우 Enable Input 호출하고 progress bar 위젯 생성 및 뷰포트에 추가
      • 오버랩이 종료됐을 경우 Disable Input 호출하고 위젯 제거

        Enable Input: 액터에서 키보드 입력 받는 경우 필요

    • BP_Generator UI
      • TimeHeld: 플레이어가 상호작용키를 누르고 있는 시간
      • MaxTimeHeld: 최대 상호작용 시간 (눌러야 하는 총 시간)
      • 바인딩
        ? Progress bar를 채우는 것으로 0~1 사이의 값
        - 플레이어가 누른 시간/눌러야하는 시간

    • BP_Generator
      • Generate 액션 키(G키) 누르고 있는 동안 isHeld == true, 누르고 있지 않으면 isHeld = flase
      • Gate
        - isHeld == true일 때 Gate 열려 있으면(오버랩이 일어나서 위젯 생성됐으면) Exit로 신호 출력 O, Gate 닫혀 있으면 출력 X

        Gate
        ? 실행 흐름을 제어하는데 사용되는 노드
        Enter에서 입력 신호를 받아들이고, Gate의 현재 상태(Open/Close)에 따라 그 신호를 Exit로 출력할지 말지 결정

      • 시퀀스: 일련의 핀을 순서대로 실행
      1. RetriggerableDelay 실행 → Delay가 끝날 때 isHeld == True(G키 계속 누르고 있는 상태)면 '수리 완료' 출력하고 위젯 제거

        RetriggeralbeDelay
        : MaxHoldTime 전에 상호작용 키를 떼면, 다시 상호작용을 시도했을 때 0으로 초기화되도록 하는 함수...?

        MaxHoldTime
        : 플레이어가 상호작용 키를 누르고 있어야하는 시간 (인스턴스마다 편집 가능하도록 설정)

      2. Timer와 UpdateTimer 이벤트 호출
      • Timer
      • Update Timer
      • Stop Timer


3차

  • Hit 결과에 따른 위젯 생성/추가
  • 마우스 왼쪽 버튼 클릭에 따른 위젯 생성/추가
    G키(상호작용키) 입력에 따른 Gate 제어 (gate의 흐름은 위와 동일)
  • 시퀀스
    : 수리가 완료될 경우 Finish Generate 이벤트 호출
  • 타이머 이벤트
    : if (isHeld && isHit)인 경우만 Update Timer
    (G키를 떼거나 혹은 Ray의 범위에서 벗어나는 경우 타이머를 멈추고 시간을 0으로 설정)

  • 수리 완료 이벤트
    : 후에 수정할 예정


3차 - 수정

  • 위젯 중복 생성 방지: isHit && isRemove == true일 때만 생성
  • Ray의 범위에서 벗어났는데 G키는 계속 누르고 있는 경우 발생하는 오류 방지

  • 현재 상황

    일단은 이렇게까지 오류 없이 짜보긴 했는데... 잘 짠 건진 모르겠다 🥲
    형변환하면 블루프린트가 항상 로드되어 비용이 올라간다고 하는데 BP_ThirdPerson에 형변환해서 가져온 isHit 변수를 틱이벤트마다 참조해도 괜찮은걸까...? Enable Input도 지금 isGenerate==false 일 때 프레임마다 실행되고 있구... bool 변수랑 branch도 너무 많아서 맘에 안든다ㅠㅠ!
    하 그치만 이게 내 최선이야...




수정 예정 사항

  • 게이지 0으로 초기화되는 것이 아닌 일정 속도로 감소되도록
    : StopTimer 호출 → Set TimeHeld

    if (isHit == false) or (isHeld == false){
      	StopTimer();
     
        while (timeHeld !=0)
        	timeHeld -= x;
    }     
    • 여기서 x는 타이머가 멈추고 유저가 다시 상호작용을 시도할 때까지 경과한 시간
  • 수리 완료하면 아군 활성화되고 아군 영입할 수 있도록

profile
자라나는 감자

0개의 댓글