โ ๋ณธ ๊ธ์ ์์ฑ์๊ฐ ๊ฐ๋ฐํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ๋ก ์๋ชป๋ ์ ์ด ์์ ์ ์์ด, ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
โ ํด๋น ๋ด์ฉ์ ๊ณต์ ํ๊ฒ ๋๋ค๋ฉด, ๋ฐ๋์ ์ถ์ฒ๋ฅผ ๊ผญ ๋ช
์ํด์ฃผ๊ธฐ ๋ฐ๋๋๋ค.
Unity AR Foundation AR ๊ฐ๋ฐ ์ด๊ธฐ ์ค์ & ํ๋ฉด ์ธ์
โ ๋ธ๋ก๊ทธ๋ฅผ ์์ํ๋ ๊ณ๊ธฐ ์งํํด ์๋ AR ๊ฐ๋ฐ์ ์ํ๊ธฐ๊ฐ๊ณผ ๊ณ์ ํ๊ธฐ๋ก ์ธํด ๊ณต๋ฐฑ๊ธฐ๊ฐ ์๊ธฐ๊ฒ ๋์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ๊ธฐ์ต์ด ์ฌ๋ผ์ง๊ฒ ๋์๋ค... ๊ทธ๋ ๊ฒ ์ง๊ธ๊น์ง์ ๊ณผ์ ์ ์ ๋ฆฌ๋ ํ ๊ฒธ, ํน
vrworld.tistory.com
์ ๋ฒ ํฌ์คํ ์์๋ AR ๊ฐ๋ฐ์ ๋ํ ์ด๊ธฐ ์ค์ ๊ณผ์ ์ ๊ฑฐ์ณค๋ค. ์ด ์ค์ ์ ๋ฐํ์ผ๋ก ๊ฐ๋ฐ์ ์์ํด์ ๋๊ฐ๋ฉด ๋๋ค.

์งํํ๊ณ ์ ํ๋ AR FPS ๊ฒ์ ๊ฐ๋ฐ ํ๋ก์ ํธ๋ ์์ ์ฌ์ง๊ณผ ๊ฐ๋ค. ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ ๋งํ์๋ฉด ๋ณธ๋ ๋จธ๋ฆฟ์์ผ๋ก ๊ตฌํํ๊ณ ์ ํ๋ ๋ฐฉํฅ๊ณผ๋ ๋ฌ๋ฆฌ ํฌ๊ธฐํ ์ ์ด ๋ช ๊ฐ์ง ์์ด ๋๋ฌด ์์ฌ์ด ํ๋ก์ ํธ์๋ค.
์ด์ ์ ์ ๊ฐ์ธ์ ์ด์ผ๊ธฐ๋ ๋ง์ ๋ง๋ฌด๋ฆฌํ๋ฉด์, AR FPS ๊ฒ์ ๊ตฌํ์ ์ด๋ป๊ฒ ์์ํ์๋์ง ํฌ์คํ ์ ์ด์ด ๋๊ฐ๊ฒ ์ต๋๋ค.
๊ตฌํ ์์ฝ
- ์ฌ์ฉ์๊ฐ Fire ๋ฒํผ์ ๋๋ฅผ ์ ์ฆ, ์ด์ ์์ ๋ ์ ์ ํผ๊ฐ ๋ชจ๋ ์์ง ์ ์ ์ ์ฌ๋ผ์ ธ์ผ ํ๋ค.
- ์ด์ ์์ ๋ ์ด๊ตฌ์ ์ดํํธ๊ฐ ๋์์ผ ํ๊ณ , ์ด์ ๋ง์ ์ ์ ์ด์ ๋ง์๋ค๋ ํผ๊ฒฉ ํํฐํด์ ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค.
- ์ ์ ์ฌ์ฉ์์ ์๊ณผ ๋ค์ ๋๋ค์ ์์น์ ๋ฐฐ์น๋๋ค.
- ์ ์ ์ฒ์น ์์๋ ์ฌ์ฉ์์ Score(์ ์)๊ฐ 1์ฉ ์ฆ๊ฐํ์ฌ ์ฌ์ฉ์์ UI์ ํ์๋๋ค.
์ฌ๊ธฐ์ Enemy(์ )์ ๊ฐ๋ฐ์ด ์ ์งํ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด 3D Object์ธ Cube๋ฅผ ๋ง๋ค์ด Enemy๋ก ์ง์ ํด์ฃผ์๋ค.
์ 4๊ฐ์ง ๊ตฌํ์ ์ํด์ ์ด 4๊ฐ์ ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ๋ค.
PlayerInform.cs โ ํ๋ ์ด์ด์ ์ ๋ณด๋ฅผ ๋ด๋นํ๋ค.
HandGunFire.cs โ Fire ๋ฒํผ์ ๋๋ฅผ ์์ ์ด์ ์๊ณ , ์ ์ ํผ๊ฒฉํ๋์ง ์ ๋ฌด๋ฅผ ๋ด๋นํ๋ค.
CubeSpawn.cs & CubeBackSpawn.cs โ ์ฌ์ฉ์ ์ ๊ณผ ๋ค์ ๋๋ค ์์น์ Enemy(์ )์ด ์์ฑ๋๋ค.
EnemyCube.cs โ Cube์ ์ํ ์ฆ, ์ ์ ํ์ฌ ์ํ๋ฅผ ๋ด๋นํ๋ค.
AR ํ๊ฒฝ์์ ์ด์ ๋ฐ์ฌ
public class HandGunFire : MonoBehaviour
{
public Camera fpsCamera; // ํ๋ ์ด์ด๊ฐ ์กฐ์คํ๋ ์์น๋ฅผ ๊ฒฐ์
public float range = 100f; // ๊ด์ ์ด ์ผ๋ง๋ ํฌ์ฌ๋๋์ง ๊ฒฐ์ , ๋ฌด๊ธฐ์ ๋ฒ์๋ก ๋ณผ ์ ์๋ค.
public float damage = 10f; //์ ์๊ฒ ์ฃผ๋ ํผํด๋
public float impactForce = 60f; // Raycast๊ฐ Rigidbody ์์๊ฐ ๋ถ์ฐฉ๋ ๊ฐ์ฒด์ ๊ต์ฐจํ๋ ๊ฒฝ์ฐ ์ ์๋๋ ์๋งํผ ํ์ ๊ฐํ๋ค.
public AudioSource gunsound; // ์ด๊ธฐ ์ฌ์ด๋(๊ถ์ด)
public ParticleSystem muzzleFlash; // ์ด๊ตฌ ์ดํํธ ํํฐํด
public GameObject impactEffect; // ์ ํผ๊ฒฉ ํํฐํด (ํํ, ์ด์์ด ๋ฐํ ์๊ตญ ๋ฑ)
//๋ฆฌํฉํ ๋ง ์งํ
public void shoot()
{
RaycastHit hit; // ๋ ์ด์์ ๋ฐํ๋ ์ ๋ณด๋ฅผ ๋ณด์ ํ๋ ๋ณ์
if (Physics.Raycast(fpsCamera.transform.position, fpsCamera.transform.forward, out hit, range))
{ // ์ฝ๋ผ์ด๋๋ฅผ ๊ฐ์ง ์ค๋ธ์ ํธ์ ์ถฉ๋ ์ฌ๋ถ๋ฅผ ์ฒดํฌํฉ๋๋ค. ์ถฉ๋์ด ๋๋ฉด True๋ฅผ ๋ฐํํ๊ณ , RaycastHit๋ก ์ถฉ๋์ ๋ณด๋ฅผ ๋๊ฒจ์ค.
EnemyCube enemy = hit.transform.GetComponent<EnemyCube>(); // ์ถฉ๋์ ๊ฐ์งํ ์ถฉ๋์ฒด์์ EnemyCube์ ๋ํ ์ปดํฌ๋ํธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
if (enemy != null) // ์ ์ด ๋ง์ฝ ์กด์ฌํ๋ค๋ฉด
{
Instantiate(impactEffect, hit.point, Quaternion.identity); // ์ด์ ์ ๊ทธ ์์น์ ํผ๊ฒฉ ํํฐํด ์์ฑ
enemy.getdamage(damage); // enemy์๊ฒ ํผํด๋์ ์
ํ๋ค.
}
if (hit.rigidbody != null) // RayCast๋ก ์ ์คํ ๊ฒ์ ์ค๋ธ์ ํธ์ Rigidbody ๊ตฌ์ฑ์์๊ฐ ์๋ค๋ฉด
{
hit.rigidbody.AddForce(-hit.normal * impactForce); // AddForce(๋ฐฉํฅ * ํ ๊ฐ)
}
}
gunsound.Play(); // ์ด๊ธฐ์ฌ์ด๋ ์ฌ์
StartCoroutine("OnMuzzleFlashEffect"); // ์ด๊ตฌ ์ดํํธ ์ฌ์
}
public IEnumerator OnMuzzleFlashEffect()
{
muzzleFlash.Play();
yield return new WaitForSeconds(0.2f); // play ์คํ ํ 0.2์ด ๋๊ธฐ
muzzleFlash.Stop();
}
}
ํด๋น ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ๋จผ์ , RayCast(๋ ์ด ์บ์คํธ)์ ๋ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
RayCast์ ๋ํ ๋ด์ฉ์ ๊ตฌ๊ธ์ ๊ฒ์ํด๋ณด์๋ฉด ๋ง์ ์ ๋ณด๊ฐ ๋์ ์์ผ๋ฏ๋ก ์งง๊ฒ ์ค๋ช ํ๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.

Physics.Raycast() ๋ ์์์ (origin)๊ณผ ๋ฐฉํฅ(direction)์ผ๋ก ๋ ์ด๋ฅผ ์๋ ํจ์์ ๋๋ค. ์ฆ, ์์์ ๊ณผ ๋ฐฉํฅ์ผ๋ก ๋ชจ๋ ์ถฉ๋์ฒด์ ๋ํด ๋ ์ด๋ฅผ ์๊ฒ๋๊ณ , ์ถฉ๋์ด ๋๋ฉด True๋ก ๋ฐํํ๊ฒ ๋๋ฉด์ ์ด์ด์ RaycastHit๋ก ์ถฉ๋์ ๋ณด๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ๋ฉ๋๋ค.

Physics.Raycast() ํจ์์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ (origin) ์์์ ์ ๋๋ค. ์ฆ, ๊ด์ ์ด ์์๋๋ ์ง์ ์ด ๋ฉ๋๋ค.
ํ๋ ์ด์ด๊ฐ ์กฐ์คํ๋ ์์น๋ฅผ ๋ด๊ณ ์๋ ๋ณ์ fpsCamera๋ฅผ ์ด์ฉํ์ฌ ๊ทธ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๋๊ฒ ํด์ค๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก (direction) ๋ฐฉํฅ๋ ํ๋ ์ด์ด์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฉํฅ์ ์ง์ ํด์ค๋๋ค.
out hit๋ ์ถฉ๋ํ ๊ฐ์ฒด์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
range๋ ๊ด์ , ์ฆ Ray๋ฅผ ๋ฐ์ฌํ๋ ๊ฑฐ๋ฆฌ, ๋ฒ์๊ฐ ๋ฉ๋๋ค.
https://learn.unity.com/tutorial/let-s-try-shooting-with-raycasts#5c7f8528edbc2a002053b469
Let's Try: Shooting with Raycasts - Unity Learn
In this Let's Try tutorial we will learn how to shoot using Raycasts. This tutorial provides both a video walkthrough and and article version of the instructions.
learn.unity.com
โป ๊ตฌํํ๊ธฐ ์ํด ์ฐธ๊ณ ํ ์ฌ์ดํธ์ ๋๋ค. ์์ด๊ฐ ํ๋์๋ฉด ํ๊ตญ์ด๋ก ๋ฒ์ญํ๊ณ ๋ณด์ ๋ ๋์์ ๋ง์ด ๋ฐ์ ์ ์์ต๋๋ค.

๋ฐ๋์, AR Camera ์์์ผ๋ก ์์ ์ ๋ฃ์ด์ฃผ์ ์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ง์ด๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ์์ ์ด ๊ฐ์ด ์์ง์ด์ง ์๊ณ , ๊ณ ์ ๋ ์์น์ ๋จธ๋ฌด๋ฅด๊ฒ ๋๋ ํ์์ ๊ฒช๊ฒ ๋ฉ๋๋ค.

๋ค์์ HandGun ์ธ์คํํฐ ๋ชจ์ต์ ๋๋ค. Fps Camera ์ฆ, ํ๋ ์ด์ด์ ์์น๋ฅผ ๋ด๋นํ๋ ๋ณ์์ AR Camera๋ฅผ ๋ฃ์ด์ค์๋ค.

์ ์ฌ์ง์ ๊ตฌํํ ๊ฒ์ UI์์ ์ฌ์ฉํ ์ค๋ธ์ ํธ๋ค ๋ชจ์ต์ ๋๋ค. ํ์ฌ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๊ธ์จ๊ฐ ํ๋ฆฌ๊ฒ ๊ตฌ๋ถ๋์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ Fire Panel ์์ ์๋ Fire Button ์ ๋๋ค.

Fire Button์ ์ธ์คํํฐ ๋ชจ์ต์ ๋๋ค. Fire Button์ ํด๋ฆญํ ๋๋ง๋ค HandGunFire ํด๋์ค ์์ shoot()ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋ค๋ ์๋ฏธ๋ก ์ดํดํ์๋ฉด ๋ฉ๋๋ค.

Fire ๋ฒํผ์ ๋๋ฅผ ๋ ์ ์ฌ์ง์ฒ๋ผ ์ ์ ๋ช ์คํ ๋ ํํ ํํฐํด์ด ์๊ธฐ๋ฉด์ HandGunFire ์ปดํฌ๋ํธ๊ฐ ์ ๋์ํ๋ ๋ชจ์ต์ ์ ์ ์์ต๋๋ค.
โ ํ๋ก์ ํธ์ ์ด๊ธฐ ๊ด๋ จ ๋ชจ๋ ์์ ์ ์๋ ์ฌ์ดํธ์์ ์ ๊ณตํ ๋ฌด๋ฃ ์ ๋ํฐ ์์ ์ ์ฌ์ฉํ์์ต๋๋ค. https://assetstore.unity.com/packages/3d/props/guns/guns-pack-low-poly-guns-collection-192553