고도 엔진에서 DampedSpringJoint2D 를 코드상에서 생성하고 스프링 처리 방법 - Whitmem
고도 엔진에서 DampedSpringJoint2D 를 코드상에서 생성하고 스프링 처리 방법
Game Development
2025-02-02 01:08 게시 62bef77d3a1417e13848

0
0
54
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
코드 상에서 임의로 DampedSpringJoint2D 를 생성하는 방법
이 게시글에서는 코드 상에서 임의로 DampedSpringJoint2D 를 생성하는 방법에 대해서 설명한다. 사용자가 마우스를 클릭하면 해당 마우스 클릭한 지점에 스프링이 생겨 잡아 당기는 효과를 낸다든지 등의 처리가 가능하다. 흔히 게임에서 볼 수 있는 갈고리 구현에 용이하다. 3D FPS 게임을 보면 갈고리 잡아진 지점으로 쑥 날아가거나 특정 지점에 와이어를 생성해 당기는 처리를 할 수 있는 것이다.
1. DampedSpringJoint2D을 다음과 같이 코드에서 생성한다.[sapcebox]
dampedSpringJoint2D = new DampedSpringJoint2D();
물론 위 DampedSpringJoint2D 가 담기는 메모리 변수는 전역으로 정의하거나 지역으로 정의할 수 있다. 하지만 여기서는 키를 놓는 경우 스프링을 제거하기 위해서 전역으로 지정하였다.
2. 연결한 노드를 지정한다.
dampedSpringJoint2D.NodeA = destBody; dampedSpringJoint2D.NodeB = srcBody;
NodeA는 위 지점, NodeB는 아래 지점이라고 보면 쉽다. 잡아 당길 때 B에서 A로 가는 것이다. A가 하늘에 고정되어 있다고 보면 된다. 다만 각 노드는 NodePath 정보를 넣어야 한다. String 으로 기입해서 넣으면 된다. 해당 노드의 절대 경로나 상대 경로로 넣어주면 된다.
3. 길이를 지정한다.
최대 길이를 지정한다. 스프링의 최대 길이는 두 객체 거리로 하면 된다. 이후에 잡아 당길 것이므로 추후에 RestLength를 조절하는 것이다.
dampedSpringJoint2D.Length = this.GlobalPosition.DistanceTo(worldEnd);
A 객체와 B 객체의 사이 거리를 구한다. 여기서 나는 this.GlobalPosition 으로 한 이유는, 플레이어의 객체에서 스크립트를 생성했기 때문에 플레이어와 대상 객체간의 거리를 구하기 위함이다. 즉 플레이어 위치에서 대상 객체에 와이어를 생성하는 것이 주요 목표이다.
dampedSpringJoint2D.RestLength = 1;
위 코드를 통해 길이가 매우 짧아지게끔 의도할 수 있다. RestLength 를 0으로 지정하면 무제한이기 때문에 1로 지정하였다. 즉 최대 길이는 일반 length 이지만 이 스프링은 RestLength 인 1 로 줄어들려고 할 것이다.
4. 이외 각종 설정을 지정한다.
dampedSpringJoint2D.Stiffness = 64.0f; dampedSpringJoint2D.Damping = 1.0f; dampedSpringJoint2D.DisableCollision=false;
잡아 당기는 강도, 원래 크기로 돌아가려는 강도, 객체 충돌 활성화 등을 수행한다.
DisableCollision 는 기본 값이 true로 되어 있는데, NodeA , NodeB의 자체 콜리전 충돌을 처리하는 것이다. 거리가 매우 좁아졌을 때 두 객체간 충돌 처리를 활성화하기 위함이다.
5. GlobalPosition을 지정한다
body2D 는 여기서 NodeA 를 의미한다. 즉 DampedSpringJoint2D는 위에서 아래로 장착하는 느낌이기 때문에, 위 하늘에 존재하는 대상 객체의 포지션으로 지정한다.
dampedSpringJoint2D.GlobalPosition = ((Node2D)GetParent()).ToLocal(body2D.GlobalPosition);
근데 여기서 나는 getParent 를 통해 ToLocal() 로컬 좌표계로 변환하는 작업을 거쳤는데, 루트 노드가 일반 월드 좌표에서 어긋난 공간에 있었기 때문에 루트 노드에서 정상적으로 월드 좌표에 생성되게끔 하기 위해 부모 노드의 로컬 좌표로 다시 바꾼 것이다. DampedSpringJoint2D 를 부모 노드의 하위에 등록할 것이기 때문에 부모 노드의 로컬 좌표계로 변경하는 것이다. 부모 노드가 정상적으로 0,0 위치에 있다면 굳이 필요는 없다. 하지만 그럴 일이 거의 없기 때문에 이러한 작업을 하는 것이다.
6. 부모 노드에 추가
GetParent().AddChild(dampedSpringJoint2D);
한편 Rotation 도 변경해야하나 싶었지만, 변경하지 않아도 정상 동작하는 것을 확인할 수 있었다. Rotation을 변경하고자 하는 경우 목적지 - 출발지 벡터를 구한 뒤(즉 방향 벡털르 구한 뒤에) normalize하여 Angle() 메서드를 통해 라디안을 구할 수 있다.
와이어가 생겨서 잡아 마우스를 놓을 때 까지 잡아당겨지는 것을 볼 수 있다.
참고 사항
StaticBody, CharacterBody2D, KinematicBody2D 같은 경우는 DampedSpringJoint2D를 적용할 수 없는 듯 싶다. 따라서 캐릭터를 Rigidbody로 정의하거나, 가상 Rigidbody를 정의하여 캐릭터 바디가 가상 Rigidbody 를 따라가도록 정의하는 등 추가 작업이 필요하다. 이 때 가상 Rigidbody와 캐릭터 바디는 충돌 처리를 하면 안되므로 레이어를 나누어 처리할 수 있다.
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.