์ (Enemy) ๊ฒ์ ์ค๋ธ์ ํธ์ ํ์ง(Detect)๋ฅผ ๋ด๋นํ๋ ์ฝ๋ผ์ด๋๋ฅผ ๋ฌ์ ํ๋ ์ด์ด๊ฐ ํ์ฌ ์ ์ค๋ธ์ ํธ ํ์ง ์์ญ ์์ ์๋์ง ์ฒดํฌํ๋ ๋ก์ง์ ๊ตฌํํ๋ ค๊ณ ํ์๋ค. ํ์ง๋ง ํ๊ณ , ์ถฉ๋ ์ฒ๋ฆฌ๋ ํ๋ฉด ์ ๋๋ ์ฝ๋ผ์ด๋์ Is Trigger ๋ชจ๋๋ฅผ ํ์ฉํ๋ค.
๊ตฌํํ๊ณ ์ ํ๋ ๋ก์ง ๋ฐ ์ค๋น ์์
- ์ ์ ํ์์ ์ํ(Idle)๋ก ์ฌ๊ธฐ ์ ๊ธฐ๋ฅผ ๋์๋ค๋
- ํ๋ ์ด์ด๊ฐ ์ ์ ํ์ง ์์ญ์ ์ฒ์ ๋ค์ด์จ๋ค๋ฉด, ์ ์ ๊ฒฝ๊ณ ๋ชจ๋๋ก ๋์
- ํ๋ ์ด์ด๊ฐ ๊ณ์ ์ ์ ํ์ง ์์ญ์ 2์ด ์ด์ ๋จธ๋ฌด๋ฅด๊ณ ์๋ค๋ฉด, ๋น ๋ฅด๊ฒ ๋์งํ์ฌ ๊ณต๊ฒฉํ๋ ๊ณต๊ฒฉ ๋ชจ๋ ๋์
- ์ ์ด ๊ณต๊ฒฉ ๋ชจ๋๋ก ๋์ ์ ์ ํ์ง ์์ญ์์ ๋๊ฐ๋ค๋ฉด, ๋ค์ ํ์์ ์ํ๋ก ๋์
๋ฆฌ์์ค๋ ์๊ณ , ๋ก์ง๋ง ๋จผ์ ๊ตฌํํด๋ณด๋ ค๊ณ ํด์ ์บก์์ ์ (Enemy), ์ฌ๊ฐํ์ ํ๋ ์ด์ด(Player)๋ก ์ค์ ํ๋ค.
์ (Enemy) ์ค๋ธ์ ํธ์ ํ์ ์ค๋ธ์ ํธ๋ก ๋น ๊ฒ์ ์ค๋ธ์ ํธ(Empty Object)๋ฅผ ๋ง๋ค๊ณ , ์ฌ๊ธฐ์ ํ์ง๋ง ๋ด๋นํ๋ ์ฝ๋ผ์ด๋์ ํ์ง๋ฅผ ์ ์ดํ ์คํฌ๋ฆฝํธ(script)๋ฅผ ๋ฌ์์คฌ๋ค.
์ (Enemy) ์ค๋ธ์ ํธ๋ ์ฌ๋ฌ ์ค๋ธ์ ํธ๋ค๊ณผ ๋ฌผ๋ฆฌ ์ํธ ์์ฉ ๋ฐ ์ถฉ๋์ ํด์ผ ํ๋ฏ๋ก, Capsule Collider 2D์ RigidBody 2D ์ปดํฌ๋ํธ๋ฅผ ๋ฌ์์คฌ๋ค. ์ค๋ ฅ์ ์ ์ฉํ๋ฉด ์ ์ค๋ธ์ ํธ๋ ์๋๋ก ๋จ์ด์ง๋, ์ฐ์ Grivity Scale ๊ฐ์ 0์ผ๋ก ์ค์ ํด๋๋ค.
ํ๋ ์ด์ด(Player) ์ค๋ธ์ ํธ์๋ RigidBody 2D์ Box Collider 2D๋ฅผ ๋ฌ์์ฃผ๊ณ , ํ๊ทธ(Tag)๋ฅผ Player๋ก ์ค์ ํ๋ค.
/* RigidBody ์ปดํฌ๋ํธ๊ฐ ์์ด์ผ ์ฝ๋ผ์ด๋๋ก๋ถํฐ ์ถฉ๋ ์ฒ๋ฆฌ ๋ฐ ๊ฐ์ง์ ๋ํ ๋ณด๊ณ ๋ฅผ ๋ฐ์ ์ ์๋ค. */
์คํฌ๋ฆฝํธ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์คํธ์ฉ์ผ๋ก ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด ์คฌ๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Detector : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
Debug.Log("์ ์ด ๊ฐ์ง๋์์ต๋๋ค.");
}
}
private void OnTriggerStay2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
Debug.Log("์ ์ด ๊ณ์ ๊ฐ์ง๋๊ณ ์์ต๋๋ค.");
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
Debug.Log("์ ์ด ์ฌ๋ผ์ก์ต๋๋ค.");
}
}
}
์คํ ๋ฐ ๋ฌธ์ ์ ํ์
ํ๋ ์ด์ด ์ค๋ธ์ ํธ๋ฅผ ์ ์ ํ์ง ์์ญ ์ฝ๋ผ์ด๋์ ๋ฃ์ด๋๊ณ , ์ ์ ๋ค์ ๋นผ๋ ์คํ์ ํด๋ดค๋ค.
์ด์ ์ด๊ฑธ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๊ณ ์ ํ๋ ๋ก์ง์ ๋ง๋ค์๋ค. ํ์ง๋ง, ์ ์ด ํ์ง๋ฅผ ํ๋ ๊ฒ๊น์ง ๊ด์ฐฎ์๋ฐ 2์ด ์ด์ ํ์ง ํ์ ๋์งํ๋ ๋ก์ง์ด ์ ๋๋ก ์๋ํ์ง ์์๋ค. ์งฐ๋ ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ๋ง ์๊ฐํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Detector : MonoBehaviour
{
float startWarningTime;
const float DELAY = 2f;
private void OnTriggerEnter2D(Collider collision)
{
if(collision.CompareTag("Player"))
{
startWarningTime = Time.time;
// ๊ฒฝ๊ณ ๋ชจ๋ ๋์
์ฝ๋
}
}
private void OnTriggerStay2D(Collider collision)
{
if(collision.CompareTag("Player"))
{
float playerStayTime = Time.time;
bool canRush = playerStayTime >= startWarningTime + DELAY;
if(canRush)
{
// ๊ณต๊ฒฉ ๋ชจ๋๋ก ๋์
์ฝ๋
}
}
}
private void OnTriggerExit2D(Collider collision)
{
if(collision.CompareTag("Player"))
{
// ํ์์ ๋ชจ๋๋ก ๋์
์ฝ๋
}
}
}
์ฝ๋๊ฐ ์ด์ํ ๊ฒ ๊ฐ์ง๋ ์์๋ค. Time.time ๊ฐ์ด ์ ๋๋ก ๋ค์ด๊ฐ์ง ์๋ ๊ฒ์ธ๊ฐ ์ถ์ด์ ๋๋ฒ๊ทธ๋ฅผ ํด๋ดค๋๋ฐ ์ ๋๋ก ๋ค์ด๊ฐ๋ ๊ฒ์ ํ์ธํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์๊ฐํด๋ณผ ์ ์๋ ๊ฑด, OnTriggerStay() ํจ์๊ฐ ๊ณ์ ํธ์ถ๋๋์ง ์ฌ๋ถ์๋ค. ํ๋ ์ด์ด ์ค๋ธ์ ํธ๋ฅผ ์ ํ์ง ์์ญ์ ๋ฃ์ด๋๊ณ ๊ฐ๋งํ ๋ฌ ๋ดค๋ค.
ํ๋ ์ด์ด ์ค๋ธ์ ํธ๋ฅผ ํ์ง ์์ญ ๋ด๋ถ์์ ์ด์ง ์์ง์ธ ํ, ๋ค์ ๊ฐ๋งํ ๋ฌ ๋ดค๋ค.
์ด๊ฑธ ๋ณด๋, ์ 2์ด๊ฐ ์ง๋๋๋ผ๋ ๋์ง์ ์ ํ๋์ง ์ ์ ์์๋ค. ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋ค๊ฐ ์ด๋ ํ ์์ ์์ ๋์ง ๋ชจ๋๋ก ๋ค์ด๊ฐ๊ธฐ ์ํ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์์ง๋ง, ๋ค์ ํธ์ถ์ด ์ผ์ด๋์ง ์์ ๋์ง ๋ชจ๋๋ก ๋ณ๊ฒฝํ๋ ์ฝ๋๋ค์ด ์คํ๋์ง ์์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ ์ฆ๊ฑฐ๋ก, 2์ด ์ด์ ํ๋ ์ด์ด๊ฐ ๊ฐ์ง ๋์ด๋ ๋์ง์ ์ ํ๋ ์ ์ด ํ๋ ์ด์ด๋ฅผ ํ์ง ์์ญ ๋ด๋ถ์์ ์ด์ง ์์ง์ด๋ ๋์ง์ ํ๊ธฐ ์์ํ๋ค. ํด๋ณด์ง๋ ์์์ง๋ง, OnCollisionStay() ํจ์๋ ๋น์ทํ์ง ์์๊น๋ ์๊ฐ์ด ๋ ๋ค.
ํด๊ฒฐ๋ฒ
(2023.07.10 ์ถ๊ฐ)
์น์ฒ ํ์ ๋ถ์ด ์ ํ์์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๊ธ๋ก ์๋ ค์ฃผ์ จ๋ค.
Rigidbody ์ปดํฌ๋ํธ๋ ์ค๋ธ์ ํธ์ ๋ณํ๊ฐ ์ผ์ ์๊ฐ๋์ ์์ ๊ฒฝ์ฐ, ์ฌ๋ฆฌํ(Sleeping) ๋ชจ๋๋ก ๋์ ํ๋ ๊ฒ ๊ฐ๋ค.
(์ต์ ํ ๋๋ฌธ์ ๊ทธ๋ฌํ ๋ฏ ํ๋ค.)
์ ํ์๋ ์ด๋ฌํ ๊ธฐ๋ฅ ๋๋ฌธ์ ๋ฐ์ํ๋ ๊ฒ์ด๋ฏ๋ก, ์ฌ๋ฆฌํ ๋ชจ๋๋ฅผ Never Sleep์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ํด๊ฒฐ๋๋ค๊ณ ํ์ ๋ค.
์ข์ ์ ๋ณด ์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
'๐ฎGame Development > Unity' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unity] New Input System #2 | ํค ์ ๋ ฅ์ ์คํฌ๋ฆฝํธ์ ์ ๋ฌํ์ฌ ์ฒ๋ฆฌํ๊ธฐ (9) | 2022.01.26 |
---|---|
[Unity] New Input System #1 | ์ธํ ํ๊ธฐ (15) | 2022.01.26 |
[Unity] Universal RP๋ฅผ ์ด์ฉํ 2D ๋น(Light) ์ฒ๋ฆฌ (1) | 2022.01.18 |
[Unity] ์ต์ ํ๋ฅผ ์ํ ๊ฒ์ ์ค๋ธ์ ํธ ํ๊ทธ(Tag) ๋น๊ต ๋ฐฉ๋ฒ (0) | 2022.01.17 |
[Unity, C#] ๊ตฌ์กฐ์ฒด(struct)๋ ์ new ๋ฌธ๋ฒ์ ์ง์ํ ๊น? (2) | 2022.01.13 |