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() 메서드를 통해 라디안을 구할 수 있다.