Short Cake
8PM - Animal Crossing Wild World

사생활 보호 설정

https://gamjia.tistory.com

Mini Rooms

  • 내 미니룸
  • 미니미설정
  • 미니룸설정
  • 답글수 [0]

What Friends Say

한마디로 표현해봐~

1촌평 관리

Unity, Cocos Collider 비교

GamJia 2025. 1. 25. 00:07

 

오늘은 게임 개발에 빼놓을 수 없는
Collider에 대해 알아보겠습니다
비슷한듯 다른 두 게임 엔진을 비교해서 설명드릴게요

 

 

Collider 종류


 

왼쪽은 Unity, 오른쪽은 Cocos Creator인데요

겹치는 Collider도 있고 그렇지 않은 것도 있습니다

표로 설명과 함께 정리하겠습니다

 

Collider 종류 설명 공통 Unity만 Cocos만
Box Collider 상자 모양의 충돌 영역. 사각형이나 직육면체 물체에 사용    
Box Collider 2D 2D 환경에서 사각형 충돌 영역을 처리    
Capsule Collider 알약(캡슐) 모양의 충돌 영역. 주로 캐릭터 충돌에 적합    
Capsule Collider 2D 2D 환경에서 알약 모양의 충돌 영역  
Circle Collider 2D 2D 환경에서 원형 충돌 영역을 처리    
Composite Collider 2D 여러 2D Collider를 합쳐 하나의 충돌 영역처럼 동작하도록 만듦  
Custom Collider 2D 2D 환경에서 사용자가 정의한 맞춤형 충돌 영역  
Edge Collider 2D 선(라인) 모양의 충돌 영역
2D 환경에서 벽이나 바닥처럼 선형적인 충돌 처리에 사용
 
Mesh Collider 복잡한 3D 모델의 정확한 충돌 처리를 위해 사용    
Polygon Collider 2D 2D 환경에서 다각형 충돌 영역, 복잡한 모양에 사용    
Sphere Collider 구 모양의 충돌 영역
공이나 구체와 같은 물체에 적합
   
Terrain Collider 지형(땅)의 충돌을 처리
언덕이나 산처럼 불규칙한 지형에서 사용
   
Tilemap Collider 2D 2D 타일맵에 충돌 영역을 자동으로 생성  
Wheel Collider 차량의 바퀴 물리 효과를 위한 충돌 영역  
Cone Collider 원뿔 모양의 충돌 영역 스포트라이트처럼 점점 좁아지는 영역에 적합  
Cylinder Collider 원기둥 모양의 충돌 영역
기둥이나 통 모양의 물체에 적합
 
Plane Collider 평면 충돌 영역 넓은 땅처럼 평평한 충돌이 필요한 경우 사용  
Simplex Collider 단순 도형(삼각형, 사면체 등)의 충돌 영역
퍼포먼스를 중시한 충돌 처리에 적합
 

 

 


Unity Collider


 

Unity에서는 OnCollisionEnter, OnTriggerEnter 같은

메서드가 MonoBehaviour에서 자동으로 호출됩니다.

충돌 이벤트를 처리하려면 해당 메서드를 오버라이드하기만 하면 됩니다

 

 

Collision Collider (3D)

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    private void OnCollisionEnter(Collision other)
    {
        Debug.Log("두 Collider가 처음 충돌할 때 호출됩니다.")
    }
    
    private void OnCollisionStay(Collision other)
    {
        Debug.Log("두 Collider가 충돌 상태를 유지하고 있는 동안 호출됩니다.")
    }

    private void OnCollisionExit(Collision other)
    {
        Debug.Log("두 Collider가 더 이상 충돌하지 않을 때 호출됩니다.")
    }
   
}

 

 

Collision Collider (2D)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    private void OnCollisionEnter2D(Collision2D other)
    {
        Debug.Log("두 2D Collider가 처음 충돌할 때 호출됩니다.")
    }

    private void OnCollisionStay2D(Collision2D other)
    {
        Debug.Log("두 2D Collider가 충돌 상태를 유지하고 있는 동안 호출됩니다.")
    }

    private void OnCollisionExit2D(Collision2D other)
    {
        Debug.Log("두 2D Collider가 더 이상 충돌하지 않을 때 호출됩니다.")
    }
    
}

 

 

Trigger Collider (3D)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("Object가 Trigger에 처음 들어갔을 때 호출됩니다.")
    }

    private void OnTriggerStay(Collider other)
    {
        Debug.Log("Object가 Trigger 내부에 머무는 동안 계속 호출됩니다.")
    }

    private void OnTriggerExit(Collider other)
    {
        Debug.Log("Object가 Trigger에서 나갈 때 호출됩니다.")
    }

}

 

 

Trigger Collider (2D)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    private void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("2D Object가 Trigger에 처음 들어갔을 때 호출됩니다.")
    }

    private void OnTriggerStay2D(Collider2D other)
    {
        Debug.Log("2D Object가 Trigger 내부에 머무는 동안 계속 호출됩니다.")
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        Debug.Log("2D Object가 Trigger에서 나갈 때 호출됩니다.")
    }
    
}

 

 

 

 


Cocos Creator Collider


 

Cocos에서는 Collider에 이벤트를 직접 연결해야 합니다.

예를 들어, 충돌 처리 로직은 스크립트에서

ContactListener를 통해 설정해야 합니다.

 

 

Collision Collider (3D)

import { _decorator, Component, Collider, ICollisionEvent } from 'cc';
const { ccclass } = _decorator;

@ccclass('Test')
export class Test extends Component {
    private collider: Collider | null = null;

    start() {
        this.collider = this.getComponent(Collider);

        if (this.collider) {
            // 3D 충돌 이벤트 등록
            this.collider.on('onCollisionEnter', this.OnCollisionEnter, this);
            this.collider.on('onCollisionStay', this.OnCollisionStay, this);
            this.collider.on('onCollisionExit', this.OnCollisionExit, this);
        }
    }

    private OnCollisionEnter(event: ICollisionEvent) {
        console.log("두 Collider가 처음 충돌할 때 호출됩니다.")
    }

    private OnCollisionStay(event: ICollisionEvent) {
        console.log("두 Collider가 충돌 상태를 유지하고 있는 동안 호출됩니다.")
    }

    private OnCollisionExit(event: ICollisionEvent) {
        console.log("두 Collider가 더 이상 충돌하지 않을 때 호출됩니다.")
    }
}

 

 

 

Collision Collider (2D)

import { _decorator, Component, Collider2D, ICollision2DEvent } from 'cc';
const { ccclass } = _decorator;

@ccclass('Test')
export class Test extends Component {
    private collider: Collider2D | null = null;

    start() {
        this.collider = this.getComponent(Collider2D);

        if (this.collider) {
            // 2D 충돌 이벤트 등록
            this.collider.on('onCollisionEnter', this.OnCollisionEnter2D, this);
            this.collider.on('onCollisionStay', this.OnCollisionStay2D, this);
            this.collider.on('onCollisionExit', this.OnCollisionExit2D, this);
        }
    }

    private OnCollisionEnter2D(event: ICollision2DEvent) {
        console.log("두 2D Collider가 처음 충돌할 때 호출됩니다.");
    }

    private OnCollisionStay2D(event: ICollision2DEvent) {
        console.log("두 2D Collider가 충돌 상태를 유지하고 있는 동안 호출됩니다.");
    }

    private OnCollisionExit2D(event: ICollision2DEvent) {
        console.log("두 2D Collider가 더 이상 충돌하지 않을 때 호출됩니다.");
    }

}

 

 

 

 

Trigger Collider (3D)

import { _decorator, Component, Collider, ITriggerEvent } from 'cc';
const { ccclass } = _decorator;

@ccclass('Test')
export class Test extends Component {
    private collider: Collider | null = null;

    start() {
        this.collider = this.getComponent(Collider);

        if (this.collider) {
            // 3D 트리거 이벤트 등록
            this.collider.on('onTriggerEnter', this.OnTriggerEnter, this);
            this.collider.on('onTriggerStay', this.OnTriggerStay, this);
            this.collider.on('onTriggerExit', this.OnTriggerExit, this);
        }
    }

    private OnTriggerEnter(event: ITriggerEvent) {
        console.log("Object가 Trigger에 처음 들어갔을 때 호출됩니다.");
    }

    private OnTriggerStay(event: ITriggerEvent) {
        console.log("Object가 Trigger 내부에 머무는 동안 계속 호출됩니다.");
    }

    private OnTriggerExit(event: ITriggerEvent) {
        console.log("Object가 Trigger에서 나갈 때 호출됩니다.");
    }
}

 

 

 

Trigger Collider (2D)

import { _decorator, Component, Collider2D, ITrigger2DEvent } from 'cc';
const { ccclass } = _decorator;

@ccclass('Test')
export class Test extends Component {
    private collider: Collider2D | null = null;

    start() {
        this.collider = this.getComponent(Collider2D);

        if (this.collider) {
            // 2D 트리거 이벤트 등록
            this.collider.on('onTriggerEnter', this.OnTriggerEnter2D, this);
            this.collider.on('onTriggerStay', this.OnTriggerStay2D, this);
            this.collider.on('onTriggerExit', this.OnTriggerExit2D, this);
        }
    }

    private OnTriggerEnter2D(event: ITrigger2DEvent) {
        console.log("2D Object가 Trigger에 처음 들어갔을 때 호출됩니다.");
    }

    private OnTriggerStay2D(event: ITrigger2DEvent) {
        console.log("2D Object가 Trigger 내부에 머무는 동안 계속 호출됩니다.");
    }

    private OnTriggerExit2D(event: ITrigger2DEvent) {
        console.log("2D Object가 Trigger에서 나갈 때 호출됩니다.");
    }
    
}

'Game Develop' 카테고리의 다른 글

Unity, Cocos Animation Controller 비교  (0) 2025.01.17
Unity 6 Demo Showcase  (0) 2025.01.10
Unity 6 Challenge  (0) 2025.01.05
Unity 6 Challenge - 8  (0) 2024.12.30
Unity 6 Challenge - 7  (0) 2024.12.29