프로그래밍 공부
작성일
2024. 1. 18. 14:25
작성자
WDmil
728x90

언리얼 충돌처리를 더 깊게 알아보자.

 

전에 만들었던 것은 충돌했을 시, String이 출력되게 만들었다.

 

이번에는 충돌 시 Light가 켜지고, 충돌상태가 아닐 시 Light가 꺼지게 할 것 이다.


객체 생성

위와같이 ToggleLIght를 생성하고, 객체를 정의해보자.

 

객체는 위와같이 PointLight와  String을 가지고, BoxCollider로 동작할 것 이다.


이밴트 그래프

 

이밴트 그래프는, 전과 유사하게, 생성된 PointLight를 타깃으로 지정하고, 처음에 꺼준뒤, Color값을 정의 해준다.

 

그리고, OnComponent Begin Overlap을 통해, 임의의 Overlap객체가 내부에 들어왔을 때, 충돌된 객체의 이름을 출력하게 하였다.

그리고, ActorBeginOverlap 이벤트 와 End 이벤트를 통해, 충돌시작시, 라이트를 켜주고 충돌 종료시 라이트를 꺼주게 해준다.

 


Ray 충돌

 

이제까지 한 충돌은 Box To CapsuleCollider의 예시였다.

이번에는 Ray To Collider 처리를 정의 해보자.

 

우선, 충돌을 하기 위해서는 선분 의 시작점과 종료점, 그리고 선분을 그리는 객체 3개가 필요하다.

 

선분의 시작점과 종료점은 임의의 블루프린트를 생성해서 Point를 정의해주고, Sphere를 내부에 배치해주어 시작점, 종료점을 표시해준다.


시작점, 종료점 정의, 배치

아주 단순하다. 구체 한개가 정의되어있는 Class

 

뷰포트에 배치해보자.

위와같이 두개의 객체를 배치할 수 있음을 확인할 수 있다. 중앙구체는 Line을 그려주는 객체이다. 밑에서 서술한다.


DrowLiner

 

선을 긋는 객체는 엑터가 존재하지 않아도 됨으로(어차피 선을 그리는 용도로만 사용한다)

뷰포트에는 텍스트만 써놓고, 이벤트 그래프를 정의한다.

위와같은 블루프린트 이벤트 그래프를 정의한다.

 

위에서 정의된 For EachLoop는, 배열을 전방위순환 해주는 블루프린트 이고, 그 앞의 Get All Actors Of Class는, 정의된 ActorClass에 전부 접근해서 Actors배열로 반환하는 블루프린트 이다.

래벨에 정의되어있는 지정된 Class에 전부 접근한다.

 

반환된 배열객체를 순환하면서, 이름을 Display에 출력하게 된다.

출력이 잘 됨을 확인할 수 있다.

이제 선을 그을 객체의 배열을 참조하였음 으로, 그 위치좌표를 활용하여 선분을 그어보자.

이밴트 그래프는 위와같이 정의한다.

Lines배열을 생성하여 해당 객체를 참조하는것 을 볼 수 있다.

 

Lines에 접속하여, 우리가 정의한 선분의 시작점과 종료점은 각각 0번째와 1번째를 의미함 으로, 0번과 1번을 시작점, 종료점으로 하고, Line TraceForObjects에서 검사할 충돌객체는 Pawn로 지정해준다.

그렇게 하면, 충돌정의 리스트 중, Pawn에 해당하는 객체만 충돌되었음을 반환한다.

 

Actors to Ignore는, 충돌검사에서 제외할 객체를 지정한다.

어차피 Pawn이라 충돌되지 않지만, 혹시모르기 때문에 지정해준다.

시작점과 종료점이 충돌범위에 포함되면 무조건 충돌로 검출되기 때문이다.

 

밑의 Trace Color는 기본 색상이다.

Trace Hit Color는 충돌시 변경될 색상을 의미한다.

 

테스트 해보자.


 


Ray충돌 응용

 

Ray충돌시에 객체의 색을 바꾸어보자.

 

우선, 블렌드 스테이트를 바꾸기 위해서는, 머티리얼을 수정해야한다.

머티리얼을 수정할 때 마다, 다시 렌더링하기에는 자원소스가 많이 들어감 으로, 인스턴싱을 통하여 원본 머티리얼에 덮어쓰기 형식으로 데이터를 수정하는게 옳다.

 

일단, 원본 머티리얼을 생성해보자.

원본 머티리얼 생성

위와같이 데이터를 정의하였으면 다음과 같이 뷰포트에 보일 것 이다.

객체가 상수값 이 아님으로, 인스턴싱에서 데이터를 수정이 가능하다.

 

쉐이더 데이터를 버퍼형태로 올려서 외부에서 수정할 수 있도록 한다고 이해하면 된다.

그리고, 머티리얼 인스턴스를 생성해준다.

위와같이 따로 생성하고 지정해주어도 무방하고,

이렇게, 객체를 오른쪽 클릭하여 생성해주어도 된다.

위와같이 나타나면 된다.

 

인스턴스를 적용하는것 은 매우 쉽다.

그냥 필드의 오브젝트에 드래그해버리면 된다.

 

큐브를 엑터 배치에서 드래그하여 생성하고, 머티리얼을 적용해보자.

위와같이 되면 된다.

 

이제, Ray에서 충돌검사를 하고, 엑터에 충돌여부를 반환한 뒤에, 해당 엑터에서 충돌여부를 판정하고, 판정된 데이터를 통해 색을 변환시켜보자.

 

일단, 충돌 검사를 위해서는 큐브가 이동해야 함으로,

 

큐브가 생성되었을 때, 정면을 판별하고 해당 정면방향으로 큐브를 델타타임마다 일정 거리를 이동시켜보자.

 

대충 정의한 큐브의 움직임처리 이다.

정면을 파악한 다음 Sin형태로 앞으로 갔다가 뒤로 갔다가 하는 함수를 블루프린트로 구현한 것 이다.

 

이제 충돌여부를 반환하자.

현재 객체가 어떠한 객체에 충돌되었을 때 색이 바뀌게 하면 될 것이다.

 

객체가 충돌검사를 진행 할 때, RayCollision은 객체에서 검출할 수 없음으로, Ray를 쏘는 주체에서 확인하고 객체를 변환해야한다.

검출은 위와같이 진행한다.

 

객체의 검출을, Hit으로 확인하고, Line을 구성하는 객체의 데이터를 참고하여 Metarial을 분리한다.

 

분리한 Metaril을 기준으로, 인스턴스 Material을 생성하고, 해당 메테리얼로 교환해주는 작업을 진행한다.

Metarial을 뽑아내고, 뽑아낸 인스턴스 메테리얼의 Color를 랜덤한 값으로 치환해준뒤에 머티리얼을 교환해준다.

물론 타깃은 뽑아낸 Componen로 지정한다.


테스트

 

 

728x90