본문 바로가기

블루프린팅/5. 오브젝트 인터렉션

[05오브젝트 인터렉션] 이동추가

총알에 맞으면 빨갛게 변하게 하였습니다. 이제부터 앞뒤로 움직이는 동작을 추가하겠습니다.

로직적으로는 tick이벤트를 이용 speed*delta second만큼 액터를 움직이게 할거고 timer를 이용 5초마다 방향 반전을 하게 할겁니다.

액터의 모빌리티와 콜라전 세팅 변경

타깃을 이동시키려면 먼저 모빌리티 세팅을 무버블로 변경해야 한다. 이를 통해 게임을 하는 동안 액터를 조작할 수 있다. 

1. BP_CylinderTarget을 다시 연다. 컴포넌트 패널에스 스태틱 메시 컴포넌트를 선택한다. 디테일 패널에서 트랜스폼 속성아래있는 모빌리티 토글을 스태틱에서 무버블로 전환한다.

\

총으로 이 물체를 겨냥하고 싶기 때문에 총알이 관통하지 않고 목표물과 충돌할 수 있도록 해야한다.

2. 디테일 패널에서 콜리전이라는 카테고리를 찾아 드롭다운 메뉴에서 콜리전 프리셋을 찾는다.  목적에 맞도록드롭다운 메뉴가 BlockAllDynamic인지 확인한다. 

Custom옵션을 선택하면 오브젝트이 콜리전 인터렉션을 서로 다른 오브젝트 타입으로 개별 세팅할 수도 있다.

 

목표나누기

실린더를 이동시키려면 4개의 데이터가 필요하다.

* 위치, 방향, 속도, 시기

월드 안의 실린더의 좌표를 반환하는 함수를 사용해 현재 위치를 얻는다. 속도, 방향, 방향전환까지의 시간은 계산을 해야한다.

1. 내 블루프린트 패널에서  Speed라는 변수를 생성한다. 이 변수는 BP_CylinderTarger의 이동 속도를 나타내는 숫자가 포함된다. 디테일 패널에서 변수타입을 플로트로 변경하고 인스턴스 편집기능 속성을 체크한다.

2. 기본값을 세팅할 수 있도록 블루프린트를 컴파일 한다. 기본값을 200.0으로 세팅한다. 컴파일을 해야 디폴트가 보인다.

3. 내 블루프린트 패널에서 TimeToChange라는 다른 float변수를 생성한다. 인스턴스편집기능 특성을 체크한다. 컴파일하고 기본값을 5.0으로 세팅한다. 실린더는 5초후 방향을 바꿀것이다.

4. 내블루프린트 패널에서 Direction이라는 변수를 생성한다. 디테일패널에서 변수타입을  Vector로 변경하고 인스턴스 편집 특성을 체크한다. 컴파일후 디폴트 Y값을 1로 세팅한다.

계산을 위해 준비된 방향

1. 내 블루프린트 변수에서 Direction을 끌어다 이벤트그래프 그리드 위에 놓는다. 팝업창에서 get Direction을 선택한다. 변수창에서 변수를 끌때마다 이 창이 뜨는데 Get은 변수를 읽은때 Set은 변수를 설정할때 쓰인다. 

2. 출력핀을 끌어서 컨텍스트메뉴에서 Normalize노드를 선택한다.

델타시간을 이용한 상대속도  획득

1.Speed변수를 그리드에 추가한다. Get Speed을 선택한다.

2.그리드 위에 우클릭후 컨텍스트메뉴에서 Get World Delta Second를 추가한다.

3.Speed변수 출력을 끌어다 놓은후 컨텍스트 메뉴에서 *를 입력후 곱하기 노드를 선택후 GetWorldDeltaSeconds도 연결해준다.

코멘트 남기기

블루프린트도 주석을 남길수 있다 원하는 노드들을 마우스로 선택해 우클릭후 Create Comment를 선택하면 박스가 나오고 제목을 남길수 있다.

위치 갱신하기

이제 2개의 결과값을 곱해야 한다. Normalize 출력핀을 끌어다 *를 입력하면 아까랑 좀 다르다. 2번째 입력노드 위를 우클릭후 형변환을 해줘도 되지만 안하고 다음처럼 입력을 연결하면 자동으로 형변환이 됩니다.

이후  다음과 같이 연결한다. 노말라이즈드된 방향벡터에 속도*시간을 곱해주면 단위시간당 이동거리가 나온다

4. 틱 이벤트를 사용해 실린더를 갱신하겠습니다. 빈공간을 우클릭해 tick을 검색해 틱이벤트를 추가합니다.

5. tick이벤트 출력을 끌어 액터를 이동시키기 위해 AddActorWorldOffset노드를 추가후 Delta Location입력에 아까 곱하기 노드 출력을 연결 해 줍니다.

6. 컴파일후 레벨에디터로 돌아가 플레이 해보면 Cylinder가 혼자서 움직인다.

 

자동방향전환

1. 이벤트 그래프 바닥에 우클릭후 custom event를 추가후 이름을 ChangeDirection으로 변경후 변수에서 Direction을 Get으로 추가한다.

2. Direction출력을 끌어 곱하기 노드를 추가하고 2번째 입력을 우클릭후 float로 형변환 해준후 -1을 입력해 곱해준다.

3. 내 변수에서 Direction을 끌어 이번에는 Set으로 해준다. 벡터가 표시되지만 무시하고 이전의 곱하기노드 첫번째 출력과 연결해준다. 자동으로 형변환이 일어난다.

4. ChangeDirection출력을 연결해준다.

5. 타이머를 만들기 위해 빈칸에 우클릭후 컨텍스트메뉴에서 timer event를 입력후 Set Timer by Event를 추가후 Looping파라미터를 체크한다. 반복시간은 숫자로 입력해도 되지만 아까 만든 TimeToChange변수를 Get으로 설정해 연결해준다.

6. ChageDirection 이벤트 출력■을 SetTimerbyEvent■에 연결해준다. 마지막으로 이벤트그래프에 처음부터 있는 EventBeginPlay을 끌어다 연결해준다. 없다면 그리드에 우클릭후 추가해준다.

게임실행

예제의 실린더 좌표는 xyz(100,400,50)이다. 움직이면서 어딘가 부딪치지 않는다면 문제없다.

 

요약

BP_CylinderTarget 블루프린트는 다음 3가지 로직이 들어가 있다.

1. 총알 충돌시 빨간색으로 변하기

2. 스스로 이동하기

3. 5초마다 방향 바꾸기

 솔직히 그냥 C로 짜는게 훨 편한듯 하다. 스크래치도 처음에는 재미있지만 좀 복잡해지면 더 비효율인것 처럼. 이제 처음인데 ㅎㅎ