유니티 충돌 | [Unity 2D Basic] 02. 게임오브젝트 물리와 충돌 상위 147개 답변

당신은 주제를 찾고 있습니까 “유니티 충돌 – [Unity 2D Basic] 02. 게임오브젝트 물리와 충돌“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 고박사의 유니티 노트 이(가) 작성한 기사에는 조회수 17,007회 및 좋아요 175개 개의 좋아요가 있습니다.

유니티 충돌 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [Unity 2D Basic] 02. 게임오브젝트 물리와 충돌 – 유니티 충돌 주제에 대한 세부정보를 참조하세요

유니티 2D 게임 개발을 위한 기초 동영상 입니다.
In this video you will learn how to create 2D game development for beginner.
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
00:00 Intro
00:17 Rigidbody2D 컴포넌트
01:13 Collider2D 컴포넌트
04:33 게임오브젝트 충돌 처리
08:25 OnCollisionㅁㅁ2D() 충돌 이벤트 함수
10:11 OnTriggerㅁㅁ2D() 충돌 이벤트 함수
리소스
https://drive.google.com/file/d/10cXivTidJiT6lanjAIO9urIGahvDfrxj/view?usp=sharing
프로젝트 (Unity 2019.3.1f1)
https://drive.google.com/file/d/1AZrY1djeyWykT1iXsoYRRm25SM_m_Ypu/view?usp=sharing
앞으로 올라올 많은 강좌를 쉽게 보려면?
구독(Subscribe), 좋아요(Like)를 눌러주세요!!
감사합니다.

유니티 충돌 주제에 대한 자세한 내용은 여기를 참조하세요.

유니티 Collider Trigger 오브젝트 충돌 처리 간단한 예제 유니티 …

유니티 Coller Trigger 오브젝트 충돌 처리 간단한 예제 유니티 기초. 최애뎡 2021. 5. 10. 22:42. 반응형. 이번 예제는 간단하게 3D Object인 Plane과 Cube, …

+ 여기에 표시

Source: young-94.tistory.com

Date Published: 7/12/2022

View: 2119

[Unity Function] 충돌 처리 Collision & Trigger 관련 함수/예제

[Unity Function] 충돌 처리 Collision & Trigger 관련 함수/예제. novs 2021. 6. 13. 17:14. 반응형. [목차]. #1 충돌 발생조건. #2 Collision – OnCollisionEnter() …

+ 여기에 표시

Source: novlog.tistory.com

Date Published: 11/29/2022

View: 1110

[Unity3D] Physics – Collider 컴포넌트로 충돌체크하기

이런 오브젝트의 충돌들을 처리하기 위해서는 물리적인 충돌을 처리하는 방법을 알아야 한다. Coller 컴포넌트. 유니티 엔진에서 Coller라는 …

+ 더 읽기

Source: wergia.tistory.com

Date Published: 10/16/2021

View: 4112

[Unity] collision 오브젝트 충돌 감지 방법 – GaGe

rigbody가 없으면 오브젝트끼리 통과하지만 있으면 통과하지 못한다. 2. 유니티에서 간단한 실습해보기. 유니티에서 평면 위에 공을 떨어트려서 충돌 …

+ 여기를 클릭

Source: mumumi.tistory.com

Date Published: 9/16/2021

View: 6076

7. 프리팹, 충돌 처리(OnTrigger, OnCollision) 등 : 유니티 튜토리얼

프리팹, 충돌 처리(OnTrigger, OnCollision) 등 : 유니티 튜토리얼 … 일반적인 콜라이더를 가진 두 게임 오브젝트가 충돌할 때 자동으로 실행된다.

+ 여기에 더 보기

Source: koreanfoodie.me

Date Published: 11/8/2022

View: 2566

[Unity] 물리 처리, 충돌 처리 : Rigidbody 컴포넌트 | Collider …

콜라이더는 충돌 처리를 하기 위해 충돌을 감지하는 컴포넌트이다. 물체의 물리를 적용하거나 다른 물체와 충돌을 감지한다. … 3D Coller이며 2D일 경우 …

+ 더 읽기

Source: euncero.tistory.com

Date Published: 11/9/2021

View: 426

Chapter 4-1. 충돌 : Collider & Collision & Trigger – 평생 공부 …

인프런에 있는 Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 듣고 정리한 필기입니다.

+ 여기에 더 보기

Source: ansohxxn.github.io

Date Published: 9/19/2021

View: 8492

유니티-충돌시 오브젝트 사라지게 하기

유니티-충돌시 오브젝트 사라지게 하기. soo0100 2021. 6. 17. 00:09. 300×250. 게임에서 충돌시 객체를 사라지게 하는 요소는 여러가지가 있을것이다.

+ 여기에 더 보기

Source: soo0100.tistory.com

Date Published: 2/8/2021

View: 901

주제와 관련된 이미지 유니티 충돌

주제와 관련된 더 많은 사진을 참조하십시오 [Unity 2D Basic] 02. 게임오브젝트 물리와 충돌. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[Unity 2D Basic] 02. 게임오브젝트 물리와 충돌
[Unity 2D Basic] 02. 게임오브젝트 물리와 충돌

주제에 대한 기사 평가 유니티 충돌

  • Author: 고박사의 유니티 노트
  • Views: 조회수 17,007회
  • Likes: 좋아요 175개
  • Date Published: 2020. 2. 22.
  • Video Url link: https://www.youtube.com/watch?v=B3okDPOPgc0

유니티 Collider Trigger 오브젝트 충돌 처리 간단한 예제 유니티 기초

반응형

이번 예제는 간단하게 3D Object인 Plane과 Cube, Sphere를 사용하였으며

Sphere에 Ex_07, Ex_04(전 예제 스크립트) 스크립트를 적용하였습니다.

Shpere 오른쪽에 있는 Cube는 기본 Cube이고

왼쪽에 있는 Cube는 기본 Cube의 Box Collider 속성 중 Is Trigger가 체크되어있습니다.

Collider란

하나의 컴포넌트로서 그것이 연결된 게임 오브젝트가 Rigidbody 컴포넌트가 있는

게임 오브젝트가 있다는 전제하에 다른 오브젝트에 반응할 수 있게 합니다.

Collider에는 다양한 형상과 유형이 있으며 씬 뷰에서 녹색 경계선으로 표시됩니다.

복잡한 형상에 대한 Collider가 필요하다면 두 가지 옵션을 사용할 수 있습니다.

첫째는 복잡한 오브젝트의 계층 구조에서 빈 오브젝트를 생성하여

각 부분 부분에 그 부분과 맞는 Collider를 적용하여 결합할 수 있습니다.

둘째는 Mesh Collider를 사용하여 그 오브젝트와 딱 맞게 Collider를 생성 시킬 수 있습니다.

그러나 Mesh Collider를 잘 사용하지 않는 이유는 그 오브젝트와 딱 맞게 만들어지기 때문에 세부 모델의 경우 너무 복잡하게 Collider가 적용되어 성능에 안 좋은 영향을 미칠 수 있기 때문입니다.

Collider는 여러 종류가 있으니 직접 만들어보고 느낌을 보면 더욱 좋을듯합니다.

예로 아래 그림을 보면 조금 더 납득이 가지 않을까 싶습니다.

좌: Capsule Collider, 우: Mesh Collider

이제 두 오브젝트가 충돌할 때에 발생하는 이벤트에 대해 알아보도록 하겠습니다.

오브젝트 간의 충돌이 발생하면 하나의 충돌체가 다른 오브젝트와 충돌하면서

OnCollisionEnter, OnCollisionStay, OnCollisionExit 의 이벤트를 호출하게 됩니다.

OnCollisionEnter – 두 오브젝트가 충돌하는 그 순간 한번 호출

OnCollisionStay – 두 오브젝트가 충돌하는 동안 계속 호출

OnCollisionExit – 두 오브젝트의 충돌이 끝났을 때 호출

마우스, 키보드의 입력을 받을 때와 느낌이 어느 정도 비슷하지 않나요?!..! 그리고!!

충돌 이벤트가 발생하려면 충돌하는 두 오브젝트 중 하나에는 꼭 Rigidbody 컴포넌트가 있어야 합니다.

여기서 Collider의 속성 중 Is Trigger를 체크하게 되면 오브젝트는 더 이상 충돌하지 않고 그냥 통과하게 되는데 이 또한 코드를 통해 감지할 수 있습니다. 이 이벤트는 충돌 이벤트와 비슷하게 적용됩니다.

OnTriggerEnter – Is Trigger가 체크되어있는 오브젝트에 충돌하는 그 순간 한번 호출

OnTriggerStay – Is Trigger가 체크되어있는 오브젝트에 충돌하는 동안 계속 호출

OnTriggerExit – Is Trigger가 체크되어있는 오브젝트에 충돌이 끝났을 때 호출

이 또한 충돌 이벤트와 마찬가지로

이벤트가 발생하려면 충돌하는 두 오브젝트 중 하나에는 꼭 Rigidbody 컴포넌트가 있어야 합니다.

역시 글로만 보니 이해가 잘 되지 않을 수가 있습니다. 그러므로 실행 화면을 먼저 보도록 하겠습니다.

(Sphere의 왼쪽에 있는 Cube는 Is Trigger가 체크되어있는 상태입니다.)

Sphere가 Cube에 충돌할 때 Console 창을 보시면

Debug.Log로 각 상황에 맞는 이벤트가 발생한 것을 알 수 있습니다.

아래의 코드 내용과 비교하여 보면 이해가 수월하실 겁니다.

위 내용은

https://unity3d.com/kr/learn/tutorials/topics/physics/colliders?playlist=17120

을 참고하였습니다.

반응형

[Unity Function] 충돌 처리 Collision & Trigger 관련 함수

반응형

[목차]

#1 충돌 발생조건

#2 Collision – OnCollisionEnter(), OnCollisionStay(), OnCollisionExit()

#3 Trigger – OnTriggerEnter(), OnTriggerStay(), OnTriggerExit()

* 개인적인 공부 내용을 기록하기 위한 용도로 작성된 게시글 이기에, 잘못된 내용이 있을 수 있습니다.

#1 충돌 발생조건

* 충돌이 일어나기 위해서는, 두 오브젝트가 모두 Collider를 갖고 있어야 하며, 둘 중 하나 이상은 RigidBody 컴퍼넌트를 갖고 있어야 합니다.

* 두 개의 오브젝트 중 하나의 오브젝트만 움직인다면, 움직이는 오브젝트가 RigidBody 컴퍼넌트를 가지고 있어야 합니다.

#2 Collision

Collision은 실제로 물리적 충돌을 감지하여 충돌을 처리하는 클래스입니다.

* 따라서 두 오브젝트 모두 RigidBody 컴퍼넌트의 Is Kinematic (체크 하면 외부 물리효과를 무시함.) 항목이 비활성화 되어 있어야만 합니다.

[Collision 관련 함수]

OnCollisionEnter(Collision collision) : 두 객체가 충돌 시 호출되는 함수 입니다.

OnCollisionStay(Collision collision) : 두 객체가 충돌하는 동안 호출되는 함수 입니다.

OnCollisionExit(Collision collision) : 두 객체가 충돌을 끝마치면 호출되는 함수 입니다.

[OnCollisionEnter() 예제]

* 좌측의 검은색 공이 우측의 흰색 공과 충돌 시 흰색 공의 색깔을 검은색으로 변하는 예제 입니다.

검은색 공에 적용된 C# 스크립트 : BallController

– 단순히 Input 함수들을 이용해 WASD 방향으로 이동을 수행하는 스크립트 입니다.

using System.Collections; using System.Collections.Generic; using UnityEngine; public class BallController : MonoBehaviour { [SerializeField] private float _speed = 10.0f; void Start() { //rigid = GetComponent(); } void Update() { Move(); } void Move() { if (Input.GetKey(KeyCode.W)) { transform.Translate(Vector3.forward * _speed * Time.deltaTime); } if (Input.GetKey(KeyCode.S)) { transform.Translate(Vector3.back * _speed * Time.deltaTime); } if (Input.GetKey(KeyCode.A)) { transform.Translate(Vector3.left * _speed * Time.deltaTime); } if (Input.GetKey(KeyCode.D)) { transform.Translate(Vector3.right * _speed * Time.deltaTime); } } }

흰색 공에 적용된 C# 스크립트 : CollisionDetected

– OnCollisionEnter() 함수를 이용해 , 충돌을 감지하여 충돌 시 공의 색상을 검은색으로 바꿔주는 기능을 수행합니다.

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CollisionDetected : MonoBehaviour { MeshRenderer mesh; Material mat; void Start() { mesh = GetComponent(); mat = mesh.material; } private void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == “Sphere”) { mat.color = new Color(0, 0, 0); } } }

[실행결과]

#3 Trigger

Trigger은 Collision과 달리 Collider 를 이용해 충돌을 감지하는 클래스 입니다. 실제적인 물리적 충돌 연산을 하지 않고, 충돌을 감지 하기에 Is Kinematic 의 활성화 여부는 영향을 받지 않습니다. 따라서, 파라미터도 Collision이 아닌 Collider 입니다. 단, Trigger을 사용하기 위해서는 해당하는 게임 오브젝트의 Collider에 Is Trigger 항목을 활성화 해 주어야 합니다.

* 보통 특정 영역에 오브젝트가 진입했을 시 , 이벤트가 발생하는 상황에서 자주 사용됩니다.

[Trigger 관련 함수]

OnTriggerEnter(Collider other) : 두 객체가 충돌 시 호출되는 함수 입니다.

OnTriggerStay(Collider other) : 두 객체가 충돌하는 동안 호출되는 함수 입니다.

OnTriggerExit(Collider other) : 두 객체가 충돌을 끝마치면 호출되는 함수 입니다.

[OnTriggerStay() 예제]

* 검은색 공이 투명한 큐브 영역에 들어갈 시 공의 색이 하얀색으로 변하는 예제 입니다.

[사전작업]

* Cube 오브젝트의 Collider에서 Is Trigger 항목을 활성화 해 줍니다.

검은색 공에 적용된 C# 스크립트 : BallController (#2와 동일)

TriggerDetected – OnTriggerStay() 함수를 이용해 검은색 공이 박스 영역에 진입 시, 색깔이 흰색으로 바뀌는 역할을 수행합니다.

using System.Collections; using System.Collections.Generic; using UnityEngine; public class TriggerDetected : MonoBehaviour { MeshRenderer mesh; Material mat; void Start() { mesh = GetComponent(); mat = mesh.material; } private void OnTriggerStay(Collider other) { if(other.gameObject.name == “Cube”) { mat.color = new Color(1, 1, 1); } } }

반응형

[Unity3D] Physics – Collider 컴포넌트로 충돌체크하기

Physics

Collider 컴포넌트로 충돌체크하기

작성 기준 버전 :: 2019.2

[본 포스트의 내용은 유튜브 영상을 통해서도 확인할 수 있습니다]

게임에서는 많은 것들이 충돌한다.

캐릭터가 총알이나 화살에 맞기도 하고, 달리던 자동차가 건물에 부딪히기도 하며 약간은 다른 개념으로 보안용 레이저에 도둑인 캐릭터가 감지되어 경보가 울리기도 한다.

이런 오브젝트의 충돌들을 처리하기 위해서는 물리적인 충돌을 처리하는 방법을 알아야 한다.

Collider 컴포넌트

유니티 엔진에서 Collider라는 컴포넌트를 이용해서 충돌을 체크한다.

유니티 엔진에서 가장 대표적으로 사용되는 콜라이더로는 Box Collider, Sphere Collider, Capsule Collider가 있다.

씬 뷰에서 Collider 컴포넌트가 붙어있는 게임 오브젝트를 선택해보면 위의 이미지와 같은 초록색 선으로 표시되는 영역이 보이는데, 이것은 Collider 컴포넌트가 충돌을 감지하는 영역의 크기를 보여준다.

Collider 컴포넌트의 프로퍼티

이번에는 각 Collider 컴포넌트의 프로퍼티들을 살펴보자.

우선 Collider 컴포넌트들은 공통적으로 Is Trigger 프로퍼티와 Material 프로퍼티, Center 프로퍼티를 가지고 있다. 하지만 이 중에서 Is Trigger와 Material 프로퍼티는 좀 더 뒤에서 설명하도록 하고 먼저 Center 프로퍼티부터 하나씩 살펴보자.

Center 프로퍼티와 그 아래에 있는 프로퍼티들은 콜라이더 영역의 위치와 크기를 조절하는데 쓰인다.

Center

먼저 Center 프로퍼티는 게임 오브젝트의 중심으로부터 어느 위치에 콜라이더의 중심을 둘 것인가를 설정한다. 위 이미지처럼 Y 값을 바꾸면 게임 오브젝트의 중심보다 위쪽에 약간 위쪽에 콜라이더 영역이 표시된다. 단 이때의 좌표 기준을 게임 오브젝트의 로컬 좌표를 기준으로 동작한다.

Box Collider의 프로퍼티

Center 아래의 프로퍼티들은 콜라이더의 종류마다 조금씩 다르니 하나씩 설명해보도록 하겠다.

Size

Box Collider의 Size 프로퍼티는 콜라이더 영역의 크기를 정하는데 쓰인다. Vector3 타입이며 xyz 각 값은 게임 오브젝트의 로컬 좌표계의 축에 일치하게 동작하며, 이 사이즈의 1 단위는 1 유니티 미터를 의미한다.

Sphere Collier의 프로퍼티

Radius

Sphere Collider의 Radius 프로퍼티 역시 콜라이더 영역의 크기를 정하는데 쓰이는데, 이 값은 구체의 반지름으로 동작한다. Radius를 1로 정하면 콜라이더 영역의 지름은 2유니티 미터가 된다.

Capsule Collider

Radius

Capsule Collider의 Radius 값은 콜라이더 영역의 두께를 정하는데 쓰인다. 참고로 이 값이 Height 값보다 커지면, 콜라이더의 영역이 Sphere Collider처럼 그냥 구체 모양이 되버린다.

Height

Height 값은 Capsule Collider의 길이를 정하는데 쓰인다.

Direction

Direction 프로퍼티는 Capsule Collider의 Height를 변경했을때 길어지는 방향을 정하는 프로퍼티다. 값으로는 X-Axis, Y-Axis, Z-Axis가 있는데, 단어 그대로 로컬 좌표계의 각 축의 방향을 따른다.

참고로 사람이 서있을 때의 모양이 위 아래로 길쭉한 모양이 일반적이기 때문에 사람 형태의 캐릭터에 콜라이더를 부착할 때는 Capsule Collider를 주로 사용한다. 그리고 뚱뚱한 캐릭터면 Radius 값을 늘려서 Capsule Collider의 두께를 두껍게하고, 키가 큰 캐릭터면 Height 값을 키워서 길이를 늘리는 방식으로 사용된다.

Is Trigger

그럼 이제 잠시 뒤로 미뤄두었던 Is Trigger 옵션을 보자. 이 옵션은 콜라이더가 트리거(Trigger)로 동작할지, 콜리전(Collision)으로 동작할지를 정하는 프로퍼티이다.

콜리전은 벽이나 바닥처럼 다른 물체를 통과하지 못하게 가로막는 장애물을 뜻하고, 트리거는 마트의 도난 방지 장치처럼 물체를 통과시키되 지나가는 물체를 감지하는 것을 의미한다.

Sphere 게임 오브젝트를 Cube 게임 오브젝트 위로 떨어지게 만든 뒤 Cube 게임 오브젝트가 가진 Box Collider의 Is Trigger 옵션을 켜둔 상태와 꺼둔 상태로 각각 플레이를 해보면 Is Trigger가 꺼져있을 때는 Sphere가 Cube위에 멈추고, 켜져있을 때는 Cube를 통과해버리는 것을 볼 수 있다.

참고로, 이렇게 게임 오브젝트가 중력과 같은 물리효과를 받게 하기 위해서는 Rigidbody 컴포넌트를 붙여줘야 한다.

Material

Material 프로퍼티는 콜라이더가 충돌할 때, 어떤 재료의 물리적인 특성을 보여줄 지를 설정할 수 있는 프로퍼티이다. 이런 종류의 머티리얼을 Physics Material이라고 하는데, 프로젝트 뷰에 우클릭하고 [Create > Physics Material]을 선택해서 생성할 수 있다.

오브젝트가 고무공처럼 튀는 것을 구현하기 위해 생성한 피직스 머티리얼에 여러가지 옵션이 있지만, 지금은 간단하게 Bounciness 옵션을 0.8로 변경하고 Bounce Combine을 “Maximum”으로 설정한다.

Sphere 게임 오브젝트의 Sphere Collider에 넣고 플레이 버튼을 눌러보면 아까 전에는 Cube 위에 얌전히 멈췄던 Sphere가 마치 고무공처럼 튀어오르는 것을 볼 수 있다.

Collider 충돌 감지하는 스크립트 작성하기

이제 이 충돌을 스크립트에서 감지하는 방법을 알아보자.

유니티 엔진에서는 콜라이더끼리 충돌했을 때, 특정한 함수를 호출해준다. 그런데 앞에서 Is Trigger 프로퍼티에 대해서 설명할 때, 이 옵션의 상태에 따라서 트리거와 콜리전으로 나뉜다고 이야기했던 것을 기억할 것이다.

유니티 엔진은 이 트리거와 콜리전이 충돌하는 경우를 다르게 취급하고 다른 함수를 호출해준다.

OnCollision 이벤트

public class ColliTest : MonoBehaviour { // Collider 컴포넌트의 is Trigger가 false인 상태로 충돌을 시작했을 때 private void OnCollisionEnter(Collision collision) { Debug.Log(“충돌 시작!”); } // Collider 컴포넌트의 is Trigger가 false인 상태로 충돌중일 때 private void OnCollisionStay(Collision collision) { Debug.Log(“충돌 중!”); } // Collider 컴포넌트의 is Trigger가 false인 상태로 충돌이 끝났을 때 private void OnCollisionExit(Collision collision) { Debug.Log(“충돌 끝!”); } }

콜리전끼리 충돌했을 때는 OnCollision 계열의 이벤트가 호출된다. 충돌 과정은 3단계로 나눠서 호출되는데, 충돌이 시작할 때는 Enter, 충돌이 지속되는 동안에는 Stay, 충돌이 끝나는 순간에는 Exit가 호출된다.

private void OnCollisionEnter(Collision collision) { // 이 컴포넌트가 부착된 게임 오브젝트의 콜라이더와 충돌한 게임 오브젝트 가져오기 var obj = collision.gameObject; // 특정 컴포넌트 가져오기 var component = collision.gameObject.GetComponent(); // 콜라이더 가져오기 var collider = collision.collider; Debug.Log(“충돌 시작!”); }

이 콜리전과 충돌한 게임 오브젝트를 가져오기 위해서는 매개변수로 전달되는 collision에서 .gameObject 프로퍼티를 호출하면 된다. 그리고 .GetComponent 함수를 사용하면 이 게임 오브젝트에 부착된 컴포넌트를 가져올 수도 있다.

OnTrigger 이벤트

public class ColliTest : MonoBehaviour { // Collider 컴포넌트의 is Trigger가 true인 상태로 충돌을 시작했을 때 private void OnTriggerEnter(Collider other) { Debug.Log(other.name + “감지 시작!”); } // Collider 컴포넌트의 is Trigger가 true인 상태로 충돌중일 때 private void OnTriggerStay(Collider other) { Debug.Log(other.name + “감지 중!”); } // Collider 컴포넌트의 is Trigger가 true인 상태로 충돌이 끝났을 때 private void OnTriggerExit(Collider other) { Debug.Log(other.name + “감지 끝!”); } }

OnTrigger 이벤트 역시 Enter, Stay, Exit의 과정을 거친다. 이 OnTrigger 이벤트는 콜리전이 트리거에 닿았을 때, 콜리전과 트리거 양 쪽에서 모두 호출될 수 있고, 트리거와 트리거가 닿았을 때도 호출된다.

private void OnTriggerEnter(Collider other) { // 이 컴포넌트가 부착된 게임 오브젝트의 콜라이더와 충돌한 게임 오브젝트 가져오기 var obj = other.gameObject; // 특정 컴포넌트 가져오기 var component = other.gameObject.GetComponent(); Debug.Log(other.name + “감지 시작!”); }

OnTrigger 이벤트에서도 OnCollision 이벤트에서처럼 매개변수로 전달받은 Collider 타입의 other 변수를 통해서 감지한 게임 오브젝트와 거기에 부착된 컴포넌트를 가지고 올 수 있다.

기초적인 Collider의 사용법을 이해했다면 링크된 유튜브 영상을 통해서 이 Collider 컴포넌트의 기능을 응용해서 간단한 게임 기능을 구현하는 방법을 확인할 수 있다.

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

[투네이션] [Patreon] [디스코드 채널]

반응형

[Unity] collision 오브젝트 충돌 감지 방법

1. Collision이란 무엇인가?

Collision은 말 그대로 ‘충돌’이라는 기능을 갖고 있습니다.

오브젝트와 오브젝트가 서로 면이 맞닿음을 감지합니다. 물체끼리 부딪혔을 때 어떤 물체와 부딪혔는지도 파악할 수 있습니다.

Rigidbody

Rigidbody는 오브젝트를 속이 찬, 그러니까 mesh한 body로 만들어준다.

rigidbody가 없으면 오브젝트끼리 통과하지만 있으면 통과하지 못한다.

2. 유니티에서 간단한 실습해보기

유니티에서 평면 위에 공을 떨어트려서 충돌 감지를 하는 실습을 해볼 것이다.

우클릭 ▶ 3D Object ▶ Plane 을 선택하여 평면을 추가해준다.

이런 평면이 새로 생성되는데 너무 칙칙해서 하얀 매테리얼로 바꿔주겠다. (필수X)

메테리얼을 바꾸는 방법은 inspector 창 ▶ Mesh Renderer ▶ Materials ▶ Element 0 ▶ 맨 오른쪽 원 두개 버튼을 눌러서 하얀 매테리얼로 변경해줬다.

매테리얼 변경 완료

구 오브젝트를 생성한다.

hierarchy 창에서 우클릭 ▶ 3D Object ▶ Sphere

구를 평면 위로 이동을 해줍시다. 구 위에 있는 화살표를 당겨줍니다.

shpere 오브젝트를 누르고 inspector 창 ▶ add component ▶ rigidbody를 추가해줍니다.

공이 떨어져서 평면을 감지하니까 공이 감지한 물체가 뭔지 알려면

평면에게 tag를 달아줘야 합니다.

평면 오브젝트에게 이름을 붙여주는 것이죠.

그럼 태그를 추가해서 달아봅시다.

위 사진처럼 태그부분을 클릭하여 add tag… 를 선택해줍니다.

Tags에 가장 오른쪽에 있는 + 버튼을 누릅니다.

태그 이름을 plane으로 생성해줍니다. (자유롭게)

save 를 눌러줍니다.

다시 아까 창으로 돌아와 tag 부분을 보면 맨 아래 plane 부분이 생겼습니다.

해당 태그로 설정해줍니다.

이제 소스코드를 코딩해봅시다.

project 파일에서 우클릭 ▶ create ▶ c# script 로 새로운 스크립트를 생성해줍니다. (이름은 마음대로)

collision 탐지는 정해진 함수를 사용해야된다.

collision을 감지하는 함수는 많지만 가장 많이 사용되는 OnCollisionEnter 함수를 사용해보겠다.

using System.Collections; using System.Collections.Generic; using UnityEngine; public class collision : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private void OnCollisionEnter(Collision collision) { if (collision.collider.gameObject.CompareTag(“plane”)) { Debug.Log(“This is plane”); } } }

일단 collision을 감지하면 해당 함수가 발동되고

Tag가 “plane”인 오브젝트와 collision 하면 작동되는 조건문이다.

임시로 log를 출력하게 했다.

collision 함수의 종류

plane을 감지하는 오브젝트는 구 오브젝트이므로 shpere 오브젝트의 inspector 창에 위에서 작성했던 스크립트를 추가한다. (드래그)

위에 재생버튼으로 실행해보면 구가 떨어져서 평면에 안착하고,

console 창에서는 “This is plane” 로그가 기록된 것을 보니, 구 오브젝트가 plane 오브젝트를 감지한 것을 알 수 있다.

7. 프리팹, 충돌 처리(OnTrigger, OnCollision) 등 : 유니티 튜토리얼

이번 글의 기능을 이용해 만들어본 것들

프리팹

게임 오브텍트는 프리팹으로 만들어 재활용할 수 있다. 마치, 칼을 찍어내는 주물이라고 생각하면 된다!

사용법은 간단하다. Hierarchy에 있는 오브젝트를 프로젝트 창에 드래그&드랍 해주기만 하면 된다!

Use Gravity

리지드 바디 컴포넌트의 Use Gravity 필드를 해제하면 중력의 영향을 받지 않는다.

transform

변수 transform은 스크립트에서 자신의 트랜스폼 컴포넌트로 바로 접근하는 지름길이다!

Destroy( )

void Start() { // 이동에 사용할 리지드바디 컴포넌트 할당 bulletRigidbody = GetComponent(); // 리지드바디의 속도 = 앞쪽 방향 * 이동 속력 bulletRigidbody.velocity = transform.forward * speed; // 3초 후에 파괴 Destroy(gameObject, 3f); }

Destroy( ) 메서드는 주어진 오브젝트를 파괴하며, 지연시간을 입력할 수 있다.

충돌 처리

충돌 처리는 종류에 따라 OnTriggerEnter 혹은 OnColliosionEnter 메시지를 받는다. 충돌했을 때, 충돌한 오브젝트의 정보도 함께 받게 되는데, 이때 충돌 메시지를 발생시키는 것은 리지드 바디 컴포넌트이다. 따라서 충돌 이벤트 메서드를 사용하려면 충돌 중인 게임 오브젝트 중 최소 하나의 게임 오브젝트는 리지드바디 컴포넌트를 가지고 있어야 한다.

OnCollision 계열 : 일반 충돌

일반적인 콜라이더를 가진 두 게임 오브젝트가 충돌할 때 자동으로 실행된다. 충돌한 두 콜라이더는 서로 통과하지 않고 밀어낸다.

OnCollisionEnter(Collision collision) : 충돌한 순간 OnCollisionStay(Collision collision) : 충돌하는 동안 OnCollisionExit(Collision collision) : 충돌했다가 분리되는 순간

OnTrigger 계열 : 트리거 충돌

OnTriggerEnter(Collider other) : 충돌한 순간 OnTriggerStay(Collider other) : 충돌하는 동안 OnTriggerExit(Collider other) : 충돌했다가 분리되는 순간 void OnTriggerEnter(Collider other) { // 충돌한 상대방 게임 오브젝트가 Player 태그를 가진 경우 if (other.tag == “Player”) { // 상대방 게임 오브젝트에서 PlayerController 컴포넌트 가져오기 PlayerController playerController = other.GetComponent(); // 상대방으로부터 PlayerController 컴포넌트 가져오는 데 성공했다면 if (playerController != null) { playerController.Die(); } } }

충돌한 두 게임 오브젝트의 콜라이더 중 최소 하나가 트리거 콜라이더라면 자동으로 실행된다. 이 경우 두 게임 오브젝트는 충돌시 서로 통과한다. (자신이 트리거 콜라이더가 아니어도 실행될 수 있음)

OnTrigger 계열의 메서드가 실행될 때는 상대방 게임 오브젝트의 콜라이더 컴포넌트가 Collider 타입으로 들어온다. 여기서 Collision이 아닌 Collider 타입을 입력받는 이유는 트리거 충돌에는 상세한 충돌 정보가 필요 없기 때문이다!

트리거 충돌은 새로운 적이나 컷신 재생을 위한 포인트로 사용할 수 있다.

NOTE :

충돌한 상대방 게임 오브젝트를 태그로 식별할 수 있다.

FindObjectOfType<>( )은 씬에 있는 모든 오브젝트를 검사하여 원하는 타입(<>)의 오브젝트를 가져온다. 다만 실행시간이 매우 오래 걸리기 때문에, 주로 Start( )에서 사용해야 한다! FindObjectsOfType<>( )은 해당 타입들을 전부 검색해 배열로 리턴한다!

아래는 총알을 발사하는 발사 기둥의 코드이다. Instantiate( )를 통해 입력한 원본 오브젝트의 복제본을 생성할 수 있다!

public class BulletSpawner : MonoBehaviour { public GameObject bulletPrefab; // 생성할 탄알의 원본 프리팹 public float spawnRateMin = 0.5f; // 최소 생성 주기 public float spawnRateMax = 3f; // 최대 생성 주기 private Transform target; // 발사할 대상 private float spawnRate; // 생성 주기 private float timeAfterSpawn; // 최근 생성 시점에서 지난 시간 // Start is called before the first frame update void Start() { timeAfterSpawn = 0f; spawnRate = Random.Range(spawnRateMin, spawnRateMax); target = FindObjectOfType().transform; } // Update is called once per frame void Update() { timeAfterSpawn += Time.deltaTime; if (timeAfterSpawn >= spawnRate) { timeAfterSpawn = 0f; GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation); bullet.transform.LookAt(target); spawnRate = Random.Range(spawnRateMin, spawnRateMax); } } }

[Unity] 물리 처리, 충돌 처리 : Rigidbody 컴포넌트

충돌 처리

충돌 처리는 게임 상에서 어떠한 일이 발생 되는 것을 감지를 할 수 있어야 한다.

게임에서의 충돌은 특정 영역에 진입했을 때나 두 물체 간의 충돌, 마우스 픽킹, UI버튼을 누르는 등의

이벤트 처리도 모두 충돌의 개념이다. 물리 충돌을 구현할 때는 FixedUpdate()에서 구현한다.

ex) 몬스터가 서있는 위치를 충돌로 찾는다.

렌더링시스템과 물리시스템

유니티 시스템의 큰 특징은 렌더링 시스템과 물리시스템이 구분되어져 있다.

Update()와 FixedUpdate() 갱신 주기가 다르기 때문에 호출 속도가 다르다.

Update()

Update() 메소드는 매프레임마다 호출되며, 렌더링을 다루는 시스템이다.

FixedUpdate()

물리량 을 다루는 시스템으로, 물리 충돌을 구현할 때는 FixedUpdate()에서 구현한다.

FixedUpdate에서는 Time.fixedDeltaTime로 시간 클래스를 사용한다.

충돌 검사 방법

충돌 처리를 하기 위해서는 Rigidbody와 Collider컴포넌트가 필요하다.

콜라이더 컴포넌트는 충돌체 구현, Rigidbody 컴포넌트는 물리 구현이다.

게임오브젝트에는 콜라이더 컴포넌트가 적용되어 있어야 하며,

콜라이더에 물리를 적용하고 충돌 처리를 할 수 있는 것이 리지드바디 컴포넌트이다.

충돌 처리를 할 게임오브젝트는 이 두 가지가 꼭 붙어야 한다.

Rigidbody 컴포넌트

물리를 구현하기 위해 반드시 필요한 컴포넌트로 게임오브젝트에 적용시 중력이 적용된다.

// 물리 : 시공간에서의 물체의 운동, 에너지 힘을 말한다.

리지드 바디 컴포넌트가 추가되면 물리학의 통제로 게임오브젝트는 중력의 영향을 받는다.

충돌 이벤트를 사용해 충돌 처리를 하기 위해선 게임오브젝트 중에서 최소 하나의 게임오브젝트는 리지드바디 컴포넌트를 가지고 있어야 한다.

프로퍼티

Mass : 질량

Drag : 저항력, 움직임 방향에 대하여 반대로 작용한다.

Anqular Drag : 회전에 대한 저항력 의미

Use Gravity : 중력을 사용할지 여부

Is Kinematic : 물리 효과 적용 여부

Interpolate : Update() 메소드와 FixedUpdate() 메소드가 독립적으로 움직일 경우이를 보완하기 위하여 렌더링 프레임의 위치로 물리의 결과를 보간하는 기능을 제공한다. 끊겨 보일 수 있는 단점이 있다.

Collision Detection (충돌 감지)

Disrete : 충돌 이산 감지로 물리 프레임간 간격을 두고 충돌 감지를 하기 때문에 계산량이 적을 때 일반적으로 많이 사용한다.

Continuos : 충돌 연속 감지로 충돌이 일어날 것을 미리 예측하고 탐지한다. 정확하지만 계산량이 많다.

Constraints : 해당 좌표는 물리가 적용되지 않는다. 그러나 트랜스폼 컴포넌트의 위치나 회전에 새로운 값을 할당하여 위치나 회전을 변경하는 것은 막을 수 없다.

docs.unity3d.com/Manual/class-Rigidbody.html

Rigidbody컴포넌트의 주요 메소드

AddForce()

관성을 누적해서 속력을 증가 시킨다. 벡터의 크기와 방향이 적용되어 이동하게 된다.

발사체의 힘은 발사될 때 한번만 적용하면 된다.

force : 벡터값

mode : ForceMode : 관성 적용 방법

ForceMode에 따라서 힘이 적용되는 방법이 달라진다.

ex) 발사체 구현하기

특정 방향으로 향하는 게임오브젝트 물리량을 이용하여 발사체를 구현이 가능하다.

중력이 적용되어 수직으로 힘이 적용되어 포물선으로 전달된다.

// 매개변수 : 관성의 벡터값 전달, 관성 타입 전달 public void AddForce(Vector3 force, ForceMode mode = ForceMode.Force);

Rigidbody컴포넌트의 주요 프로퍼티

velocity

이전 속도를 리셋해서 관성을 무시하고 속도가 즉시 변경되고 새로운 속도를 사용한다.

리지드바디의 velocity 변수로 현재 속도를 반환하고, 변경할 수 있다.

public Vector3 velocity;

docs.unity3d.com/ScriptReference/Rigidbody.html

충돌 처리 예외 사항

프레임드랍에 의한 충돌 무시 처리 방법

서버 기반일 경우 서버에서 판정한다.

프레임 드랍시에 대비한 처리는 예측을 통한 이전 위치로 이동 또는 판정하는 방법이 있다.

ex) 직선 상의 한 점이 위치해 있는가? (수학적으로 따진다.)

ex) 적을 총알로 맞춰야 하는데 총알이 너무 빠르면 텔레포트되서 통과해버릴 경우 처리 방법

물리기반 업데이트에서 물리충돌 구현시 발생할 가능성이 높다.

일단 유니티 기반 시스템 이해해야 한다.

총알 속도가 빨라서 충돌을 무시할 정도라면 시스템의 성능을 넘어선 것으로 기획을 조정해야 한다.

콜라이더(Collider)

콜라이더는 충돌 처리를 하기 위해 충돌을 감지하는 컴포넌트이다.

물체의 물리를 적용하거나 다른 물체와 충돌을 감지한다.

콜라이더 종류

3D Collider이며 2D일 경우에는 콜라이더 컴포넌트 이름에 2D가 추가 된다.

에셋에서 다운받은 캐릭터 게임오브젝트가 메시콜라이더 컴포넌트일 경우 무겁기 때문에 삭제하고 박스콜라이더 컴포넌트 추가하기

Box Collider : 유니티 기본 콜라이더이다. 게임오브젝트 생성시 게임오브젝트의 크기에 맞춰 기본적으로 셋팅되어 있다.

Sphere Collider : 연산속도가 빠른 대신에 인간형 같은 모델에는 적합하지 않다.

Capsule Collider : 인간형과 같은 모델에 적합하다.

Mesh Collider : 메시 형태로 콜라이더를 만들 수 있다. 그러나 메시가 복잡할 경우 계산량이 많아지기 때문에 게임속도에 영향을 주며, 설정에도 제약이 따른다. Mesh Collider가 제일 많이 사용된다.

docs.unity3d.com/Manual/CollidersOverview.html

부모 – 자식 게임오브젝트의 콜라이더 컴포넌트 관리 방법

부모 오브젝트에 자식 오브젝트인 Mesh 오브젝트는 별개의 게임오브젝트이다.

부모 오브젝트에 스크립트 컴포넌트와 콜라이더 컴포넌트를 추가하는 것이 좋다.

왜냐하면 Mesh 오브젝트에서 충돌이 일어날 경우 자식들을 전부 검사해서 부모와 비교해야 하기 때문에

에디터에서 콜라이더 컴포넌트는 스크립트 컴포넌트와 같이 부모 오브젝트에 추가해서 관리하도록 한다.

다른 게임오브젝트 모델에도 이 규칙을 설정해줘야 컴포넌트 관계가 꼬이지 않는다.

Q. 게임오브젝트 콜라이더 수정이유는 무엇이며 왜 콜라이더위치를 정하는 가?

>>Mesh 게임오브젝트에 붙일 경우 충돌은 되지만 그 오브젝트에는 해당 충돌 이벤트 메소드가 없고 부모오젝트에 스크립트가 있을 경우 적용이 되지 않는다. 그리고 최상위 오브젝트의 태그를 바꾼다고 하위 오브젝트 태그가 바뀌진 않기 때문이다.

부분 충돌 구현 시 콜라이더 컴포넌트 사용 방법

부분 충돌 을 구현하려면 콜라이더박스를 여러 개 넣어야 한다. 팔 다리 몸통 머리에 각각 콜라이더를 붙여서 충돌을 정교하게 하고 싶은 경우에는 콜라이더 위치가 자식에 붙어야 하는 경우가 있다.

보통 콜라이더가 여러 개 붙어있는 것을 검색하려면 유연하게 만들어야 함.

콜라이더가 부모 위에만 있으란 법이 없고 두단계 한단계 위로 올수도 있다.

또한 계층구조를 바꿀 수도 있다.

이럴때는 재귀호출 을 이용하여 위에서부터 아래로 훑는다.

* Script reference GameObject.Find 검색해서 부모와 자식 오브젝트 관계 예시 참고하기그러나 연산량이 발생하기 때문에 우리는 콜라이더박스의 위치를 어디에 넣을 것인지 규칙을 정하는 것이다.

그래야 모델구조가 맞고 동일한 코드에서 재사용이 가능하다.

ex) 빨간거북이 콜라이더는 Mesh 오브젝트에 붙어 있는데 트롤은 최상위 부모에 콜라이더 붙어 있다. 삭제 후 빨간거북이오브젝트에 박스콜라이더를 새로 생성한다.

콜라이더 충돌 설정 방법

Collider > IsTrigger : 트리거 충돌 준비 완료

IsTrigger를 체크하지 않는다면 Collision 충돌로 인식하여 Trigger 관련 메소드가 아닌 Collision 관련 메소드 사용

충돌 이벤트 메소드

충돌했을 때 어떤 처리를 실행할지 결정하는 메소드이다.

충돌한 게임오브젝트와 추가된 컴포넌트들은 충돌 처리 메소드를 실행한다.

충돌 종류에 따라 충돌 이벤트 메서드 중 알맞은 것을 선택하여 구현하다.

충돌은 크게 Collision과 Trigger로 구분

물리량이 적용된 충돌시 발생하는 충돌 메소드

일반 콜라이더 를 가진 두 게임 오브젝트가 충돌할 때 실행된다.

충돌이 발생했을 경우 물리량이 적용된다.

질량이 적용되어 현상이 발생한다.

ex) 무거운 것보다 가벼운 것이 충돌하면 더 멀리 튕긴다.

Collision 관련 메소드

물리량이 적용되는 충돌 컴포넌트이다.

매개변수로 Collision (충돌)을 전달한다.

docs.unity3d.com/ScriptReference/Collision.html

OnCollisionEnter(Collider collision) : 충돌이 시작될 때 호출

OnCollisionStay(Collider collsion) : 충돌이 진행될 때 호출

OnCollisionExit(Collider collision) : 충돌이 종료될 때 호출

ex)

private void OnCollisionEnter(Conllision collsion) { Debug.Log(collision.gameObject.name + ” : 충돌 시작”); } private void OnCollisionStay(Collision collision) { Debug.Log(collision.gameObject.name + ” : 충돌 중”); } private void OnCollisionExit(Collision collision) { Debug.Log(collision.gameObject.name + ” : 충돌 종료”); }

물리량이 적용되지 않은 충돌시 발생하는 충돌 메소드

트리거 충돌 로 충돌한 두 게임오브젝트 중 하나라도 트리거 콜라이더라면 실행된다.

이 경우 두 게임오브젝트가 충돌했을 때 서로 통과하게 된다.

특정영역에 진입했을 경우나 포털영역에 진입했을 경우에 자주 사용 된다.

ex) 엘리베이터 앞에 서있을 때 엘리베이터가 움직인다.

Trigger 관련 메소드

매개변수로 Collider (충돌체)을 전달한다.

물리량이 적용되지 않는 충돌, 아이템 획득시 적용이 가능하다.

OnTriggerEnter(Collider other) : 트리거가 시작될 때 호출

OnTriggerStay(Collider other) : 트리거가 진행될 때 호출

OnTriggerExit(Collider other) : 트리거가 종료될 때 호출

ex)

private void OnTriggerEnter(Collider other) { Debug.Log(“Trigger Enter :” + other.name); } private void OnTriggerStay(Collider other) { Debug.Log(“Trigger Stay : ” + other.name); } private void OnTriggerExit(Collider other) { Debug.Log(“Trigger Exit : ” + other.name); }

ex) OnTriggerEnter()

other의 게임오브젝트에 PlayerController 컴포넌트가 없으면 playerController에 null이 할당된다.이렇게 실수를 대비하여 코드를 만드는 것이 좋다.

private void OnTriggerEnter(Collider other) { //충돌한 상대방 게임오브젝트가 Player 태그를 가진 경우 if(other.tag == “Player”) { //상대방 게임오브젝트에서 PlayerController 컴포넌트 가져오기 PlayerController playerController = other.GetComponent(); //상대방으로부터 PlayerController 컴포넌트를 가져오는 데 성공했다면 if(playerController != null) { //상대방 PlayerController 컴포넌트의 Die() 메소드 실행 playerController.Die(); } } }

docs.unity3d.com/ScriptReference/Collider.html

Chapter 4-1. 충돌 : Collider & Collision & Trigger

인프런에 있는 Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 듣고 정리한 필기입니다. 😀

🌜 강의 들으러 가기 Click

🚖 Collider

Collider 를 붙였다고 해서 관통이 안된다거나 튕겨진다던가 하는 처리를 할 수는 없다. 그런 처리를 Collider를 참고하여 처리해주는 Rigidbody나 NavMeshAgent같은 어떤 물리적인 처리를 해주는 컴포넌트들이 하는 일이다. Collider는 어디까지나 그냥 참고사항일 뿐이다. (Collider만 띡 붙였는데 왜 충돌되어 튕기지 않고 그냥 관통될까 하는 의문이 들었는데 그 답은 Rigidbody를 붙이지 않았기 때문이었다. 둘 중 하나에 RIgidbody가 붙어 있어야…)

위와 같이 Mesh 는 굉장히 복잡하게 이루어져 있다. 무수한 삼각형들의 조합으로 이루어져 있기 때문에 충돌 기준을 이 Mesh 기준으로 잡으면 어마무시한 연산량이 필요할 것이다.

따라서 위와 같이 Box 모양인 Sphere 혹은 Capsule 모양의 Collider 를 Mesh를 감싸도록 붙여서 이렇게 단순하게 생긴 것으로 충돌 처리를 대신한다! Collider 영역 안에 오브젝트가 닿거나 들어오면 충돌한 것으로 인식 된다. FPS 같이 신체 부위 별로 데미지양을 다르게 받는다던가 등등 이런 복잡한 게임 같은 경우는 얼굴 손가락 팔 다리 손 상체 하체 등등에 각각 세밀하게 Collider를 따로 붙여주기도 한다.

Collider 기준으로 물리적인 충돌 처리를 해주기 때문에 Rigidbody 컴포넌트를 붙여도 Collider가 없는 오브젝트라면 물리적 충돌 처리가 되지 않고 뚫고 지나가는 등등 이런 현상이 발생하게 된다.

🚖 Collision

Collision 소개

나랑 물리적으로 부딪친 오브젝트에 대한 정보가 담겨있다.

OnCollisionEnter 이벤트 함수가 발생하면 매개 변수이인 Collision 타입의 collision 에 다음과 같은 정보가 담긴다. 나랑 부딪친 오브젝트의 Transform, Collider, GameObject, Rigidbody, 상대 속도 등등

타입의 collision 에 다음과 같은 정보가 담긴다.

OnCollisionEnter

private void OnCollisionEnter ( Collision collision ) { Debug . Log ( collision . gameObject . name ); }

이 스크립트가 붙은 오브젝트(나 자신)가 다른 오브젝트와 충돌시 OnCollisionEnter 이벤트가 발생하기 위한 조건. 아래 조건을 전부 만족해야 이 이벤트가 발생할 수 있다. 내가 혹은 상대방 둘 중 하나는 꼭 Rigidbody 컴포넌트를 가지고 있어야 한다. IsKinematic 은 꺼져 있어야 함 즉, 둘 중 하나는 꼭 충돌로 인한 물리적인 힘에 영향을 받을 수 있는 상태여야 함. 나 그리고 상대방 둘 다 모두 Collider 컴포넌트를 가지고 있어야 한다. IsTrigger 는 꺼져 있어야 함

이벤트가 발생하기 위한 조건. 아래 조건을 전부 만족해야 이 이벤트가 발생할 수 있다.

쓰임새 예시

FPS 게임 같은데서 총알이 사람에게 맞으면 총알 입장에선 사람 오브젝트 정보가 Collision으로 들어오게 되므로 그 사람의 체력을 깎거나 하는 처리를 할 수 있다.

🚖 Trigger

Trigger 소개

물리적으로 부딪치지 않더라도 내 Collider 범위 안에 들어온 오브젝트에 대한 정보가 담겨 있다.

물리적인 피격, 충돌 없이도 그냥 Collider 범위 안에만 들어 가 있는지만 판단하고 싶을 때 사용

사실적인 물리 현상 구현이 그닥 중요하지 않은 게임이라면 Trigger 를 사용하여 물리적인 연산은 하지 않되 Collider 범위 안에 닿았는지만 체크하면 성능을 높일 수 있다. 물리 연산은 성능을 저하시키기 때문

를 사용하여 물리적인 연산은 하지 않되 Collider 범위 안에 닿았는지만 체크하면 성능을 높일 수 있다.

OnTriggerEnter

private void OnTriggerEnter ( Collider other ) { Debug . Log ( other . gameObject . name ); }

이 스크립트가 붙은 오브젝트(나 자신)가 다른 오브젝트와 충돌시 OnTriggerEnter 이벤트가 발생하기 위한 조건. 아래 조건을 전부 만족해야 이 이벤트가 발생할 수 있다. 내가 혹은 상대방 둘 중 하나는 꼭 Rigidbody 컴포넌트를 가지고 있어야 한다. IsKinematic 체크 여부는 상관 없다. 나 그리고 상대방 둘 다 모두 Collider 컴포넌트를 가지고 있어야 한다. 단, 둘 중 하나라도 IsTrigger 는 반드시 켜져 있어야 함

이벤트가 발생하기 위한 조건. 아래 조건을 전부 만족해야 이 이벤트가 발생할 수 있다.

쓰임새 예시

칼을 휘둘렀는데 몬스터에 닿았는지 안닿았는지 그냥 닿았는지만 판별하고자 할 때

🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

유니티-충돌시 오브젝트 사라지게 하기

반응형

게임에서 충돌시 객체를 사라지게 하는 요소는 여러가지가 있을것이다.

총알에 맞아 적군이나 아군이 터지는 것도 그 중 하나이다.

오늘 예제에서는 유도탄이 날아와 아군에 맞으면 탄과 아군 유닛이 동시에 사라지게

하는 코드를 작성해 본다.

탄 과 기체 모두 Rigidbody 2D 와 BoxCollide 2D 를 적용하고,

기체의 C# 코드를 하기와 같이 작성한다.

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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 using System .Collections; using System .Collections.Generic; using UnityEngine; public class Fighter : MonoBehaviour { bool direction = false ; float speedX = 0 , speedY = 0 ; Rigidbody2D rbody2D; public string targetObjectName;

// 충돌했을때… private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.name = = targetObjectName) { // 현재 기체를 사라지게 this .gameObject.SetActive( false );

// 미사일을 사라지게 GameObject missile = GameObject.Find(targetObjectName); missile.SetActive( false ); } } private void Start() {

// 기체의 항속 속도 느낌을 위해서 rbody2D = GetComponent < Rigidbody2D > (); } // Update is called once per frame void Update() { //키 값이 없을때는 움직이지 않도록. speedX = 0 ; speedY = 0 ; //오른쪽 설정 if (Input.GetKey( “right” )) { // direction = false; speedX = 3 ; } //왼쪽 설정 if (Input.GetKey( “left” )) { // direction = true; speedX = – 3 ; } //위로 설정 if (Input.GetKey( “up” )) { speedY = 3 ; } //아래로 설정 if (Input.GetKey( “down” )) { speedY = – 3 ; } } // 일정한 간격에 실행. 움직임 구현 void FixedUpdate() { rbody2D.velocity = new Vector2(speedX, speedY); } } Colored by Color Scripter cs

OnCollisionEnter2D 에서 collision.gameObject.name 을 비교하는 부분과

gameObject.SetActive(false); 를 이용해서 오브젝트를 화면에서 사라지게 하는 부분이 주요한 포인트이다.

게임에서 오브젝트가 사라지거나, 나타나게 할 수 있기때문에

더욱 게임 같이 만들 수 있는 부품이 하나 더 생김을 알 수 있다.

감사합니다.

반응형

키워드에 대한 정보 유니티 충돌

다음은 Bing에서 유니티 충돌 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [Unity 2D Basic] 02. 게임오브젝트 물리와 충돌

  • 유니티 엔진
  • 유니티 강좌
  • 유니티 2D 기초
[Unity #2D #Basic] #02. #게임오브젝트 #물리와 #충돌


YouTube에서 유니티 충돌 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [Unity 2D Basic] 02. 게임오브젝트 물리와 충돌 | 유니티 충돌, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment