Adventure of 빠타박스
article thumbnail
728x90
728x90
SMALL

Unreal Engine 4 /4.26버전으로 수업을 진행합니다. 해당 내용은 수업에 대한 내용과 함께 

개인적인 생각 및 정보를 토대로 글을 씀을 알립니다. 

본 내용에 대하여 상업적으로 이용 및 배포를 금합니다.

이전내용)  https://ppatabox.tistory.com/75

 

각주참고[각주:1]

 

Try Get Pawn Owner가 아무것도 아니면 NULL이 리턴 될 것이고 

그러면 Is Not Valid로 나간다. 

 

NULL이 아니면 Is Valid로 나간다. 

 

변수추가 Player

변수 유형(우리자료형이니까) BP_Player 

 

 

Get Player 

Get Player에 우클릭 -> 검증된 Get으로 변환 

 

 

만약에 이 Player변수에 어떤 값이 들어가 있었다면 

유효한지

 

Player가 아무값도 안가지고 있는 상태라면 유효하지 않은지 로 넘어간다. 

 

그러면 최초 한번은 유효하지 않다면 

(게임 처음 실행시 NULL이니까 ) 

 

 

Try Get Pawn Owner 입력핀을 가져다가 이게 우리가 만들 자료형으로 만들어진 객체인지

그럼 형변환을 하는데 

 

 

Cast 쳐보면 형변환 할 수 있는 것들이 나온다. 

우리는 BP_Player를 형변환 할 것이다. 

 

Try Get Pawn Owner 가 들어왔을때 BP_Player인지 

 

이게 게임모드인지 체크하는 것도 동일하다 

이것은 BP_Player라고 안만들어진 애인데 

실행 했을 때만 BP_Player라고 만들어준 애이다. 

그래서 이런식으로 체크 한다. 

 

 

 

 

이제 한번 셋팅해 주기 위해 

 

Set Player에 형변환을 넣어 줄 것이다. 

 그럼 딱 한번만 실행 될 것이다. 

 

처음에 BP_Player에 형변환이 들어와서 Player가 Set됬으니까. 

이다음 프레임에서 Get이 call이 될때는 유효한지로 갈 것이다. 

 

이제

유효하다면 Player입력핀 

 

Get Velocity[각주:2]: 속도를 가져온다(속도 구하기)

 

방향의 길이는 속도 그래서 Get Velocity의 크기를 구할 것이다. 

우리는 평면상에서 이동할 것이고 (날라다니는 것이 아님) 

= Vector Length XY 

 

 

Vector Length : 3D까지 계산 

Vector Length XY : 2D

 

※이것도 방향벡터라고 해서 Nomerlize하면 안된다. 그럼 크기가 1 이니까 속도를 못구한다.

 

 

 


참고)

참고 (치다보면 나오는 Squared

피타고라스 정리 할때 C^2을 제외하고 그냥 루트를 씌우면

 

√A^2 + B^2

 

인데 그런데 루트 연산이 엄청 복잡하다 그래서 연산량이 많아진다. 

그래서 루트를 빼버린다. 

 

그러면 C^2이랑 비교하면 되는데 

즉, 거리에 제곱하고 비교하면 된다. 

그럴려고 있는게 Squared이다. 

 

그렇게 루트 제거해버리면 

길이는 제곱해서 비교하면 되게 된다. 

제곱은 연산량이 훨씬 적기 때문에 


이렇게 나온 속도를 유효한지 일때 

스피드에다 셋팅해보자 

 

Set Speed (변수) 

 

컴파일 하고 저장해보자 

 

그러면 메인창에서 플레이 해보면 살짝 걷다가 뛰는 걸 볼 수 있다. 

걷다가 빨라지는 느낌 (미세한차이) 

 


400일때는 걸어야 한다. 

세팅 -> 프로젝트 셋팅 -> 입력 

 

내가 누르고 있을때는 걸을 것이다. 

안누르면 뛸 것이다. 

 

말그대로 누르고 있느냐는 액션매핑으로 판단을 하게 한다. 

 

액션 매핑에 추가 

Run -> 키보드 -> 왼쪽 Shift

 

액션매핑에서 또 플러스 하고 오른쪽 Shift하면 

둘 중 어느것을 눌러도 달리기 명령이 들어갈 수 있다. (그렇게 따로 처리해야함) 

 

 

 

옆에 이것들은 추가적으로 눌릴 것 들 이다. 

 

다시 BP_Player로 가자 

 

우클릭 후에 확인해보면 우리가 만들어둔 액션이벤트가 있을 것이다. 

 

 

Pressed는 눌러졌느냐

Released는 떼었느냐 

 

아까 속도는 Character Movement영역에 있었다. 

 

여기에서 

나타난 이 모든 것들이 변수이다. 

 

Character Movement component를 끌어오자 

 

그럼 

여기 있던 컴포넌트를 끌어오면 저렇게 변수화 되는 것을 볼 수 있다. (Get처럼)

 

그러고 나서 Character Movement안에 있던 변수 중에 Max Walk Speed를  입력핀을 통해서 불러오자 

 

Pressed 눌렸을 때로 실행핀 설정 

그리고 400으로 값 조정 

 

Set Max Walk speed 복사 붙여넣기 

 

Character Movement 입력 핀 타깃에 입력 

값은 600으로 조정

 

 

그렇게 컴파일 하고 메인창으로 와서 플레이 해보자 

실행해보면 

 

그냥 W키 누르면 달리기를 하고 

Shift를 누르고 있는 상태면 걷기모드를 한다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

다음시간)

 

 

 

 

 

 

 


각주)

  1. [/footnote]

     

     

     

     


     

    이제 애니메이션이 필요할 거 같다. 

    동작이 좀 있어야 하겠지?

    Unarmed.zip
    0.62MB

     

     

    해당 파일 다운로드 

    콘텐츠 브라우저 -> 콘텐츠 -> 우클릭 -> 탐색기에서 표시 -> 새폴더생성 Animations

     

    해당 압축파일을 Animations폴더에 넣고 Unarmed에 풀기 

     

     

    현재 Animation폴더를 Character에 이동시키자( 애초에 그냥 character폴더 안에서 만들어도 됬다)

     

     

    그럼 이렇게 뜬다. 

    Unarmed_Idle 클릭해보자 

     

     

    이것은 정지 동작이다. 

    다른 것들을 보면 

    점프하려는 동작 

    뭐 달리는 동작 등이 있다. 

     

    일단 모두저장 해주고 

     

    애니메이션은 애니메이션 블루프린트로 작성해줘야한다. 

    03_Player로 가서 오른쪽 버튼-> 애니메이션 -> 애니메이션 블루프린트 

     

    선택하고 보면 

     

     

    이러한 창이 뜬다. 

    일단은 부모클래스는 

    Animinstance로 지정을 해줘야한다. 

    이게 기본 블루프린트 클래스 이다.

     이것으로 부터 상속

     

    그다음 아래에서 Skel_Mannequin 

    이게 뼈대구조 파일명이 skel mannequin 선택

    확인해주고 생성하자 

    이름은 ABP_Player 

    Animation Blue Print의 약자이다. 

     

    클릭해서 들어가보면 

     

    이렇게 보이는게 나오는데 

    여기 들어가는 동작이 화면의 게임상에 나타난다. 

    일단 우측에 에셋 브라우저를 들어가서 

     

     

    Unarmed_Idle을 끌어다가 올려보자 

     

     

    연결해주고 컴파일 해보자 

     

    그럼 좌측 미리보기에 동작이 바로 나올 것이다. 

     

    그러고 나서 BP_Player로 가자 

     

     

     

     

     

    여기서 Mesh

     

    우측 창에 Anim Class라고 있다. 

    이 mesh가 사용할 Anim Class가 뭐냐 ? 라는 것인데

    만든 ABP_Player 를 지정해주자 

     

    그러고나면 

     

    뷰포트에 바로 지정된 것을 볼 수 있다. 

     

    이상태로 메인화면에서 플레이해도 똑같이 뜨는 걸 볼 수 있다. 

     

     


    이제 여기서 속도에 따라 동작을 바꿀 것이다. 

     

    BP_Player에 들어가보자 

     

    좌측에 컴포넌트 창에서 

    Character Movement 이 있는데 

    이게 여기서 모든 움직임 데이터를  관할 해주는 역할을 한다. 

     

    컴포넌트도 클래스 타입이기 때문에 이안에 멤버 함수가 존재한다. 

     

    우측에서 보면 

     

    Max Walk Speed라고 있다. 

    이게 이동속도 이다.  지금 600으로 되어있는데

    이것이 이동하기 시작하면 600으로 이동할 것이라는 말이다. 

     

    Max Walk Speed Crouched : 엎드린 상태 이동속도 

     

    Min Analog Walk Speed : 게임패드 같은 경우는 살짝 느리게 반응하는데 (아날로그 스틱값을 조정할때) 

     

    Max Step Height : 걷는 것으로 올라갈 수 있는 최대 높이가 45라는 것 (현재 위치한 지점에서 45) 

    (게임하다가 산같은데 올라 갈 때 못올라가는 경우는 다 이걸로 제한 시킬 수 있다) 

     

    Walkable Floor Angle : 올라갈 수 있는 경사 각 

     

     

    이것의 속도가 0일때 그냥 Idle이 나 올 것이다. 

    400일때 걷고 

    600일때 달릴 것이다. 

     

    애니메이션을 원하는 값에 따라 플레이 할 수 있게 해주는 것이 

     

    Character -> 우클릭 -> 새폴더 BlendSpaces 생성 -> 우클릭 블렌드 스페이스 1D 생성 

     

    블렌드란 말이 섞는다는 의미가 있는데 

    블렌드 스페이스는 : 어떤 값에의해서 동작을 섞어준다는 의미

     

     

    블렌드 스페이스 1D 생성 

    아까 봤던 것이 있는데 클릭해주자

     

     

    생성 후에 BS_Unarmed(무기를 쥐고 있지 않은 상태) 

     

    들어가보면 

     

    이런식으로 팔을 벌리고 있다. 

     

    좌측에 Axis Setting으로 가보자

    가로축을 펼쳐주고 

     

    Name이 이곳에 입력될 변수명 

     

    최소속도(Minimum Axis Value) 를 0으로 줄 것이고 

     

    최대속도(Maximum Axis Value)를 600을 줄 것이다. 

     

    칸 수(Number of Grid Divisions)를 3칸으로 줄것 

     

     

    이제 밑에서 잘보면 

     

     

     

    0 에서 600 까지 주었다고 표시가 된다. 

    그다음 칸에 선에다가 애니메이션을 놓는다. 

     

    0에다 두면 0일때 

    2번째 선에 올려놓으면 200일때 플레이 

    3번째 선은 400일때 

    4번째 선은 600일때 플레이 

     

    칸수 만큼 나눠진 것이다. 

     

    에셋 브라우저에서 끌어오면서 두면 자동으로 붙는다. 

    그러면 모션에서 기본동작 Idle이 나오는 것을 볼 수 있다. 

     

    0 = Idel 

    400 = walk 

     

     

    하단에 플레이버튼을 누르고 움직여보면 

     

     

    값이 점점 늘어남에 따라 걷는 모션으로 바뀌는 걸 볼 수 있다. 

    실제게임에서 서서히 값이 바뀌도록 해야 한다. 

     

    바로 뛰는 동작이 나오는게 아니라 

    점점 뛰게끔 해야하는게 현실적 

    이런식으로 처리할때 쓰기 편하다

    (자동으로 내부적으로 계산해주는 것) 

     

    (DX에서는 코드 다 다뤄야함...) 

     

     

    UnArmed Run도 600 지점에 넣어주자.

     

    확인해 보면 뛰는 모션이 나올 것이다. 

     

     

    이것들을 이제 애니메이션 블루프린트에서 사용할 것이다. 

     

    03_Player -> ABP_Player로 들어가자 

     

    unarmed idle을 지우고 

     

     

    만들어둔 BS_Unarmed를 가져오자 

     

     

    일단 이것은 실행전의 값이다. 

     

    우측에 애님 프리뷰 에디터 라고 있다 이것이 프리뷰의 값을 설정할 수 있게 해준다

     

    좌측에서 변수(이것도 멤버변수) 

    변수추가 Speed

    변수유형 플로트 ( 지금 들어갈 값이 딱봐도 Float형이다) 

     

     

    우측에서 유형 바꿔주고 

    끌어오자 

    Get Speed

     

    현재 올라온 BS_Unarmed의 Speed값은 상수라서 못건드리니까. 

    외부의 Get speed변수로 값을 줄려고 하는 것이다. 

     

     

    하고  컴파일 

     

     

     

    그러면 프리뷰 에디터에 speed가 생길 것이다. 

    이것을 400을 넣어보고 600을 넣어보면 미리보기에서 보일 것이다. 

    그냥 임시로 보기위함이다. 

     

    그러니까 이 값들을 어디선가 주어야 하는데

    왼쪽에서 보면 이벤트 그래프 라고 있다. 

    더블클릭해서 들어가보면 

     

    블루프린트 창이 뜨는데 

    이곳에서 캐릭터의 값을 찾아다가 넣어 줄 것이다. 

     


    전에 그런 말을 했다. 

    배치 될 수 있는 모든 것들은 Actor로 부터 상속 받는다고 

     

    Actor -> Pawn  -> character

    순으로 상속 받는 다고 하였는데. 

     

    애니메이션에서 제어할 수 있는 것은 Pawn부터이다. 

    입력만 가능하다면

     

     

     그래서 이게 Try Get Pawn Owner라고 나와있는데

    노력을 한다 Pawn Owner를 가져오기 위해 시도 하는것 

     

    Try Get Pawn Owner가 할당 되어있는 Pawn이 누구인가>?

    BP_Player이다. 

     이곳에 이 애니메이션을 넣었으니까.

     

    Actor -> Pawn  -> character -> BP_Player

     

    BP_Player -> Pawn 이것의 부모형으로 리턴해주겠다는 의미 이다. 

     

    즉 BP_Player의 부모형으로 Pawn으로 리턴해주겠다는 의미

     

    우리가 필요하면 BP_Player의 자료형을 캐스팅 해서 쓰면 되는 것이다. 

     

     

     

     

    이런식으로 부모형으로 많이 리턴해준다. 

     


     

    여기서 Blueprint Upadate Animation은 

    이 애니메이션이 플레이 되는 중에 계속 수행이 된다. 

     

    이것은 게임모드가 아니여도 실행 된다. 

    플레이 안했는데 계속 출력되고 있다. 

    프린트 스트링 해서 컴파일 해주면 

    메인화면에서 계속 실행 되는 것을 볼 수 있다. 

     

    이것이 왜 이러냐면 

    ABP_player에 있는 것이 애니메이션 이기 때문이다. 

    그래서 게임모드 일때는 TryGetPawnOwner가 리턴이 되는데 

    게임모드가 아닐때는 애니메이션이 리턴이 될 수 있다. 

     

    그래서 우리는 

    게임모드 일때는 우리가 만든 BP_Player형일 것이다. 

     

     

     

     

    ?Is Valid[footnote]?Is Valid : NULL인가 아닌가 를 체크하는 것 [본문으로]

  2. Get Velocity : 속도를 가져온다(속도 구하기)(플레이어가 이동하고 있는 방향) [본문으로]
728x90
728x90
LIST
profile

Adventure of 빠타박스

@PPATABOX

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!