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");
}
});