Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Total
관리 메뉴

만재송

[Cocos Creator] Physics Manager 정복하기(4) - Collider 본문

프로그래밍/COCOS Creator

[Cocos Creator] Physics Manager 정복하기(4) - Collider

만재송 2018. 7. 26. 11:32

Physics Collider


rigidBody 가 물리공간에서 움직임을 담당한다면 Physics Collider 는 물체간의 충돌을 담당하고 있습니다. rigidBody도 중요하지만 Collider 역시 중요한 일을 하고 있습니다. 예들 들면 괴물이 주인공을 공격했을 때 데미지를 입게한다던가, 공이 땅에 부딪쳤을 때 소리를 내게 하는 일은 모두 Collider 가 담당하는 일입니다. 이번 챕터에서는 Collider 의 주요 프로퍼티와 콜백 메서드에 대해서 알아보겠습니다.



기능들


기존 프로젝트에 Orange 스크립트에 이어서 추가하겠습니다. Physics Collider Component 에 접근하기 위해 getComponent 를 호출합니다.


this.collider = this.node.getComponent(cc.PhysicsCircleCollider);



sensor


this.collider.sensor = true;


sensor 는 충돌에 의한 콜백만 일어날 뿐 충돌 동작은 발생하지 않게하는 기능입니다. 값을 true로 하면 물체가 충돌했을 때 부딪치는 현상없이 뚧고 지나가게 됩니다.




density


this.collider.density = 1;


질랑 계산에 사용되는 밀도입니다.


friction


this.collider.friction = 0.5;


충돌시에 마찰계수입니다. 충돌이 마찰의 영향을 받을지에 대한 여부입니다. 단위는 소수점입니다.


restitution


this.collider.restitution = 0.2;


탄력계수입니다. 충돌이 탄력의 영향을 받을지에 대한 여부입니다. 단위는 소수점입니다.


Contact Callback


Contact Callback 은 두 물체가 충돌할때 정의된 콜백함수를 실행합니다. 총 4단계의 콜백함수로 이루어져 있고 이를 통해서 충돌을 했을 때 어떤 일을 수행할 작업을 결정할 수 있습니다.


여기서 주의해야 할 것은, rigidBody 에서 Enabled Contact Listener 가 true 여야 콜백함수가 실행됩니다. 


onBeginContact: function (contact, selfCollider, otherCollider) {
console.log("충돌했다");
},

onEndContact: function (contact, selfCollider, otherCollider) {
console.log("충돌끝");
},


onPreSolve: function (contact, selfCollider, otherCollider) {
console.log("충돌중1");
},


onPostSolve: function (contact, selfCollider, otherCollider) {
console.log("충돌중2");
}


onBeginContact: 두 물체가 처음 충돌했을 때 실행되는 콜백함수입니다.

onEndContact: 두 물체가 충돌이 끝날때 실행되는 콜백함수입니다.

onPreSolve: 두 물체가 충돌중일때 매 timestep 마다 실행되는 콜백함수입니다.

onPostSolve: 두 물체가 충돌중일때 매 timestep 마다 onPreSolve 다음으로 실행되는 콜백함수입니다.

여기서 onPreSolve와 onPostSolve는 sensor 가 true 일때는 실행되지 않습니다. 


콜백함수가 잘 작동되는지 4개의 콜백에 로그를 출력하게 하고 실행해보겠습니다.


또한 모든 콜백함수는 3개의 파라미터를 가집니다.

contact: 두 물체간의 정보를 담은 객체

selfCollider: 충돌한 물체의 collider component

otherCollider: 충돌당한 물체의 collider component


여기서 selfCollider 는 오렌지이고 otherCollider 는 상자입니다. 충돌했을 때 파라미터를 이용하여 두 물체의 정보를 변경하거나 물체를 없앨수도 있습니다. 테스트로 충돌했을 때 상자를 없애는 코드를 작성해보겠습니다.


onBeginContact: function (contact, selfCollider, otherCollider) {
otherCollider.node.destroy();
}


테스트를 실행하면 아래와 같습니다.



cc.Class({
extends: cc.Component,

properties: {

},

onLoad: function () {
// rigidBody 컴포넌트를 가져온다.
this.rigidBody = this.node.getComponent(cc.RigidBody);

// 속도 값을 설정. 초당 이동하는 픽셀 값이다.
this.rigidBody.linearVelocity = cc.v2(-100, 0);

// 속도 댐핑 설정. 시간에 따라 현재 속도가 감소한다. 0 이상의 값을 넣어야하며 소수점 단위이다.
// this.rigidBody.linearDamping = 0.5;

// 각속도 설정. 초당 회전하는 값이다.
// this.rigidBody.angularVelocity = 150;

// // 각속도 댐핑 설정. 시간에 따라 현재 각속도가 감소한다. 0 이상의 값을 넣어야하며 소수점 단위이다.
// this.rigidBody.angularDamping = 0.5;

// 해당 리스너가 true 여야만 충돌이 발생할 때 콜백을 전송한다.
this.rigidBody.enabledContactListener = true;

// rigidBody 타입
/**
* cc.RigidBodyType.Static: 중력이나 힘의 영향을 받지 않지만 위치는 변경할 수 있는 정적 바디
* cc.RigidBodyType.Dynamic: 질량, 중력, 속도 모두 영향을 받는 바디
* cc.RigidBodyType.Kinematic: 중력의 영향만 받지 않는 바디
* cc.RigidBodyType.Animated: Kinematic과 유사하지만 주로 애니메이션과 결합하여 사용하는 바디
*/
this.rigidBody.type = cc.RigidBodyType.Dynamic;

// physics collider 컴포넌트를 가져온다.
this.collider = this.node.getComponent(cc.PhysicsCircleCollider);

// 충돌에 의한 콜백만 일어날 뿐 충돌 동작은 발생하지 않는다.
// this.collider.sensor = true;

// 질량 계산에 사용되는 밀도
this.collider.density = 1;

// 충돌시에 마찰계수. 충돌이 마찰의 영향을 받을지 여부이다. 소수점 단위이다.
this.collider.friction = 0.5;

// 탄력계수. 충돌이 탄성의 영향을 받을지 여부이다. 소수점 단위이다.
this.collider.restitution = 0.5;
},

start: function () {
// 바디의 질량. 밀도와 사이즈크기에 맞춰서 자동으로 설정된다.
var mass = this.rigidBody.getMass();
// console.log(mass);

// 현재 노드의 절대좌표를 가져온다.
var worldPos = this.rigidBody.getWorldPosition();
// console.log(worldPos);
},

// 두 물체가 처음 충돌했을 때 실행되는 콜백함수
onBeginContact: function (contact, selfCollider, otherCollider) {
// contact : 두 물체간의 정보를 담은 객체
console.log(contact);
// selfCollider : 충돌한 물체의 collider component
console.log(selfCollider);
// otherCollider : 충돌당한 물체의 collider component
console.log(otherCollider);
console.log("충돌했다");
otherCollider.node.destroy();
},

// 두 물체가 충돌이 끝날때 실행되는 콜백함수
onEndContact: function (contact, selfCollider, otherCollider) {
console.log("충돌끝");
},

// 두 물체가 충돌중일때 매 timestep 마다 실행되는 콜백함수
onPreSolve: function (contact, selfCollider, otherCollider) {
console.log("충돌중1");
},

// 두 물체가 충돌중일때 매 timestep 마다 onPreSolve 다음으로 실행되는 콜백함수
onPostSolve: function (contact, selfCollider, otherCollider) {
console.log("충돌중2");
}
});


Comments