VR์ด๋
- ๊ฐ์ํ์ค์ ์ค์ ๊ฐ ์๋์ง๋ง ์ค์ ์ ๊ฐ์ด ์ธ๊ณต์ผ๋ก ๋ง๋ ํ์ค
- ์ค์ ๋ ์๋์ง๋ง ์ฌ์ฉ์์๊ฒ ์ค์ ์ ๊ฐ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ผ๋ก ๊ธฐ์ ์ ๋ฐ์ ์ ๋ฐ๋ผ ์ ์ ๋ ์ฌ์ค์ ์ธ ๊ฒฝํ์ ์ถ๊ตฌ
VR์ ํน์ง
- ์์จ์ฑ
- ์ํธ์์ฉ์ฑ
- ํ์กด๊ฐ
VR์ ํต์ฌ
- ๊ฐ์์ธ๊ณ
- ์ํธ์์ฉ
- ๋ชฐ์ ๊ฐ
VR์ ์ ์ฒด ํจ๊ณผ
- ๊ณต๊ฐ๊ฐ๊ฐ (์ผ์ชฝ์ค๋ฅธ์ชฝ ์์ผ ๋ค๋ฅด๋ค)
- ์๊ทผ๊ฐ
- ๊ฑฐ๋ฆฌ๊ฐ
AR์ ์
- ์ค์ ์ ๊ฐ์์ ๊ฒฐํฉ
- ์ค์๊ฐ ์ํธ์์ฉ
- \*3D๋ก ํ์)
AR ์ด๋
- ์ฆ๊ฐํ์ค์ด๋ ํ์ฅ๋ ํ์ค๋ก 100% ๋ฏธ๋ฆฌ ์ ์๋ ํ๊ฒฝ์์ ํ๋ ์ดํ๋ ๊ฐ์ํ์ค ์ฝํ ์ธ ์ ๋ฌ๋ฆฌ,
๋์์ ์๋ ํ์ค์ธ๊ณ ์์ ์ค์๊ฐ์ผ๋ก ์ฝํ ์ธ ์ ์์๊ฐ ๋ง๋ ๊ฐ์์์๋ฅผ ๊ฒฐํจํ์ฌ ๋ณด๋ค ํ์ค๊ฐ ๋์น๋ ์ฝํ ์ธ
Meterial
albedo : ์๋ฒ ๋ ํ๋ผ๋ฏธํฐ๋ ํ๋ฉด์ ๊ธฐ๋ณธ ์์์ ์ ์ดํ๋ค
nomarl map : ์ค์ ๊ธฐํํ์ผ๋ก ํํ๋๋ ๊ฒ์ฒ๋ผ ๋น์ ํฌ์ฐฉํ๋ ๋ฒํ ๋งต์ผ๋ก ์ฃผ๋ฆ ๋ฐ ์คํฌ๋์น์ ๊ฐ์ ํ๋ฉด ์ธ๋ถ ์ฌํญ์ ๋ชจ๋ธ์ ์ถ๊ฐํ ์ ์๋ ํน๋ณํ ์ข ๋ฅ์ ํ ์ค์ณ
motallic : ๊ธ์ ์ํฌํ๋ก(๋ฐ์ฌ ์ํฌํ๋ก์ ๋ฐ๋)์์ ์ง์ ํ ๋ ํ๋ฉด์ ๋ฐ์ฌ๋ ๋ฐ ๋น์๋ต์ ๊ธ์ ์์ค ๋ฐ Smoothness ์์ค์ ์ํด ์์ ๋๋ค
roughness : ๊ฑฐ์ง๊ธฐ ์ ๋๋ก ๋งค๋๋ฌ์ฐ๋ฉด ๊ฑฐ์ธ์ฒ๋ผ ๋ฐ์ฌํ์ง๋ง, ๊ฑฐ์ง์ ๋๊ฐ ๋์์ง๋ฉด ๋ฐ์ฌ๋ฅผ ใฑ์ ํ์ง ์๋๋ค
height : 0~1 ์ฌ์ด ํ๋ฐฑ ๊ฐ๋ค์ ์ด์ฉํด mesh์ ๋๋ฎ์ด๊ฐ ์์ด ๋ณด์ด๊ฒ ํํํ๋ค. ์๋ ์ ์ผ ๋น ๋ฆ
์์ ๋ Dof
๋ ๋ฆฝ์ ์ผ๋ก ๋ฌ๋ผ์ง ์ ์๋ ๋งค๊ฐ๋ณ์๋ก VR HMD ๋ 3DoF 6DoF
HMD
- NST(Non-See-Through) Display - ํ์ค์ ์ธ๋ถ์ ๋ณด๊ฐ ๋ณด์ด์ง ์๋๋ค
- OST(Optical See-Through) Display - ํ์ค์ ์ ๋ณด์ ๊ฐ์ด ๊ฐ์์ธ๊ณ ์ ๋ณด๋ ๋ณด์ฌ์ค๋ค
3DoF > ํ์ ๋ง ๋๋ค.
- ๊ต์ ์์ธ์์ ๋จธ๋ฆฌ ํ์ ๋ง ์ธ์ํ๋ค ⇒ ๋กํ ์ด์ ํธ๋ํน(Rotation Tracking)
- ๊ณ ๊ฐ๋ฅผ ๋๋๊ฑฐ๋ฆฌ๋ ํ์ : X-axis ์ค์ฌ์ผ๋ก ํผ์น(pitch)
- ๊ณ ๊ฐ๋ฅผ ์ข์ฐ๋ก ํ์ : Y-axis ์ค์ฌ์ผ๋ก ์(yaw)
- ๊ณ ๊ฐ๋ฅผ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ผ๋ก ๊บพ์ด์ฃผ๋ ํ์ : Z-axis ์ค์ฌ์ผ๋ก ์(yaw)
6DoF > ์ขํ + ํ์ ๋ชจ๋ ๊ฐ๋ฅ
- ์๊ณผ ๋ค, ์์ผ๋ก๋ ์ด๋์ ์ถ๊ฐ์ ์ผ๋ก ์ธ์ํ๋ฏ๋ก ํฌ์ง์ ๋ ํธ๋ํน(Positional Tracking
- ์ข์ฐ ์ด๋ : X-axis ์ค์ฌ์ผ๋ก ์ค์จ์ด(sway)
- ์์๋ ์ด๋ : Y-axis ์ค์ฌ์ผ๋ก ํ๋ธ(heave)
- ์๋ค ์ด๋ : Z-axis ์ค์ฌ์ผ๋ก ์ ์ง(surge)
1์ด๋ง๋ค ์๋ํ๋ ๋ฐฉ๋ฒ
float count = 0;
count += Time.deltaTime;
//ํ๋ง๋๋ก ํ ํ๋ ์์ ์งํํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ
- ์ ์ฉ) 5์ดํ์ “์๋”์ด๋ผ๋ ์ฝ์์ฐฝ์ ์กฐ๊ฑด๋ฌธ์ ํ์ฉํ์ฌ ๋์ค๋๋ก ํด ๋ณด์ธ์.
**if((int)count > 5)
{
count = 0f;
print("์๋");
}
else
{
count += Time.deltaTime;
// print(count);
// print((int)count);
}**
๋ง์ฐ์ค ์ ๋ ฅ ๋ฐ๊ธฐ (๋ง์ฐ์ค ํด๋ฆญ)
if (Input.GetMouseButtonDown(0))
{
print("๋ง์ฐ์ค๋ค์ด");
}
if (Input.GetMouseButtonUp(0))
{
print("๋ง์ฐ์ค์
");
}
//‘0’๋ ๋ง์ฐ์ค๋ฒํผ ์ค์ ์ผ์ชฝ ๋ฒํผ์ ๋๋ ๋์ง๋ฅผ ์ฐพ๋๊ฒ์ผ๋ก
//== true ๊ฐ ์๋ต๋์ด ์๋ค
- ์ ์ฉ) ํด๋ฆญํ๋ฉด ๋ฉ์ถ์ด ์๋ ์ด๋ฏธ์ง ์คํ๋ผ์ดํธ๋ฅผ ํ์ ์์ผ ๋ณธ๋ค. speed ๋ณ์๊ฐ 0์ด์๋ค๊ฐ ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ๋ฉด speed์ ๊ฐ์ ์ถ๊ฐ์์ผ ์ค๋ค. ๊ฐ์ํ๋ ์๋ฆฌ๋ 1๋ณด๋ค ์์ ์ค์๋ฅผ ๊ณฑํด์ค๋ค. speed *= 0.98f;
๋ง์ฐ์ค ์ ๋ ฅ ๋ฐ๊ธฐ (๋ง์ฐ์ค ์์น ๊ฐ)
์๋ ์์น = Input.mousePosition.x;
๋ง์ฐ์ค๋ฅผ ๋ผ์์ ๋์ ์์น = Input.mousePosition.x;
- ๋จผ์ ํ๋ฉด์ ํ์ํ ์ค๋ธ์ ํธ๋ฅผ ๋์ด์ํค๊ณ ๋ ํ์ ๊ฐ ์ค๋ธ์ ํธ์ ์์ง์ผ ์ ์๋ ์ปจํธ๋กค๋ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค.
- ์ฌ์ ์๋ก ๋ง๋ค์ด ๊ตฌ์ฑํ๋ฉด ํญ์ ์ ์ฅํ๋ ์ต๊ด์ ๊ฐ์ง๋๋ก ํ์. ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ ํ์ ๊ณต๊ธฐ์ด ์๋ ๋ฏ ๋ค๋ก ์ด๋ํ ์ขํ๊ฐ์ ๊ณ์ฐํ์ฌ ์ฐจ์ ์๋๋ฅผ ๋ณํ์ํจ๋ค. ์๋ ์์น์ ๋ง์ฐ์ค๋ฅผ ๋ผ์์ ๋์ ๊ฐ์ ๊ฐ๊ฐ ๋ฐ๋๋ค.
๋ง์ฐ์ค ์ ๋ ฅ ๋ฐ๊ธฐ
- ํฌํจ๋ ๊ฒ์์ค๋ธ์ ํธ๊ฐ ์๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ
- UI์ Text๋ฅผ ์ถ๊ฐํ๊ณ Text๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
~~ํ๋ฉด์ UI > Text๋ฅผ ์ถ๊ฐํ๋ค. ์ด๋ฆ์ ‘distance’์ผ๋ก ํ๋ค. GameObejct dis; dis = GameObjct.Find(“distance”); dis.GetComponent<Text>().text = “Game Stat!”; ๊น๋ฐ๊ณผ์ ๊ฑฐ๋ฆฌ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ค. GameObject flag; float length; flag = GameObjct.Find(“flag”); length =flag.transform.position.x - this.transform.position.x ; dis.GetComponent<Text>().text =length.ToString(”F2”) “m”;~~
- ์ค๋์ค ํ๋ ์ด ์ํค๊ธฐ
-
~~AudioSurce ์ปดํฌ๋ํธ๋ CD ํ๋ ์ด์ด์ ๊ฐ์ต๋๋ค. ์์์ด ๋๋ ์์ ํ์ผ์ ์ค์ ํด ๋๋ฉด ์์ ๋ด๊ฒ ํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๋ฅผ Audio - Audio Source ๋ฃฐ ์ถ๊ฐํ๋ค. ์ฒ์๋ถํฐ ํ๋ ์ด ๋์ง ์๋๋ก๊ณ Play On Awake ์ฒดํฌ๋ฅผ ํ์ด์ค๋ค. GetComponent<AudioSource>().Play();~~
//carController.cs
float speed;
float startPos;
float endPos;
void Update()
{
if (Input.GetMouseButtonDown(0)) //๋ง์ฐ์ค๋ค์ด
{
this.startPos = Input.mousePosition.x;
// this.speed = 2f * Time.deltaTime;
}
if (Input.GetMouseButtonUp(0))//๋ง์ฐ์ค์
{
this.endPos = Input.mousePosition.x;
float sLength = (endPos - this.startPos)/500;
print(sLength);
if (sLength > 0) {
this.speed = sLength;
GetComponent<AudioSource>().Play();
}
}
this.transform.Translate(speed, 0f, 0f); //์ด๋
this.speed *= 0.98f;
}
//gameController.cs
using UnityEngine.UI;
GameObject car;
GameObject textUI;
GameObject flag;
void Start()
{
this.car = GameObject.Find("Car");
this.textUI = GameObject.Find("distance");
this.flag = GameObject.Find("Flag");
}
void Update()
{
float length = (this.car.transform.position.x - this.flag.transform.position.x).magnitude;
// magitude .๋ฒกํฐ ๊ณ์ฐ?
print(length);
if (length > 0)
{
this.textUI.GetComponent<Text>().text = length.ToString("F2") + "m";
}
}
- ๋ฉ์์ง์ ๋ธ๋ก๋์บ์คํ
**MonoBehaviour**๋ ๋ฌด์์ธ๊ฐ?
์ ๋ํฐ์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ MonoBehaviour ํด๋์ค๋ฅผ ์์ํ๋ค.
MonoBehaviour ํด๋์ค๋ ์ ๋ํฐ์์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ์ ๊ณตํ๋ ํด๋์ค์ด๋ฉฐ ์ปดํฌ๋ํธ์ ํ์ํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ฆ MonoBehaviour ๋ฅผ ์์ํด์ ๋ง๋ ์ปดํฌ๋ํธ๋ ์ ๋ํฐ์ ์ ์ด๋ฅผ ๋ฐ๊ฒ ๋๋ค.
์ปดํฌ๋ํธ ํจํด์์ ์ปดํฌ๋ํธ๋ค์ ์๋ก ๊ด์ฌ์ด ์๋ค.
๋ฐ๋ผ์ ๊ฒ์ ์ค๋ธ์ ํธ์ ์ถ๊ฐ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ‘์ผ๋ถ๋ฌ ์ฐพ์๋ด๊ธฐ’ ์ ์๋ ์ ์ ์๋ค. ์ ๋ํฐ์์๋ ์ด๋ค ๊ธฐ๋ฅ์ ์คํ์ํค๊ณ ์ถ์ ๋
‘๋น์ฌ์๋ฅผ ์ง์ ์ฐพ์๊ฐ๋’๋ฐฉ๋ฒ๋ณด๋ค๋ ๋ฉ์์ง๋ฅผ ๋ ๋ฆฌ๋ ๋ฐฉ์๋ฅผ ์ฌ์ฉํ๋ค.
์ฆ, ๋ฐ๋ ์ํค๊ณ ์ถ์ ๊ธฐ๋ฅ์ ์ด๋ฆ์ ๋ด์ ๊ฒ์ ์๋์ ๋ฉ์์ง๋ฅผ ๋ฟ๋ฆฌ๋ฉด, ๊ฒ์ ์๋์ ์ค๋ธ์ ํธ๊ฐ ๋ชจ๋ ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ,
๋ฉ์์ง๋ฅผ ๋ฐ์ ์ค๋ธ์ ํธ๊ฐ ๋ฉ์์ง์์ ๋ช
์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ํด๋น ๊ธฐ๋ฅ์ ์คํํ๋ ๋ฐฉ์์ด๋ค.
์ด๋ ๋ฉ์์ง๋ ๋๊ฐ ๋ณด๋ธ์ง๋ฅผ ์ ๊ฒฝ์ฐ์ง ์๊ธฐ๋๋ฌธ์ ์ปดํฌ๋ํธ๋ ๋
๋ฆฝ์ฑ์ ์ ์งํ ์ ์๋ค.
์ด๋ฐ์์ **๋ฌด์ฐจ๋ณ์ ๋ฉ์์ง ์ ๋ฌ ๋ฐฉ์์‘๋ธ๋ก๋์บ์คํ
’์ด๋ผ๊ณ ํ๋ค.**
**์ด ๋ธ๋ก๋์บ์คํ
์ ์์ผ๋ก ์ฌ์ฉํ ‘์ ๋ํฐ ์ด๋ฒคํธ ๋ฉ์๋’๊ฐ ๋์ํ๋ ์๋ฆฌ์ด๋ค**
- using
์ ๋ํฐ์์ ์๋ก์ด ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ฉด
์คํฌ๋ฆฝํธ ์๋จ์ using ๋ค์์คํ์ด์ค๋ก ํด๋น ๋ค์ ์คํ์ด์ค์ ๋ค์ด์๋ ์ฝ๋๋ฅผ ํ์ฌ ์คํฌ๋ฆฝํธ์ ๋ถ๋ฌ์จ๋ค.
Debug.Log(“Hello World!”);
์ Debug๋ UnityEngine ์ฌ์ฉํ ๊ฒ์ด๋ค.
- ๋ฉ์๋ (์ธ์ )๋ณ 5๊ฐ
**Awake()
-์คํฌ๋ฆฝํธ ์คํ ์ ํ ๋ฒ๋ง ํธ์ถ๋๋ ํจ์๋ก Start ํจ์ ํธ์ถ ์ ํธ์ถ๋๋ค.
๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์๋ํ๊ธฐ ์ ์ ํธ์ถํ ๊ฒ์ด ํ์ํ ๋ ์ฌ์ฉ, ๋นํ์ฑํ๊ฐ ๋์ด๋ ํ์ฑํ๊ฐ ๋๋ค.
Start() [๊ธฐ๋ณธ ํจ์] -> ์๋์ด๋
ธ setup ๋๋์ ํจ์
- Update ํจ์๋ฅผ ํธ์ถ ์ ์ ํ ๋ฒ๋ง ํธ์ถํ๋ ํจ์
Update() [๊ธฐ๋ณธ ํจ์] -> ์๋์ด๋
ธ loop ๋๋์ ํจ์
- 1ํ๋ ์๋ง๋ค ๊ณ์ ์คํํ๋ค. ์๊ฐ ๊ฐ๊ฒฉ์ด ์ผ์ ํ์ง ์๋ค. ์ปดํจํฐ ์ฌ์์ด๋ ๊ทธ๋์ ์ฒ๋ฆฌ ์๋์ ๋ฐ๋ผ ๋ณํํ๋ค.
LateUpdate()
- ๋ชจ๋ Updateํจ์๊ฐ ํธ์ถ ๋ ํ์ ํธ์ถ๋๋ค. ํน์ ์ค๋ธ์ ํธ ๊ฒฐ๊ณผ๋ก ๋ณด์ฌ์ค ๋(์นด๋ฉ๋ผ ๋ฐ๋ผ๊ฐ๋)
FixedUpdate()
- ๋ฌผ๋ฆฌ์์ง์ ์๋ฎฌ๋ ์ด์
๊ณ์ฐ ์ฃผ๊ธฐ๋ก ๊ธฐ๋ณธ๊ฐ์ 0.02์ด (30fps)๋ง๋ค ํธ์ถํ๋ ํจ์๋ก 1์ด์ 50ํ๋ ์์ผ๋ก ๊ฑฐ์ ์ ํด์ ธ ์๋ค
OnEnable()
- ๊ฒ์์ค๋ธ์ ํธ ๋๋ ์คํฌ๋ฆฝํธ ํ์ฑํ ์ ํธ์ถ(์ ๊ตฐ์ด ์ฃฝ์ ๋)
OnDisable()
- ๊ฒ์์ค๋ธ์ ํธ ๋๋ ์คํฌ๋ฆฝํธ ๋น ํ์ฑํ ์ ํธ์ถ(์ ๊ตฐ์ด ์ฃฝ์ ํ์ ์ปจํธ๋กค)**
**using System;
void Awake()
{
print("๋ฉ์๋ ์ค ๊ฐ์ฅ ๋จผ์ ํธ์ถ" + DateTime.Now.ToString());
}
void Start()
{
print("๋ฉ์๋ ์ค ์ธ์ํ์ฌ ์๋์ ์์ํ ๋ ํ๋ฒ ํธ์ถ" + DateTime.Now.ToString());
}
void Update()
{
print("๋งค ํ๋ ์ ํธ์ถ" + DateTime.Now.ToString());
}
void FixedUpdate()
{
print("๊ณ ์ ํ๋ ์ ํ์ค ํธ์ถ(Rigidbody ์ปดํฌ๋ํธ์ผ ๋ ์ถ์ฒ)" + DateTime.Now.ToString());
}
1) 'Edit -> Project Settings -> Time'์ ์ ํ ํ 'InsPector'์์ 'Fixed Timestep'๊ฐ์ '0.01666667'๋ก ํ๋ฉด 60ํ๋ ์์ผ๋ก ๊ณ ์ .(30ํ๋ ์์
'0.03333333'๋ก ํ๋ฉด๋จ.) 0.02๋ 50ํ๋ ์
๋จ 'void Update ()'๋์ 'void FixedUpdate ()'๋ฅผ ์ฌ์ฉํด์ผ ํจ.
2) 'void Start ()'๋๋ 'void Awake ()' ๊ฐ์ด ์์์ ํ๋ฒ ์๋ํ๋ ํจ์์์ 'Time.captureFramerate = 60;'๋ฅผ ์ ์ผ๋ฉด ๋์คํ๋ ์ด๋๋
ํ๋ ์์ด ๊ฐ์ ๋ก 60ํ๋ ์์ผ๋ก ๋ณ๊ฒฝ.(30์ ์ ์ผ๋ฉด 30ํ๋ ์์ด ๋จ.)**
- ๊ณต๊ฐ์ด๋
3D ๊ณต๊ฐ์ ๋ฐฐ์นํ๋ 3D ์ค๋ธ์ ํธ๋ ์์น๋ฅผ ํํํ ๊ฐ, ์ฆ ์ขํ๋ฅผ ๊ฐ์ง๋ค. ์ขํ๋ฅผ ์ธก์ ํ ๊ธฐ์ค์ด ๋ ์์ ์ ์์น x,y,z์ถ ๋ฐฉํฅ์ ์ค์ ํ์ฌ ๋ฌผ์ฒด๊ฐ ์ด๋์ ๋ฐฐ์น๋์ด ์๋์ง ํํํ๋ ๊ธฐ์ค๊ณผ ์ฒด๊ณ๋ฅผ ์ขํ๊ณ(coordinate system)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ขํ๊ณ๋ ๊ณต๊ฐ์์ ‘์ด๋ค ๋ฐฉํฅ์ผ๋ก’ ์ผ๋ง๋งํผ ์ด๋ํ ๊ฑฐ๋ฆฌ์ ๋ฐฐ์นํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ด๋ค. ์ฆ ์ฌ ์ฐฝ์ ํํ๋๋ ํํ ์ด๋ ํ์ ํ์ดํ๊ฐ ์ขํ๊ณ๋ฅผ ํํํ ๊ฒ์ด๋ค.
- ๋ฒกํฐ
์ค๋ธ์ ํธ์ ์์น๋ ๋ฐฉํฅ ์ขํ๋ ๊ฐ ์ถ๋ง๋ค์ ๋ค๋ฅธ ๊ฐ์ ํ๋์ ๋ฉ์ด๋ฆฌ๋ก ๋ฌถ์ด ๋์ ๋ณ์๋ก ์ฝ๊ณ ์ด๋ค. ์ด๋ฐ ๋ณ์์ ์๋ฃํ์ด ๋ฒกํฐ์ด๋ค. ์ ๋ํฐ ์์์ ์์น, ํ์ , ํฌ๊ธฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์ ํ์ํ ๋ฐ์ดํฐ ํ์ ์ด๋ค. Vector3 (3D) : float 3๊ฐ์ง์ x, y, z ์ ๋ฐ์ดํฐ ํ์ ์ด๋ค. Vector2 (2D) : float 2๊ฐ์ง์ x, y์ ๋ฐ์ดํฐ ํ์ ๋๋ค. ๋ฒกํฐ ๋ณ์๋ ‘๋ฐฉํฅ’๊ณผ ‘ํฌ๊ธฐ’๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐฉํฅ๊ณผ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ ๋ง์ , ๋บ์ , ์ค์นผ๋ผ ๊ณฑ ๋ฑ์ ์ํด ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค
**Vector3 tmp = new Vector3(10, 10, 10); ๋๋ Vector3 tmp;
void Start()
{
tmp = new Vector3(10, 10, 10);
transform.position = tmp;
}**
- ๋ฒกํฐ ์ฐ์ฐ๋ฒ
- ๋ฒกํฐ + ๋ฒกํฐ
๋ฒกํฐ์ ๋ฒกํฐ๋ฅผ ๋ํ๋ฉด ๋ฒกํฐ๋ ํ์ด๊ธฐ์ ๋ ํ์ด ๋์์ ์์ฉํ ๊ฒฐ๊ณผ๋ก ๋ํ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฒกํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ง์ ์์ ๋ถํฐ ๋ ๋ฒ์งธ ๋ฒกํฐ๋ฅผ ์ฐ๊ฒฐํด์ ๋ ๋ฒกํฐ๋ฅผ ์ฐ๊ฒฐํ ๊ฒฐ๊ณผ ๋๋ฌํ๋ ์์น๋ฅผ ์์์ ์์ ์ ์ผ๋ก ์ฐ๊ฒฐํ ๋ชจ์ต์ด ๋๋ ๊ฒ์ด ๋ค. ๋ฒกํฐA ๋ (1,0)์ด๊ณ ๋ฒกํฐB๋ (0,1)์ผ ๋ ํฉ์ ((1+0), (0+1)) = (1,1)
- ๋ฒกํฐ - ๋ฒกํฐ
๋ฒกํฐ B+ ๋ฒกํฐ(-A) ๋ผ๊ณ ๋ณผ ์ ์๋ค. -A๋ฒกํฐ๋ ์๋์ A ๋ฒกํฐ๋ฅผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋ค์ง๋ ํํ์ด๋ค. ๋ฒกํฐA ๋ (1,0)์ด๊ณ ๋ฒกํฐB๋ (0,1)์ผ ๋ ๋ฒกํฐB ๋นผ๊ธฐ ๋ฒกํฐA์ด๋ฏ๋ก ((0-1), (1-0)) = (-1,1) ์ด๋ ๋ฒกํฐB ๋ฐฉํฅ์ผ๋ก ๋ฐฉํฅ์ด ๊ทธ๋ ค์ง๊ธฐ์ ๋ฒกํฐ์ ๋บ์ ์ ๋์ ์์น์์ ์๋๋ฐฉ์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๊ตฌํ ๋ ๋ง์ด ์ฌ์ฉํ๋ค
- ์ ๋์์น, ์๋์์น
๋ฒกํฐ๋ ๋ฐฉํฅ๊ณผ ๊ธธ์ด(ํฌ๊ธฐ)์ ๊ฐ์ง๋ค. ์ด๊ฒ์ ํ์ดํ์ ๋ฐฉํฅ๊ณผ ๊ธธ์ด๋ก ๋น์ ํ ์ ์๋ค. ๋ฐ๋ผ์ (1,1)์ด๋ผ๋ฉด ๋ ๊ฐ์ง ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ์๋ ์ขํ : (๋ด๊ฐ ์ด๋์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง) ํ์ฌ ์ขํ์์ (1, 1)๋งํผ ๋ ๊ฐ๋ ค๊ณ ํ๋ค.
- ์ ๋ ์ขํ : ๊ฒ์ธ ์ธ์ ์์์ ๋์ ์ขํ๊ฐ (1, 1)์ด๋ค.
์๋ ์ขํ๋ ๋ฒกํฐ์ ๊ฐ์ ์ค์ง ํ์ดํ์ ๋ฐฉํฅ๊ณผ ํ์ดํ์ ๊ธธ์ด๋ง ํํํ ๊ฒ์ด๋ค. ๋จ, ํ์ดํ์ ์์์ ์ด ์์ (0,0)์ด๋ผ๋ ํน์ํ ์ ์ ๋ฅผ ๊ฐ์ ํ๋ฉด ๋ ๋ฒ์งธ ์๋ฏธ๋ก ํด์ํ ์ ์๋ค. ์ฆ ๋ฒกํฐ๋ ์ ๋์ ์ธ ์ขํ์ ์๋์ ์ธ ๋ฐฉํฅ๊ณผ ํฌ๊ธฐ(๊ธธ์ด)๋ฅผ ๋ํ๋ผ ์ ์๋ค.
Vector2 a = new Vector2(x, y);
Vector3 b = new Vector3(x, y, z);
Vector4 c = new Vector4(x, y, z, w);
Vector2 ๋ 2์ฐจ์์ผ๋ก ์ข์ฐ ์ถ๊ณผ ์ํ ์ถ์ ๋ ๊ฐ์ง๊ฐ ์๋ค๋ ๋ป์ด๋ค.
Vector3 ๋ 3์ฐจ์์ผ๋ก ์์ ๋ ์ถ์ ์ ํ ์ถ์ด ์ถ๊ฐ ๋ ๊ฒ์ด๋ค.
- ์ ๋ ์ขํ ์ด๋
**โ transform.position
transform.position = new Vector3(0.0f, 0.0f, 0.0f); //์์น
์ ๋์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ํฉ๋๋ค.
โก transform.rotation
transform.rotation = Quaternion.Euler(0.0f, 0.0f, 0.0f); //๊ฐ๋
์ ๋์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ ์ํด
โข transform.localScale
transform.localScale = new Vector3(0.0f, 0.0f, 0.0f) // ํฌ๊ธฐ**
- ๋ฒกํฐ๋ฅผ ํ์ฉํ์ฌ ์์น ๋ณ๊ฒฝ
Vector3 tmp;
Vector3 plusPos = new Vector3(2,2,2);
Vector3 minusPos = new Vector3(3, 3, 3);
Vector3 newPos;
void Start()
{
tmp = new Vector3(2, 0, 2);
transform.position = tmp;
//newPos = tmp + plusPos;
newPos = minusPos - tmp;
transform.position = newPos;
}
- ์๋์ ์ขํ๋ก ์ด๋
**โ transform.Translate()
this.transform.Translate(new Vector3(0.0f, 0.0f, 0.0f));
this.transform.Translate(0.0f, 0.0f, 0.0f);
์๋์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์น์ํด(๋งค ํ๋ ์๋ง๋ค ๊ฐ๋งํผ ์ด๋)
โก transform.Rotate()
transform.Rotate(0.0f, 0.0f, 0.0f);
์๋์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ ์ํด(๋งค ํ๋ ์๋ง๋ค ๊ฐ๋ง ํผ ํ์ )**
- ๋ฒกํฐ * ์ค์นผ๋ผ, ๋ฒกํฐ / ์ค์นผ๋ผ
๋ฒกํฐ์ ๋ชธํต ๊ธธ์ด๋ ํ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค. ๋ฐฉํฅ์ ๋ณํ ์์ด ํ์ ํฌ๊ธฐ๋ง ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ๋ ๋ฒกํฐ์ ํ์ ๋ณํ๋ ๋งํผ
‘์ค์นผ๋ผ ๊ฐ’์ ๊ณฑํ๊ฑฐ๋ ๋๋๋ฉด ๋๋ค. ๋ฒกํฐ์ ์ค์นผ๋ผ ๊ณฑํ๋ฉด (-3,4) * 2 = (-32, 42) = (-6, 8)
๋ฒกํฐ์ ๋ชธํต ๊ธธ์ด๋ ํ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค.
๋ฐฉํฅ์ ๋ณํ์์ด ํ์ ํฌ๊ธฐ๋ง ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ๋
๋ฒกํฐ์ ํ์ ๋ณํ๋๋งํผ ‘์ค์นผ๋ผ ๊ฐ’์ ๊ณฑํ๊ฑฐ๋ ๋๋๋ฉด ๋๋ค.
๋ฒกํฐ์ ์ค์นผ๋ผ ๊ณฑ์ ํ๋ฉด
(-3,4) * 2 = (-3*2, 4*2) = (-6, 8)
- ์ค์นผ๋ผ๋ก ์์น ์ด๋
float speed = 0.02f;
Vector3 varPose = new Vector3(1,0,0);
void Update()
{
transform.Translate(speed, 0, 0); //speed(0.02f) ์๋๋ก x์ขํ๋ง! ์ด๋ํ๋ค.
//transform.Translate(varPose * speed); ์ด๋์ ํ๋ค.
}
// ์ผ์ ํ ์๊ฐ์ผ๋ก ์ด๋
float speed = 2f; // ์๋
Vector3 varPose = new Vector3(1,0,0); //๋ฐฉํฅ
void Update()
{
transform.Translate(varPose * speed * Time.deltaTime);
}
- ๋ฒกํฐ์ ํฌ๊ธฐ(๊ธธ์ด)
2D ๋ฒกํฐ (-3, 4)์ด ์๋ค. (-3, 4)์ ๋ฐฉํฅ์ ์ (-3, 4)๋ก ํฅํ๋ ํ์ดํ์ ๋ฐฉํฅ์ด๋ค. (-3, 4)์ ํฌ๊ธฐ๋ ํ์ดํ์ ๊ธธ์ด์ ํด ๋นํ๋ค. ํ์ดํ ๊ธธ์ด๋ ํ์ดํ๋ฅผ ๋น๋ณ์ผ๋ก ํ๋ ์ง๊ฐ์ผ๊ฐํ์ ๊ทธ๋ฆฐ ๋ค ํผํ๊ณ ๋ผ์ค์ ์ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ ์ ์๋ค. (-3, 4)์ ํฌ๊ธฐ๋ ๋ฃจํธ (-3)์ ๊ณฑ + 4์ ๊ณฑ = 5 Vector3.magnitude; Vector3 a = new Vector3(3, 3, 3); float b = a.magnitude; // ๋๋ต 5.19...๊ฐ ๋๋ค. ๊ฒ์์์๋ ํ๋ ์ด์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ์์๋ด๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ๋ฒกํฐB์์ ๋ฒกํฐA์ ๊ฐ์ ๋นผ์ฃผ์ด ๋ ํ๋์ ๋ฒกํฐ๊ฐ์ ๊ตฌํด์ค๋ค. (5,4) - (-4, -3) = (9, 7) ์ด๊ฒ์ ํผํ๊ณ ๋ผ์ค ์ ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ 9์ ์ ๊ณฑ + 7์ ์ ๊ณฑ = ๊ธธ์ด๊ฐ์ ์ ๊ณฑ์ด๋ฏ๋ก
81 + 49 = 130๋ฃจํธ 130์ ํ๋ฉด 11,40175425099138 ์ด๊ฒ์ c= B-A, c.magnitude ๋ผ๊ณ ๊ฐ๋จํ ๊ฒฐ๊ณผ๊ฐ์ ์๋ ค์ค๋ค.
์ C#Script ๋ก ๋ง๋ค๊ณ ์ด๋ฆ์ ‘magTest’
float speed = 2f;
// ๋ด์์ ์ด ์๋ ์์ง์ด๋ ๋ฐฉํฅ์ผ๋ก๋ง ์ฌ์ฉ
Vector3 varPose = new Vector3(1,0,0);
Vector3 myPose;
Vector3 parePose;
float magFloat;
void Start(){
myPose = transform.position;
}
void Update()
{
transform.Translate(varPose * speed * Time.deltaTime);
parePose = transform.position - myPose;
magFloat = parePose.magnitude;
Debug.Log(magFloat); = //print(magFloat);
if(magFloat > 10){
// ๋ ์ด๋๋ง์์ ๋ฒ์ด๋ฌ์ต๋๋ค.
}
}
//this ๊ฐ ์๋ต, gameObject
- ๋ฐฉํฅ ๋ฒกํฐ = ์ ๊ทํ๋ ๋ฒกํฐ(Normalized Vector)
๋ฐฉํฅ ๋ฒกํฐ๋ ํฌ๊ธฐ๊ฐ 1์ธ ๋ฒกํฐ๋ก ์ ๊ทํ๋ ๋ฒกํฐ(Normalized Vector)๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
ํฌ๊ธฐ๊ฐ 1์ด๋ฏ๋ก ๋ฐฉํฅ์ ๊ฐ์ง๋ง, ํฌ๊ธฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ฒกํฐ๋ฅผ ๋น๊ตํ๋ ๊ธฐ์ค์ผ๋ก ์ผ์ ์ ์๋ค. (1, -1)์ ๋ฐฉํฅ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด ๋ฒกํฐ์ ์์์ ์์ ๋ฐ์ง๋ฆ์ด 1์ธ ์์ ๊ทธ๋ ค์(1, -1)์ ์ ๋ฐ๊นฅ ๋ถ๋ถ์ ์๋ผ๋ธ๋ค. (๋ฐฉํฅ์ ์ ์งํ๋ฉด์) ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ 1๋ก ๋ง๋๋ ๊ฒ์ด ๋ฒกํฐ ์ ๊ทํ์ด๋ค.
์ ๊ธธ์ด๋ฅผ 1๋ก ๋ง๋๋ ๊ฒ์ผ๊น? ๋ฐฉํฅ์ ๊ฐ์ด ์๋์๋ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง (3, -3)์ด๋ผ๋ ํํ์ผ๋ก๋ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ์ผ๋ง๋งํผ์ ์๋ ฅ์๊ฐ์ง๋์ง ๋ ์ฌ๋ฆฌ๊ธฐ ํ๋ค๋ค. ์ด๋ (3, -3)์ ์์ํ ๋ฐฉํฅ๊ณผ ์์ํ ์๋ ฅ์ ๋๋์ด ํํํ๋ฉด ๋ฐฉํฅ๊ณผ ์๋๋ฅผ ํ์ ํ ์ ์๋ค. (3, -3) = ๋ฐฉํฅ * ์๋ ฅ ๋๋ ์ด๋๊ฑฐ๋ฆฌ ๋ฒกํฐ์ ์ค์นผ๋ผ ๊ณฑ์ ๋ฐฐ์ ๊ณ ๋๋ฌธ์ (3, -3)๋ (1, -1)์ 3๋ฐฐ์ ํด๋น๋๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง (3, -3)์๋ ฅ ์์ฒด๋ฅผ ํํํ์ง ๋ชปํ๋ค. ์๋ ฅ์ด 3์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. (1, -1)์ ํฌ๊ธฐ(magnitude)๋ 1.414… ์ด๊ธฐ๋๋ฌธ์ด๋ค. ‘A์ ๋ฐฉํฅ์ผ๋ก B๋งํผ์ ์๋ ฅ’์ ‘๋ฒกํฐA * ์ค์นผ๋ผB’๋ก ํํํ๊ธฐ ์ํด์๋ ๋ฒกํฐA๋ 1์ด ๋์ง ์์ผ๋ฉด ์ค์ ์๋ ฅ์ B๋ณด๋ค ํฌ๊ฑฐ๋ ์์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
๋ฐ๋ผ์ ๋ฐฉํฅ๋ฒกํฐ๋ ํฌ๊ธฐ๊ฐ 1์ธ ๋ฒกํฐ๋ก ์ฆ ์ ๊ทํ๋ ๋ฒกํฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๊ฒ์์์ ํ๋ ์ด์ด๊ฐ ์ ์ ์์น๋ฅผ ํ์ ํ๊ณ ์์น์ ๋ฒกํฐ ๊ฐ(๋ฒกํฐ C)์ ์๊ณ ์์ ๋ ๊ทธ์ ๋ง๋ ๊ฐ์ผ๋ก ๊ณ์ ์์ผ๋ก ๋์๊ฐ๋ค๋ฉด,
๋ฒกํฐC์ ๊ฐ์ ๋ฐ๋ผ ์ด๋ ๋๋ ๋นจ๋ผ์ง๊ธฐ๋ ๋๋ ๋๋ ค์ง๊ธฐ๋ ํ๋ค. ์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฒกํฐ์ ๊ธธ์ด๋ฅผ 1๋ก ์ ๊ทํํ๋ค.
- normailzed ์ ์ฉํ ๋น๊ต
float speed = 2f;
Vector3 varPose = new Vector3(1,1,1);
//์ด์ ์์น
Vector3 prePose;
Vector3 parePose;
float magFloat;
void Update()
{
prePose = transform.position;
**transform.Translate(varPose.normalized * speed * Time.deltaTime);**
parePose = transform.position - prePose;
magFloat = parePose.magnitude;
Debug.Log(magFloat);
}
- ํ์ฌ ์์น์์ ๋ชฉ์ ์ง๋ก ํฅํ๋ ๋ฐฉํฅ
public GameObject pos1;
public GameObject pos2;
Vector3 objectPos1;
Vector3 objectPos2;
float speed = 10;
Vector3 direction;
float magTarget;
Vector3 nowSpeed;
void Update()
{
objectPos1 = pos1.transform.position;
objectPos2 = transform.position;
magTarget = (objectPos1 - objectPos2).magnitude;
direction = (objectPos1 - objectPos2).normalized;
if (magTarget < 10 )
{
nowSpeed = direction * speed * Time.deltaTime;
}
else
{
nowSpeed = new Vector3(0,0,0);
}
transform.Translate(nowSpeed);
}
- ํค๋ณด๋ ์ ๋ ฅ ๋ฐ๊ธฐ - 2๊ฐ์ง ๋ฐฉ๋ฒ
**(1) Input.GetKey**
GetKey, GetKeyDown, GetKeyUp
if(Input.GetKey(“Name”))
{ //๋ช
๋ น}
right, left, up, down, space, tab, delete, a, b, c, 1, 2, 3… ๋ฑ
**(2) Name๋ถ๋ถ์ KeyCode**
if(Input.GetKey(KeyCode.UpArrow))
{ //๋ช
๋ น }
Input.GetKeyDown(“space”) == Input.GetKeyDown(KeyCode.Space)
- ๋ง์ฐ์ค ์ ๋ ฅ ๋ฐ๊ธฐ
**(2) Input.GetButton**
GetButton, GetButtonDown, GetButtonUp
if(Input.**GetButtonDown**(“ButtonName”))
{ //๋ช
๋ น }
ButtonName์ ๋๋ฅด๋ ๋์ true๋ก ๋ฌด๊ธฐ๋ฅ๋ฅผ ์ฌ์ฉํ ๋ ๋ฒํผ ํธ๋ฆฌ๊ฑฐ๋ก ์ฌ์ฉํ ๋ ์ฌ์ฉํ๋ค.
Edit > Project Setting > Input์์ ๋ฏธ๋ฆฌ ์ค์ ๋ ButtonName์ ๋ณผ ์ ์๋ค. ‘Fire1’๋ ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ
**(2) Input.GetMouseButton**
GetMouseButton, GetMouseButtonDown, GetMouseButtonUp
if (Input.**GetMouseButtonDown**(0))
{
print("๋ง์ฐ์ค๋ค์ด");
}
**GetMouseButtonDown(0) : ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ
GetMouseButtonDown(1) : ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ
GetMouseButtonDown(2) : ๋ง์ฐ์ค ์ค์(ํ ) ๋ฒํผ**
- Rigidbody
Player ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์์ง์์ ์ ์ดํ๊ธฐ ์ํด Rigidbody๋ฅผ ์ถ๊ฐํ๋ค.
Add Component > Physics > Rigidbody
- ์ค๋ ฅ Use Gravity ๋ฅผ ์ฒดํฌํ๋ฉด ์๋์ผ๋ก ๋ฐ์ผ๋ก ๋จ์ด์ง๋ค.
Mass๊ฐ์ ๋ฐ๋ผ ๋จ์ด์ง๋ ์ค๋ ํํํ๋ค.
-์บก์์ฒ๋ผ ๋ฐ๋ฅ๋ฉด์ด ๊ณก์ ์ผ ๊ฒฝ์ฐ ์ค๋ ฅ์ผ๋ก ์ํฅ์ผ๋ก ์ฐ๋ฌ์ง ์ ์๋ค.
Constaints์์ ์๋ก ํ๊ฒจ๋๊ฐ์ง ์๋๋ก Freeze Position์ Y ์ฒดํฌํ๋ค.
์ถฉ๋ ์ดํ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ผ๋ณด๋๋ก Freeze Rotation์ X์ Z๋ฅผ ์ฒดํฌํ๋ค.
- ์ถฉ๋์ฒดํฌ๋ Collider ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ ๋ชจ๋ ์ถฉ๋ ์ฒดํฌ๋ฅผ ํ๋ค.
๋จ, Is Kinematic์ด ์ฒดํฌ๊ฐ ๋๋ฉด ๋ฌผ์ฒด๋ฅผ ํต๊ณผํ๊ฒ ๋๋ค.
ํตํตํ๋ ํจ๊ณผ ๋ง๋ค๊ธฐ(๋ฌผ๋ฆฌ ์ฌ์ง ๋ง๋ค์ด์ ์ ์ฉํ๊ธฐ)
- Freeze Position์ Y ์ฒดํฌ ํ๊ธฐ
- Project์ฐฝ์ Create > Physic Material ์ถ๊ฐ, Bounciness ๊ฐ์ 1
- Player์ Collider์ Material์ ์ถ๊ฐํ๋ค.
- Rigidbody์ ํ์ ์ถ๊ฐํ์ฌ ์ด๋
[Rigidbody.AddForce]
public void AddForce(float x, float y, float z, forceMode);
๋ฆฌ์ง๋๋ฐ๋์ ํ์ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ์ผ์ ํ ํ์ ์ง์์ ์ผ๋ก ๋ถ์ฌํ๋ค.
forceMode๋ฅผ ์ง์ ํ๋ฉด ๊ฐ์(Acceleration), ์ถฉ๊ฒฉ(Impulse), ์๋๋ณ๊ฒฝ(Velocity Change)๊ฐ ๊ฐ๋ฅํ๋ค.
์
๋ฐ์ดํธ ๋ฌธ์์ ๋ฐฉํฅํค๋ก ํ์ด ๊ฐํด์ง๋๋ก ์์ฑํ๊ฒ ๋๋ค
- ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐ๋ณ์๋ก ์กฐ์ ํ๊ธฐ
์ฐธ์กฐ ํ์
์ผ๋ก ์คํฌ๋ฆฝํธ์์ ๋ณ์๋ฅผ ํตํด ํด๋น ์ปดํฌ๋ํธ ์กฐ์ข
๊ฐ๋ฅํ๋ค. .์ฐธ์กฐ ๋ณ์๋ ์ค์ฒด๋ ์๋์ง๋ง, ์ค์ฒด์ฒ๋ผ
์ฐธ์กฐ๊ฐ์ ์ ์ฅํ๋ค. ์ด๋ก ๊ฒ์์ค๋ธ์ ํธ์ ์ปดํฌ๋ํธ๋ฅผ ์คํฌ๋ฆฝํธ์์ ์ฐธ์กฐ ํ์
๋ณ์๋ก ์ ์ธ, ์ ๊ทผํ์ฌ, ์ ์ด
๊ฐ๋ฅํ๋ค.
public Rigidbody playerRigidbody;
๋ก ์ ์ธํ ํ์
playerRigidbody.AddForce(0, 500, 0);
<aside> ๐ ๋ฌธ์
-Rigidbody ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํ ๋นํ์ง ์์ ๋ฐฉ๋ฒ์?
: AddFoce()๋ ์ ์ง์ ์ผ๋ก ์๋๊ฐ ์ฆ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๋นจ๋ผ์ง๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
: ์ ๋ ฅ ๊ฐ์ง ์ฝ๋๊ฐ ๋ณต์กํ๋ค. ์ฆ, IF ๋ฌธ์ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ค.
์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
</aside>
- ๋ง์ฐ์ค์ ์กฐ์ด์คํฑ
(1) Axis(์ถ์ ์ด์ฉ)
Input.GetAxis(“Horizontal”)
Input.GetAxis(“Vertical”)
Axis์ ์์ง์ด์ง ์์ ๋๋ 0, ์ํ์์ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด -1, ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด 1 ์ด๋ผ๋ ๊ฐ
์์ง์์ ์๋ก ์ฌ๋ผ๊ฐ๋ฉด 1, ๋ด๋ ค๊ฐ๋ฉด -1 ์ด๋ผ๋ ๊ฐ
“Horizontal”
- ์์ ๋ฐฉํฅ : ์ผ์ชฝ ๋ฐฉํฅํค, A | ์์ ๋ฐฉํฅ : ์ค๋ฅธ์ชฝ ๋ฐฉํฅํค, D
“Vertical”
- ์์ ๋ฐฉํฅ : ์๋์ชฝ ๋ฐฉํฅํค, S | ์์ ๋ฐฉํฅ : ์์ชฝ ๋ฐฉํฅํค, W
(2) ๋ง์ฐ์ค ์ผ์ชฝ ์ค๋ฅธ์ชฝ ์ด๋ ํ์ธ
Input.GetAxis(“Mouse X”)
Input.GetAxis(“Mouse Y”)
- Rigidbody์ ์ด๋์ ์ผ์ ํ๊ฒ ๋ง๋ค๊ธฐ
์ฒ์ ์์ง์ผ ๋๋ ์ ์์ง์ด์ง๋ง, ์ฒ์ฒํ ๊ฐ๋ค๊ฐ ๋ค๋ก ๊ฐ์๋ก ๋นจ๋ผ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์์ง์ด๋ค ๋ฐฉํฅ ์ ํ์
ํด๋ณด๋ฉด ๋ฐ๋ก ์ ํ๋์ง ์์ ๊ฒ์ด๋ค. ๋ง์น ๋นํ์์์ ๋ฐฉํฅ์ ํํ๋ฏ์ด ๋ฏธ๋๋ฌ์ ธ ๋ฐฉํฅ ์ ํ์ด ๋๋ ๋๋์ผ
๊ฒ์ด๋ค. ์ด๊ฒ์ ๋ฐ๋ก Capsule ์ด๋ผ๋ ์ค๋ธ์ ํธ๊ฐ Rigidbody๋ผ๋ ๋ฌผ๋ฆฌ์ ์์ฑ์ ๊ฐ์ง๋ฉด์ ํ์ฌ์ํ๋ฅผ
์ ์งํ๋ ค๋ **๊ด์ฑ์ด ๋ฐ์๋๊ธฐ ๋๋ฌธ์ด๋ค**. =>
[Rigidbody.velocity]
public Vector3 velocity;
๋ฆฌ์ง๋๋ฐ๋์ ๋ฒกํฐ๊ฐ์ ๋ฃ์ด์ ํด๋น ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋๋ก ํ๋ค.
์ฆ Rigidbody๋ฅผ ๊ฐ์ง ๋ฌผ์ฒด์ ์ฃผ์ด์ง ์๋๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ผ๋ก
์ง๋๊ณผ ๊ด์ฑ๋ค์ ๋ฌด์ํ๊ณ ์
๋ ฅ๋ฐ์ ์๋๋ก ๋ฐฉํฅ ์ ํ์ด ๊ฐ๋ฅํ๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ๋ฉ์๋๋ก ๊ฐ์ ธ์ค๊ธฐ
private๋ก ์ ์ธํ ์ฐธ์กฐ๋ณ์๋ ์ธ์คํํฐ์์ ๋ณผ ์ ์๋ค. ์คํฌ๋ฆฝํธ์ GetComponent<>()๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ
๊ฒ์์ค๋ธ์ ํธ ์์ ์ปดํฌ๋ํธ๋ฅผ ํ ๋นํด์ค ์ ์๋ค.
public Rigidbody playerRigidbody;
private void Start()
{
playerRigidbody = GetComponent<Rigidbody>();
}
- Character Controller ์ปดํฌ๋ํธ
Rigidbody๊ฐ ์๋ Add Component > Physics > Character Controller ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋์ ๊ตฌํํ ์ ์๋ค.
๋ฆฌ์ง๋๋ฐ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐจ์งํ๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋ค. ์ค๋ํฐ์์๋ ์ด๋ฌํ ์ ์ ์ฐฉ์ํด ์ค๋ ฅ์ด๋ ์ถฉ๋ ๋ฑ์
๊ฐ๋จํ ๋ฌผ๋ฆฌ ์ฐ์ฐ๋ง์ ํ์๋ก ํ๋ ์บ๋ฆญํฐ ์ ์ฉ ํด๋์ค์ธ character controller๊ฐ ์๋ค.
์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด์ ์ฝ๋ผ์ด๋ ์ปดํฌ๋ํธ๋ ์ญ์ ํ๋ค.
์ค๋ ฅ์ด ์ ์ฉ๋ ์ด๋์ ์ํด ์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ ํด๋์ค์ Move() ํจ์๋ฅผ ์ด์ฉํ๋ค
- Trigger(์ด์๋ง๋ค๊ธฐ)
(1) Sphere - ๋ถ์์ ๋จธํฐ๋ฆฌ์ผ ์ ์ฉ
Position = 0, 1.5, -4
Scale = 0.3
(2) Rigidbody ์ถ๊ฐ ํ use Gravity ์ฒดํฌ๋ฅผ ํด์
[Collider]
**Collider ์ปดํฌ๋ํธ๋ ๋ฌผ๋ฆฌ ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ค๋ธ์ ํธ์ ํํ๋ฅผ ์ ์ํ๋ค.**
์ฝ๋ผ์ด๋๋ ๋ณด์ด์ง ์๋ ์์์ด๋ฏ๋ก ์ค๋ธ์ ํธ์ ๋ฉ์์ ์ ํํ ๋์ผํ ๋ชจ์์ผ ํ์๋ ์์ผ๋ฉฐ, ์ค์ ๋ก๋
์ํ๋ ์ด ์์๋ ๋๋ต์ ์ธ ๊ทผ์ฌ์น๋ก๋ ํฌ๊ฒ ๊ตฌ๋ถ๋์ง ์์ผ๋ฉฐ ๋ ํจ์จ์ ์ด๋ค.
[Collision]
Kinematic(๋ฌผ์ฒด๋ฅผ ํต๊ณผํ๋ ์์ฑ) ์์ฑ์ด ๊บผ์ ธ์์ ๋ ๋ฐ์ํ๋ค.
Kinematic์ด ์ผ์ ธ ์์ผ๋ฉด ๋ด๋ถ ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ์ํด์ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ค.
๋ฌผ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ์ถฉ๋ํ ์ค๋ธ์ ํธ ๋ ๋ค Collider๊ฐ ํ์ํ๊ณ , ๊ทธ ์ค ํ๋๋ Rigidbody๊ฐ ์์ด์ผ ํ๋ค.
Enter : ์ด์์ด ๋ ์์ ๋ถ๋ช์น๋ ์๊ฐ ๋ฐ์(OnCollisionEnter)
Stay : ์ถฉ๋ ํ ๋ถ์ด์๋ ์ํฉ์์ ๊ณ์์ ์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์(OnCollisionStay)
Exit : ๋ถ์ฌ์๋ ์ดํ ๋จ์ด์ง๋ ์๊ฐ ์ด๋ฒคํธ(OnCollisionExit)
[Trigger]
Collision ์ดํ ์ถฉ๋ํ๋ค๋์ ํธ๋ฅผ ํ๋ ๊ฒ์ผ๋ก.
Tirgger๊ฐ ์ฒดํฌ ๋์ด ์๋ค๋ฉด ๋ฌผ๋ฆฌ์ ์ธ ํ์์ ์๊ณ ์ถฉ๋ํ๋ค๊ณ ๋ง ์ธ์ํ๋ค.
์ถฉ๋ ํ์ค๋ธ์ ํธ ๋ ์ค์ ํ๋๋ผ๋ ํธ๋ฆฌ๊ฑฐ๋ฉด ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ์ํ๋ค.
OnTriggerEnter, OnTriggerStay, OnTriggerExit ๊ฐ ์๋ค.
**OnCollision : ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ํตํด ์ถฉ๋ ์ฒ๋ฆฌ, ๊ดํต X, ๋ง์ด ์ฌ์ฉํ๋ฉด ๋ถํ๊ฐ ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
OnTrigger : ๋ฌผ๋ฆฌ ์ฐ์ฐ X, ๊ดํต ๊ฐ๋ฅ, Collision ๋ณด๋ค ์ฐ์ฐ์ด ์ ์ด์ ํจ์จ์ ์ด๋ค.**
- ํด๋์ค์ ๊ฐ์ฒด
(1) ํด๋์ค์ ์ค๋ธ์ ํธ๋ ๊ฐ์ฒด์งํฅ์ ํต์ฌ ๊ฐ์ฒด์งํฅ์ ์ฌ๋์ด ํ์ค ์ธ์์ ๋ณด๋ ๋ฐฉ์์ ๊ฐ๊น์ด ํ๋ก๊ทธ๋จ์ผ๋ก ์ฌ๋์ ํ์ค์ ์ฌ๋ฌผ์ ‘๋ถํดํ์ฌ’ ์๊ฐํ์ง ์๊ณ ์ฌ๋ฌผ์ ‘์จ์ ํ ๋ ๋ฆฝ์ฒด’๋ก ์ฌ๊ธฐ๋ ๊ฒฝํฅ์ด ์๋ค. ์ฌ๋ฌผ์ ์กด์ฌํ๋ ๊ฒ์ผ ์๋ ์๊ณ , ์กด์ฌํ์ง ์๋ ์์์์ ์ด๋ค ๊ฒ์ผ ์๋ ์๋ค. ์ฌ๋, ๋๋ฌผ, ๋ถ๋ชจ, ์๋์ฐจ, ๊ฐ๊ตฌ, ํธ๋ํฐ ๋ฑ ๋ชจ๋ ์ฌ๋ฌผ์ด๋ค. ํ์ง๋ง ์ด์ค์ ๊ตฌ์ฒด์ ์ด์ง์๋ ๊ฒ์ด ์๋ค. ์ฌ๋์ ๊ตฌ์ฒด์ ์ธ ๊ฐ๋ ์ด ์๋ ์ถ์์ ์ธ ๊ฐ๋ ์ด๋ค. ์ถ์์ ์ด๋๊ตฌ์ฒด์ ์ธ ๊ฐ๋ ์ด ์๋๊ณ ์ถ์์ ๊ฐ๋ ์ด๋ค. ์ถ์์ ์ธ ์ฌ๋ฌผ์ ‘ํด๋์ค’, ์๋์ฐจ, ๊ฐ๊ตฌ, ํธ๋ํฐ ๋ฑ ๊ตฌ์ฒด์ ์ธ ๊ฒ๋ค์ ‘๊ฐ์ฒด’๋ผ๊ณ ํ๋ค.
(2) ํด๋์ค ํํํ๊ณ ์ถ์ ๋์์ ์ถ์ํํ์ฌ ๋์๊ณผ ๊ด๋ จ๋ ๋ ๋ณ์ & ๋ฉ์๋๋ฅผ ์ ์ํ๋ ํ์ด๋ค.
ํ์ ๋์ ๋ณด์ด์ง๋ ์์ง๋ง ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
ํด๋์ค๋ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
(3) ๊ฐ์ฒด ๋ฌผ๊ฑด์ ์ค๊ณ๋์ธ ํด๋์ค์ ๋ฌ๋ฆฌ ์ค๋ธ์ ํธ๋ ์ค์ฒด์ด๋ค.
‘์ฌ๋’์ด๋ผ๋ ํด๋์ค๋ก ์ค๋ธ์ ํธ๋ฅผ์์ฑํ ์ ์๋ค. ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ์ค๋ธ์ ํธ๋ ์ฌ๋ฌ๊ฐ๋ฅผ ์์ฑํ ์ ์๋ค.
์ด๋ ๊ฒ ํด๋์ค๋ผ๋ ํ๋ก ์ค๋ธ์ ํธ๋ฅผ์ฐ์ด๋ด๋ ๊ฒ์ ์ธ์คํด์คํํ๋ค๊ณ ํ๋ค. ์ธ์คํด์คํ๋ฅผ์ด์ฉํด ์์ฑ๋ ์ค๋ธ์ ํธ๋ฅผ ์ธ์คํด์ค๋ผ๊ณ ํ๋ค.
๋ํ, ์ธ์คํด์คํ ์ค๋ธ์ ํธ๋ค์ ์๋ก ๋ ๋ฆฝ์ ์ด๋ฉฐ๊ตฌ๋ณ ๊ฐ๋ฅํ ์ค์ฒด์ด๋ค.
- Instantiate (์ธ์คํด์ค)
(1) ์ธ์คํด์ค ๋ณต์ Instantiate() ๋ฉ์๋๋ ์๋ณธ ์ค๋ธ์ ํธ(Prefab)๋ฅผ ๋ณต์ ํ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค. ์ฆ, ์ธ์คํดํธํ๋ฅผ ํ์ฌ ์๋ณธ์ ๋ณต์ ํ ์ธ์คํด์ค ์์ฑ Instantiate(์๋ณธ, ์์น, ํ์ ); ๋ณต์ ํ ์๋ณธ, ์ด๋ํ ์์น, ์ด๋ ๋ฐฉํฅ์ ์ค์
(2) ์ธ์คํด์ค ์ญ์ Destroy(object, float time); Destroy() ๋ฉ์๋๋ ์ ๋ ฅํ ์ค๋ธ์ ํธ๋ฅผ ํ๊ดดํ๋ค. float time ๋งํผ ์ง์ฐ ํ ํด๋น ์ค๋ธ์ ํธ๋ฅผ ํ๊ดดํ๋ค.
- Random.Range()
(1) ๋๋คํ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ํ์์ ๊ณ์ ์์ฑ Random.Range() ๋ฉ์๋๋ ์ ๋ ฅ์ผ๋ก ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์์๋๋ก ๋ฐ๊ณ , ๊ทธ ์ฌ์ด์ ๋๋คํ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ค. float ์ ์ ๋ ฅ๋ฐ์ ๋์ int ์ ๋ ฅ๋ฐ์ ๋์ ๋์์ด ๋ค๋ฅด๋ค. Random.Range(0, 3) ๋ 0, 1, 2 ์ค ํ๋๋ฅผ ์ถ๋ ฅํ๋ค. Random.Range(0f, 3f)๋ 0์์๋ถํฐ 3f ์ฌ์ด์ float ๊ฐ์ ์ถ๋ ฅํ๋ค. 0.5f
- ์ฌ์์ ๊ฒ์์ค๋ธ์ ํธ ์ฐพ๊ธฐ
**โ Find(“๊ฒ์์ค๋ธ์ ํธ ์ด๋ฆ”) - ๊ฐ์ฅ ์ฒ์ ๊ฒ์๋ ์ค๋ธ์ ํธ ๋ฐํ
โ FindWithTag(“ํ๊ทธ์ด๋ฆ”) - ํ๊ทธ๋ก ๋์์ ์ฐพ์. ์ฒ์ ์ฐพ์ ํ๋์ ์ค๋ธ์ ํธ ๋ฐํ
โ FindGameObjectsWithTag(“๊ฐ์์ด๋ฆ์ ํ๊ทธ”) - ๊ฐ์ ํ๊ทธ๋ฅผ ๊ฐ์ง ์ค๋ธ์ ํธ๋ค์ ๋ฐฐ์ด๋ก ๋ฐ์
โ FindObjectOfType(ํ์
๋ช
)
โ FindObjectsOfType(ํ์
๋ช
)**
(1) ์ฌ์์ ๊ฒ์ ์ค๋ธ์ ํธ ์ฐพ๊ธฐ FindObjectOfType() ๋ฉ์๋ player๊ฐ playerController(์ฝ๋) ์ปดํฌ๋ํธ๊ฐ ์ถ๊ฐ๋์ด ์๋ค. FindObjectOfType( ) ๋ฉ์๋๋ ๊บพ์ <>์ ์ด๋ค ํ์ ์ ๋ช ์ํ๋ฉด ์ฌ์ ๋ชจ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฒ์ํด์ ํด๋น ํ์ ์ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์ค๋ธ์ ํธ ์ณ๋ค๋ณด๊ฒ ๋ง๋ค๊ธฐ
(1) ํ๋ ์ด์ด๋ฅผ ํฅํ๋๋ก ํ์์ ์์ฑ
if(pController.enabled) {
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(target.position -
transform.position),1);
}
Die๋ถ๋ถ์ false๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
(2) ์ค๋ธ์ ํธ๋ฅผ ์ณ๋ค๋ณด๊ฒ ๋ง๋ค๊ธฐ transform.LookAt() ๋ฉ์๋๋ ๋ค๋ฅธ ๊ฒ์ ์ค๋ธ์ ํธ์ transform๋ฅผ ๋ฐ๋๋ค. ์ ๋ ฅ๋ฐ์ ๊ฒ์์ค๋ธ์ ํธ๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก ์์ ์ transform ํ์ ์ ๋ณ๊ฒฝํ๋ค.
//Update์์
bullet.transform.LookAt(target);
<aside> ๐ ์ต์ข - ๊ฒ์๋งค๋์ ์ ์
๊ฒ์ ๋งค๋์
- ๊ฒ์์ค๋ฒ๊ฐ ๋๋ฉด ‘Press R to Restart’ ๋ผ๋๊ธ์จ๊ฐ ๋ํ๋๋ค.
- ๊ฒ์์ค๋ฒ ์ ๊ฒ์ ์ฌ์์
๋ฉ์๋
- ์ฌ์ ๋ก๋ํ๊ธฐ ์ํด์๋using UnityEngine.SceneManagement; </aside>
- gameManager
(1) Canvas > Text
Transform Rect์์
- ์นด๋ฉ๋ผ ๊ธฐ์ค์ผ๋ก ์บ๋ฒ์ค๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ ๊ฒ์ธ๊ฐ?
- ์บ๋ฒ์ค ์์ ํ
์คํธ, ๋ฒํผ ๋ค์ ์ ๋ ฌ : Alt ํค๋ฅผ ๋๋ฅธ ์ํ์์ ๋ฐฐ์น
- ์ด ์ํ์์ ์ฌ์ด์ฆ ์กฐ์
(2) Text GUI ์ถ๊ฐํ๊ธฐ
- TimeText : “Time : 0” ์์กด ์๊ฐ ํํ
- GameoverText : “Press R to Restart” ํ
์คํธ ์ถ๊ฐ, ์ ์ ํ ๋นํ์ฑํ
- RecordText : “Best Record : 0” ํ
์คํธ, GameoverText์ ์์์ผ๋ก ๋ง๋ค๊ธฐ
- ํ์ฌ๊น์ง์ ์ ์๋ฅผ ๋ก์ปฌ๋ก ์ ์ฅํ๊ธฐ
(1) PlayerPref
Player Preference๋ผ๊ณ ์ฝ์ผ๋ฉฐ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์ด๋ค ์์น๋ฅผ ๋ก์ปฌ์ ์ ์ฅํ๊ณ ๋์ค์ ๋ค์ ๋ถ๋ฌ์ค๋ ๋ฉ์๋๋ฅผ
์ ๊ณตํ๋ค.
*(2) ์ ์ฅํ๊ธฐ
์ค์๊ฐ์ผ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ PlayerPref.SetFloat()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
PlayerPref.SetFloat(string key, float value);
์ ์๋ SetInt(string key, int value);
๋ฌธ์์ด์ SetString(string key, string value);*
(3) ๋ถ๋ฌ์ค๊ธฐ
๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ PlayerPref.GetFloat()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
PlayerPref.GetFloat(string key);
์ ์๋ GetInt(string key);
๋ฌธ์์ด์ GetString(string key);
์ ์ฅ๋ ๊ฐ์ด ์๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋ค. 0 ๋๋ ๋น๋ฌธ์์ด
(4) ์ด์ ์ ์ ์ฅํ ๊ฐ์ด ์๋์ง
HasKey(string key);
- ๋ฐฉํฅ ๋ฒกํฐ = ์ ๊ทํ๋ ๋ฒกํฐ(Normalized Vector)
๋ฐฉํฅ ๋ฒกํฐ๋ ํฌ๊ธฐ๊ฐ 1์ธ ๋ฒกํฐ๋ก ์ ๊ทํ๋ ๋ฒกํฐ(Normalized Vector)๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
ํฌ๊ธฐ๊ฐ 1์ด๋ฏ๋ก ๋ฐฉํฅ์ ๊ฐ์ง๋ง, ํฌ๊ธฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ฒกํฐ๋ฅผ ๋น๊ตํ๋ ๊ธฐ์ค์ผ๋ก ์ผ์ ์ ์๋ค. (1, -1)์ ๋ฐฉํฅ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด ๋ฒกํฐ์ ์์์ ์์ ๋ฐ์ง๋ฆ์ด 1์ธ ์์ ๊ทธ๋ ค์(1, -1)์ ์ ๋ฐ๊นฅ ๋ถ๋ถ์ ์๋ผ๋ธ๋ค. (๋ฐฉํฅ์ ์ ์งํ๋ฉด์) ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ 1๋ก ๋ง๋๋ ๊ฒ์ด ๋ฒกํฐ ์ ๊ทํ์ด๋ค.
์ ๊ธธ์ด๋ฅผ 1๋ก ๋ง๋๋ ๊ฒ์ผ๊น? ๋ฐฉํฅ์ ๊ฐ์ด ์๋์๋ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง (3, -3)์ด๋ผ๋ ํํ์ผ๋ก๋ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ์ผ๋ง๋งํผ์ ์๋ ฅ์๊ฐ์ง๋์ง ๋ ์ฌ๋ฆฌ๊ธฐ ํ๋ค๋ค. ์ด๋ (3, -3)์ ์์ํ ๋ฐฉํฅ๊ณผ ์์ํ ์๋ ฅ์ ๋๋์ด ํํํ๋ฉด ๋ฐฉํฅ๊ณผ ์๋๋ฅผ ํ์ ํ ์ ์๋ค. (3, -3) = ๋ฐฉํฅ * ์๋ ฅ ๋๋ ์ด๋๊ฑฐ๋ฆฌ ๋ฒกํฐ์ ์ค์นผ๋ผ ๊ณฑ์ ๋ฐฐ์ ๊ณ ๋๋ฌธ์ (3, -3)๋ (1, -1)์ 3๋ฐฐ์ ํด๋น๋๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง (3, -3)์๋ ฅ ์์ฒด๋ฅผ ํํํ์ง ๋ชปํ๋ค. ์๋ ฅ์ด 3์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. (1, -1)์ ํฌ๊ธฐ(magnitude)๋ 1.414… ์ด๊ธฐ๋๋ฌธ์ด๋ค. ‘A์ ๋ฐฉํฅ์ผ๋ก B๋งํผ์ ์๋ ฅ’์ ‘๋ฒกํฐA * ์ค์นผ๋ผB’๋ก ํํํ๊ธฐ ์ํด์๋ ๋ฒกํฐA๋ 1์ด ๋์ง ์์ผ๋ฉด ์ค์ ์๋ ฅ์ B๋ณด๋ค ํฌ๊ฑฐ๋ ์์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
๋ฐ๋ผ์ ๋ฐฉํฅ๋ฒกํฐ๋ ํฌ๊ธฐ๊ฐ 1์ธ ๋ฒกํฐ๋ก ์ฆ ์ ๊ทํ๋ ๋ฒกํฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๊ฒ์์์ ํ๋ ์ด์ด๊ฐ ์ ์ ์์น๋ฅผ ํ์ ํ๊ณ ์์น์ ๋ฒกํฐ ๊ฐ(๋ฒกํฐ C)์ ์๊ณ ์์ ๋ ๊ทธ์ ๋ง๋ ๊ฐ์ผ๋ก ๊ณ์ ์์ผ๋ก ๋์๊ฐ๋ค๋ฉด,
๋ฒกํฐC์ ๊ฐ์ ๋ฐ๋ผ ์ด๋ ๋๋ ๋นจ๋ผ์ง๊ธฐ๋ ๋๋ ๋๋ ค์ง๊ธฐ๋ ํ๋ค. ์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฒกํฐ์ ๊ธธ์ด๋ฅผ 1๋ก ์ ๊ทํํ๋ค.
- normailzed ์ ์ฉํ ๋น๊ต
float speed = 2f;
Vector3 varPose = new Vector3(1,1,1);
//์ด์ ์์น
Vector3 prePose;
Vector3 parePose;
float magFloat;
void Update()
{
prePose = transform.position;
**transform.Translate(varPose.normalized * speed * Time.deltaTime);**
parePose = transform.position - prePose;
magFloat = parePose.magnitude;
Debug.Log(magFloat);
}
- ํ์ฌ ์์น์์ ๋ชฉ์ ์ง๋ก ํฅํ๋ ๋ฐฉํฅ
public GameObject pos1;
public GameObject pos2;
Vector3 objectPos1;
Vector3 objectPos2;
float speed = 10;
Vector3 direction;
float magTarget;
Vector3 nowSpeed;
void Update()
{
objectPos1 = pos1.transform.position;
objectPos2 = transform.position;
magTarget = (objectPos1 - objectPos2).magnitude;
direction = (objectPos1 - objectPos2).normalized;
if (magTarget < 10 )
{
nowSpeed = direction * speed * Time.deltaTime;
}
else
{
nowSpeed = new Vector3(0,0,0);
}
transform.Translate(nowSpeed);
}
๋ณ์, ํจ์ ๋ ธ๋์ ์ฝ๊ธฐ
- ํค๋ณด๋ ์ ๋ ฅ ๋ฐ๊ธฐ - 2๊ฐ์ง ๋ฐฉ๋ฒ
**(1) Input.GetKey**
GetKey, GetKeyDown, GetKeyUp
if(Input.GetKey(“Name”))
{ //๋ช
๋ น}
right, left, up, down, space, tab, delete, a, b, c, 1, 2, 3… ๋ฑ
**(2) Name๋ถ๋ถ์ KeyCode**
if(Input.GetKey(KeyCode.UpArrow))
{ //๋ช
๋ น }
Input.GetKeyDown(“space”) == Input.GetKeyDown(KeyCode.Space)
- ๋ง์ฐ์ค ์ ๋ ฅ ๋ฐ๊ธฐ
**(2) Input.GetButton**
GetButton, GetButtonDown, GetButtonUp
if(Input.**GetButtonDown**(“ButtonName”))
{ //๋ช
๋ น }
ButtonName์ ๋๋ฅด๋ ๋์ true๋ก ๋ฌด๊ธฐ๋ฅ๋ฅผ ์ฌ์ฉํ ๋ ๋ฒํผ ํธ๋ฆฌ๊ฑฐ๋ก ์ฌ์ฉํ ๋ ์ฌ์ฉํ๋ค.
Edit > Project Setting > Input์์ ๋ฏธ๋ฆฌ ์ค์ ๋ ButtonName์ ๋ณผ ์ ์๋ค. ‘Fire1’๋ ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ
**(2) Input.GetMouseButton**
GetMouseButton, GetMouseButtonDown, GetMouseButtonUp
if (Input.**GetMouseButtonDown**(0))
{
print("๋ง์ฐ์ค๋ค์ด");
}
**GetMouseButtonDown(0) : ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ
GetMouseButtonDown(1) : ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ
GetMouseButtonDown(2) : ๋ง์ฐ์ค ์ค์(ํ ) ๋ฒํผ**
- Rigidbody
Player ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์์ง์์ ์ ์ดํ๊ธฐ ์ํด Rigidbody๋ฅผ ์ถ๊ฐํ๋ค.
Add Component > Physics > Rigidbody
- ์ค๋ ฅ Use Gravity ๋ฅผ ์ฒดํฌํ๋ฉด ์๋์ผ๋ก ๋ฐ์ผ๋ก ๋จ์ด์ง๋ค.
Mass๊ฐ์ ๋ฐ๋ผ ๋จ์ด์ง๋ ์ค๋ ํํํ๋ค.
-์บก์์ฒ๋ผ ๋ฐ๋ฅ๋ฉด์ด ๊ณก์ ์ผ ๊ฒฝ์ฐ ์ค๋ ฅ์ผ๋ก ์ํฅ์ผ๋ก ์ฐ๋ฌ์ง ์ ์๋ค.
Constaints์์ ์๋ก ํ๊ฒจ๋๊ฐ์ง ์๋๋ก Freeze Position์ Y ์ฒดํฌํ๋ค.
์ถฉ๋ ์ดํ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ผ๋ณด๋๋ก Freeze Rotation์ X์ Z๋ฅผ ์ฒดํฌํ๋ค.
- ์ถฉ๋์ฒดํฌ๋ Collider ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ ๋ชจ๋ ์ถฉ๋ ์ฒดํฌ๋ฅผ ํ๋ค.
๋จ, Is Kinematic์ด ์ฒดํฌ๊ฐ ๋๋ฉด ๋ฌผ์ฒด๋ฅผ ํต๊ณผํ๊ฒ ๋๋ค.
ํตํตํ๋ ํจ๊ณผ ๋ง๋ค๊ธฐ(๋ฌผ๋ฆฌ ์ฌ์ง ๋ง๋ค์ด์ ์ ์ฉํ๊ธฐ)
- Freeze Position์ Y ์ฒดํฌ ํ๊ธฐ
- Project์ฐฝ์ Create > Physic Material ์ถ๊ฐ, Bounciness ๊ฐ์ 1
- Player์ Collider์ Material์ ์ถ๊ฐํ๋ค.
- Rigidbody์ ํ์ ์ถ๊ฐํ์ฌ ์ด๋
[Rigidbody.AddForce]
public void AddForce(float x, float y, float z, forceMode);
๋ฆฌ์ง๋๋ฐ๋์ ํ์ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ์ผ์ ํ ํ์ ์ง์์ ์ผ๋ก ๋ถ์ฌํ๋ค.
forceMode๋ฅผ ์ง์ ํ๋ฉด ๊ฐ์(Acceleration), ์ถฉ๊ฒฉ(Impulse), ์๋๋ณ๊ฒฝ(Velocity Change)๊ฐ ๊ฐ๋ฅํ๋ค.
์
๋ฐ์ดํธ ๋ฌธ์์ ๋ฐฉํฅํค๋ก ํ์ด ๊ฐํด์ง๋๋ก ์์ฑํ๊ฒ ๋๋ค
- ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐ๋ณ์๋ก ์กฐ์ ํ๊ธฐ
์ฐธ์กฐ ํ์
์ผ๋ก ์คํฌ๋ฆฝํธ์์ ๋ณ์๋ฅผ ํตํด ํด๋น ์ปดํฌ๋ํธ ์กฐ์ข
๊ฐ๋ฅํ๋ค. .์ฐธ์กฐ ๋ณ์๋ ์ค์ฒด๋ ์๋์ง๋ง, ์ค์ฒด์ฒ๋ผ
์ฐธ์กฐ๊ฐ์ ์ ์ฅํ๋ค. ์ด๋ก ๊ฒ์์ค๋ธ์ ํธ์ ์ปดํฌ๋ํธ๋ฅผ ์คํฌ๋ฆฝํธ์์ ์ฐธ์กฐ ํ์
๋ณ์๋ก ์ ์ธ, ์ ๊ทผํ์ฌ, ์ ์ด
๊ฐ๋ฅํ๋ค.
public Rigidbody playerRigidbody;
๋ก ์ ์ธํ ํ์
playerRigidbody.AddForce(0, 500, 0);
<aside> ๐ ๋ฌธ์
-Rigidbody ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํ ๋นํ์ง ์์ ๋ฐฉ๋ฒ์?
: AddFoce()๋ ์ ์ง์ ์ผ๋ก ์๋๊ฐ ์ฆ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๋นจ๋ผ์ง๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
: ์ ๋ ฅ ๊ฐ์ง ์ฝ๋๊ฐ ๋ณต์กํ๋ค. ์ฆ, IF ๋ฌธ์ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ค.
์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
</aside>
- ๋ง์ฐ์ค์ ์กฐ์ด์คํฑ
(1) Axis(์ถ์ ์ด์ฉ)
Input.GetAxis(“Horizontal”)
Input.GetAxis(“Vertical”)
Axis์ ์์ง์ด์ง ์์ ๋๋ 0, ์ํ์์ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด -1, ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด 1 ์ด๋ผ๋ ๊ฐ
์์ง์์ ์๋ก ์ฌ๋ผ๊ฐ๋ฉด 1, ๋ด๋ ค๊ฐ๋ฉด -1 ์ด๋ผ๋ ๊ฐ
“Horizontal”
- ์์ ๋ฐฉํฅ : ์ผ์ชฝ ๋ฐฉํฅํค, A | ์์ ๋ฐฉํฅ : ์ค๋ฅธ์ชฝ ๋ฐฉํฅํค, D
“Vertical”
- ์์ ๋ฐฉํฅ : ์๋์ชฝ ๋ฐฉํฅํค, S | ์์ ๋ฐฉํฅ : ์์ชฝ ๋ฐฉํฅํค, W
(2) ๋ง์ฐ์ค ์ผ์ชฝ ์ค๋ฅธ์ชฝ ์ด๋ ํ์ธ
Input.GetAxis(“Mouse X”)
Input.GetAxis(“Mouse Y”)
- Rigidbody์ ์ด๋์ ์ผ์ ํ๊ฒ ๋ง๋ค๊ธฐ
์ฒ์ ์์ง์ผ ๋๋ ์ ์์ง์ด์ง๋ง, ์ฒ์ฒํ ๊ฐ๋ค๊ฐ ๋ค๋ก ๊ฐ์๋ก ๋นจ๋ผ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์์ง์ด๋ค ๋ฐฉํฅ ์ ํ์
ํด๋ณด๋ฉด ๋ฐ๋ก ์ ํ๋์ง ์์ ๊ฒ์ด๋ค. ๋ง์น ๋นํ์์์ ๋ฐฉํฅ์ ํํ๋ฏ์ด ๋ฏธ๋๋ฌ์ ธ ๋ฐฉํฅ ์ ํ์ด ๋๋ ๋๋์ผ
๊ฒ์ด๋ค. ์ด๊ฒ์ ๋ฐ๋ก Capsule ์ด๋ผ๋ ์ค๋ธ์ ํธ๊ฐ Rigidbody๋ผ๋ ๋ฌผ๋ฆฌ์ ์์ฑ์ ๊ฐ์ง๋ฉด์ ํ์ฌ์ํ๋ฅผ
์ ์งํ๋ ค๋ **๊ด์ฑ์ด ๋ฐ์๋๊ธฐ ๋๋ฌธ์ด๋ค**. =>
[Rigidbody.velocity]
public Vector3 velocity;
๋ฆฌ์ง๋๋ฐ๋์ ๋ฒกํฐ๊ฐ์ ๋ฃ์ด์ ํด๋น ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋๋ก ํ๋ค.
์ฆ Rigidbody๋ฅผ ๊ฐ์ง ๋ฌผ์ฒด์ ์ฃผ์ด์ง ์๋๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ผ๋ก
์ง๋๊ณผ ๊ด์ฑ๋ค์ ๋ฌด์ํ๊ณ ์
๋ ฅ๋ฐ์ ์๋๋ก ๋ฐฉํฅ ์ ํ์ด ๊ฐ๋ฅํ๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ๋ฉ์๋๋ก ๊ฐ์ ธ์ค๊ธฐ
private๋ก ์ ์ธํ ์ฐธ์กฐ๋ณ์๋ ์ธ์คํํฐ์์ ๋ณผ ์ ์๋ค. ์คํฌ๋ฆฝํธ์ GetComponent<>()๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ
๊ฒ์์ค๋ธ์ ํธ ์์ ์ปดํฌ๋ํธ๋ฅผ ํ ๋นํด์ค ์ ์๋ค.
public Rigidbody playerRigidbody;
private void Start()
{
playerRigidbody = GetComponent<Rigidbody>();
}
- Character Controller ์ปดํฌ๋ํธ
Rigidbody๊ฐ ์๋ Add Component > Physics > Character Controller ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋์ ๊ตฌํํ ์ ์๋ค.
๋ฆฌ์ง๋๋ฐ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐจ์งํ๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋ค. ์ค๋ํฐ์์๋ ์ด๋ฌํ ์ ์ ์ฐฉ์ํด ์ค๋ ฅ์ด๋ ์ถฉ๋ ๋ฑ์
๊ฐ๋จํ ๋ฌผ๋ฆฌ ์ฐ์ฐ๋ง์ ํ์๋ก ํ๋ ์บ๋ฆญํฐ ์ ์ฉ ํด๋์ค์ธ character controller๊ฐ ์๋ค.
์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด์ ์ฝ๋ผ์ด๋ ์ปดํฌ๋ํธ๋ ์ญ์ ํ๋ค.
์ค๋ ฅ์ด ์ ์ฉ๋ ์ด๋์ ์ํด ์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ ํด๋์ค์ Move() ํจ์๋ฅผ ์ด์ฉํ๋ค
- Trigger(์ด์๋ง๋ค๊ธฐ)
(1) Sphere - ๋ถ์์ ๋จธํฐ๋ฆฌ์ผ ์ ์ฉ
Position = 0, 1.5, -4
Scale = 0.3
(2) Rigidbody ์ถ๊ฐ ํ use Gravity ์ฒดํฌ๋ฅผ ํด์
[Collider]
**Collider ์ปดํฌ๋ํธ๋ ๋ฌผ๋ฆฌ ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ค๋ธ์ ํธ์ ํํ๋ฅผ ์ ์ํ๋ค.**
์ฝ๋ผ์ด๋๋ ๋ณด์ด์ง ์๋ ์์์ด๋ฏ๋ก ์ค๋ธ์ ํธ์ ๋ฉ์์ ์ ํํ ๋์ผํ ๋ชจ์์ผ ํ์๋ ์์ผ๋ฉฐ, ์ค์ ๋ก๋
์ํ๋ ์ด ์์๋ ๋๋ต์ ์ธ ๊ทผ์ฌ์น๋ก๋ ํฌ๊ฒ ๊ตฌ๋ถ๋์ง ์์ผ๋ฉฐ ๋ ํจ์จ์ ์ด๋ค.
[Collision]
Kinematic(๋ฌผ์ฒด๋ฅผ ํต๊ณผํ๋ ์์ฑ) ์์ฑ์ด ๊บผ์ ธ์์ ๋ ๋ฐ์ํ๋ค.
Kinematic์ด ์ผ์ ธ ์์ผ๋ฉด ๋ด๋ถ ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ์ํด์ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ค.
๋ฌผ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ์ถฉ๋ํ ์ค๋ธ์ ํธ ๋ ๋ค Collider๊ฐ ํ์ํ๊ณ , ๊ทธ ์ค ํ๋๋ Rigidbody๊ฐ ์์ด์ผ ํ๋ค.
Enter : ์ด์์ด ๋ ์์ ๋ถ๋ช์น๋ ์๊ฐ ๋ฐ์(OnCollisionEnter)
Stay : ์ถฉ๋ ํ ๋ถ์ด์๋ ์ํฉ์์ ๊ณ์์ ์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์(OnCollisionStay)
Exit : ๋ถ์ฌ์๋ ์ดํ ๋จ์ด์ง๋ ์๊ฐ ์ด๋ฒคํธ(OnCollisionExit)
[Trigger]
Collision ์ดํ ์ถฉ๋ํ๋ค๋์ ํธ๋ฅผ ํ๋ ๊ฒ์ผ๋ก.
Tirgger๊ฐ ์ฒดํฌ ๋์ด ์๋ค๋ฉด ๋ฌผ๋ฆฌ์ ์ธ ํ์์ ์๊ณ ์ถฉ๋ํ๋ค๊ณ ๋ง ์ธ์ํ๋ค.
์ถฉ๋ ํ์ค๋ธ์ ํธ ๋ ์ค์ ํ๋๋ผ๋ ํธ๋ฆฌ๊ฑฐ๋ฉด ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ์ํ๋ค.
OnTriggerEnter, OnTriggerStay, OnTriggerExit ๊ฐ ์๋ค.
**OnCollision : ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ํตํด ์ถฉ๋ ์ฒ๋ฆฌ, ๊ดํต X, ๋ง์ด ์ฌ์ฉํ๋ฉด ๋ถํ๊ฐ ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
OnTrigger : ๋ฌผ๋ฆฌ ์ฐ์ฐ X, ๊ดํต ๊ฐ๋ฅ, Collision ๋ณด๋ค ์ฐ์ฐ์ด ์ ์ด์ ํจ์จ์ ์ด๋ค.**
- ํด๋์ค์ ๊ฐ์ฒด
(1) ํด๋์ค์ ์ค๋ธ์ ํธ๋ ๊ฐ์ฒด์งํฅ์ ํต์ฌ ๊ฐ์ฒด์งํฅ์ ์ฌ๋์ด ํ์ค ์ธ์์ ๋ณด๋ ๋ฐฉ์์ ๊ฐ๊น์ด ํ๋ก๊ทธ๋จ์ผ๋ก ์ฌ๋์ ํ์ค์ ์ฌ๋ฌผ์ ‘๋ถํดํ์ฌ’ ์๊ฐํ์ง ์๊ณ ์ฌ๋ฌผ์ ‘์จ์ ํ ๋ ๋ฆฝ์ฒด’๋ก ์ฌ๊ธฐ๋ ๊ฒฝํฅ์ด ์๋ค. ์ฌ๋ฌผ์ ์กด์ฌํ๋ ๊ฒ์ผ ์๋ ์๊ณ , ์กด์ฌํ์ง ์๋ ์์์์ ์ด๋ค ๊ฒ์ผ ์๋ ์๋ค. ์ฌ๋, ๋๋ฌผ, ๋ถ๋ชจ, ์๋์ฐจ, ๊ฐ๊ตฌ, ํธ๋ํฐ ๋ฑ ๋ชจ๋ ์ฌ๋ฌผ์ด๋ค. ํ์ง๋ง ์ด์ค์ ๊ตฌ์ฒด์ ์ด์ง์๋ ๊ฒ์ด ์๋ค. ์ฌ๋์ ๊ตฌ์ฒด์ ์ธ ๊ฐ๋ ์ด ์๋ ์ถ์์ ์ธ ๊ฐ๋ ์ด๋ค. ์ถ์์ ์ด๋๊ตฌ์ฒด์ ์ธ ๊ฐ๋ ์ด ์๋๊ณ ์ถ์์ ๊ฐ๋ ์ด๋ค. ์ถ์์ ์ธ ์ฌ๋ฌผ์ ‘ํด๋์ค’, ์๋์ฐจ, ๊ฐ๊ตฌ, ํธ๋ํฐ ๋ฑ ๊ตฌ์ฒด์ ์ธ ๊ฒ๋ค์ ‘๊ฐ์ฒด’๋ผ๊ณ ํ๋ค.
(2) ํด๋์ค ํํํ๊ณ ์ถ์ ๋์์ ์ถ์ํํ์ฌ ๋์๊ณผ ๊ด๋ จ๋ ๋ ๋ณ์ & ๋ฉ์๋๋ฅผ ์ ์ํ๋ ํ์ด๋ค.
ํ์ ๋์ ๋ณด์ด์ง๋ ์์ง๋ง ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
ํด๋์ค๋ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
(3) ๊ฐ์ฒด ๋ฌผ๊ฑด์ ์ค๊ณ๋์ธ ํด๋์ค์ ๋ฌ๋ฆฌ ์ค๋ธ์ ํธ๋ ์ค์ฒด์ด๋ค.
‘์ฌ๋’์ด๋ผ๋ ํด๋์ค๋ก ์ค๋ธ์ ํธ๋ฅผ์์ฑํ ์ ์๋ค. ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ์ค๋ธ์ ํธ๋ ์ฌ๋ฌ๊ฐ๋ฅผ ์์ฑํ ์ ์๋ค.
์ด๋ ๊ฒ ํด๋์ค๋ผ๋ ํ๋ก ์ค๋ธ์ ํธ๋ฅผ์ฐ์ด๋ด๋ ๊ฒ์ ์ธ์คํด์คํํ๋ค๊ณ ํ๋ค. ์ธ์คํด์คํ๋ฅผ์ด์ฉํด ์์ฑ๋ ์ค๋ธ์ ํธ๋ฅผ ์ธ์คํด์ค๋ผ๊ณ ํ๋ค.
๋ํ, ์ธ์คํด์คํ ์ค๋ธ์ ํธ๋ค์ ์๋ก ๋ ๋ฆฝ์ ์ด๋ฉฐ๊ตฌ๋ณ ๊ฐ๋ฅํ ์ค์ฒด์ด๋ค.
- Instantiate (์ธ์คํด์ค)
(1) ์ธ์คํด์ค ๋ณต์ Instantiate() ๋ฉ์๋๋ ์๋ณธ ์ค๋ธ์ ํธ(Prefab)๋ฅผ ๋ณต์ ํ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค. ์ฆ, ์ธ์คํดํธํ๋ฅผ ํ์ฌ ์๋ณธ์ ๋ณต์ ํ ์ธ์คํด์ค ์์ฑ Instantiate(์๋ณธ, ์์น, ํ์ ); ๋ณต์ ํ ์๋ณธ, ์ด๋ํ ์์น, ์ด๋ ๋ฐฉํฅ์ ์ค์
(2) ์ธ์คํด์ค ์ญ์ Destroy(object, float time); Destroy() ๋ฉ์๋๋ ์ ๋ ฅํ ์ค๋ธ์ ํธ๋ฅผ ํ๊ดดํ๋ค. float time ๋งํผ ์ง์ฐ ํ ํด๋น ์ค๋ธ์ ํธ๋ฅผ ํ๊ดดํ๋ค.
- Random.Range()
(1) ๋๋คํ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ํ์์ ๊ณ์ ์์ฑ Random.Range() ๋ฉ์๋๋ ์ ๋ ฅ์ผ๋ก ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์์๋๋ก ๋ฐ๊ณ , ๊ทธ ์ฌ์ด์ ๋๋คํ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ค. float ์ ์ ๋ ฅ๋ฐ์ ๋์ int ์ ๋ ฅ๋ฐ์ ๋์ ๋์์ด ๋ค๋ฅด๋ค. Random.Range(0, 3) ๋ 0, 1, 2 ์ค ํ๋๋ฅผ ์ถ๋ ฅํ๋ค. Random.Range(0f, 3f)๋ 0์์๋ถํฐ 3f ์ฌ์ด์ float ๊ฐ์ ์ถ๋ ฅํ๋ค. 0.5f
- ์ฌ์์ ๊ฒ์์ค๋ธ์ ํธ ์ฐพ๊ธฐ
**โ Find(“๊ฒ์์ค๋ธ์ ํธ ์ด๋ฆ”) - ๊ฐ์ฅ ์ฒ์ ๊ฒ์๋ ์ค๋ธ์ ํธ ๋ฐํ
โ FindWithTag(“ํ๊ทธ์ด๋ฆ”) - ํ๊ทธ๋ก ๋์์ ์ฐพ์. ์ฒ์ ์ฐพ์ ํ๋์ ์ค๋ธ์ ํธ ๋ฐํ
โ FindGameObjectsWithTag(“๊ฐ์์ด๋ฆ์ ํ๊ทธ”) - ๊ฐ์ ํ๊ทธ๋ฅผ ๊ฐ์ง ์ค๋ธ์ ํธ๋ค์ ๋ฐฐ์ด๋ก ๋ฐ์
โ FindObjectOfType(ํ์
๋ช
)
โ FindObjectsOfType(ํ์
๋ช
)**
(1) ์ฌ์์ ๊ฒ์ ์ค๋ธ์ ํธ ์ฐพ๊ธฐ FindObjectOfType() ๋ฉ์๋ player๊ฐ playerController(์ฝ๋) ์ปดํฌ๋ํธ๊ฐ ์ถ๊ฐ๋์ด ์๋ค. FindObjectOfType( ) ๋ฉ์๋๋ ๊บพ์ <>์ ์ด๋ค ํ์ ์ ๋ช ์ํ๋ฉด ์ฌ์ ๋ชจ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฒ์ํด์ ํด๋น ํ์ ์ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์ค๋ธ์ ํธ ์ณ๋ค๋ณด๊ฒ ๋ง๋ค๊ธฐ
(1) ํ๋ ์ด์ด๋ฅผ ํฅํ๋๋ก ํ์์ ์์ฑ
if(pController.enabled) {
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(target.position -
transform.position),1);
}
Die๋ถ๋ถ์ false๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
(2) ์ค๋ธ์ ํธ๋ฅผ ์ณ๋ค๋ณด๊ฒ ๋ง๋ค๊ธฐ transform.LookAt() ๋ฉ์๋๋ ๋ค๋ฅธ ๊ฒ์ ์ค๋ธ์ ํธ์ transform๋ฅผ ๋ฐ๋๋ค. ์ ๋ ฅ๋ฐ์ ๊ฒ์์ค๋ธ์ ํธ๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก ์์ ์ transform ํ์ ์ ๋ณ๊ฒฝํ๋ค.
//Update์์
bullet.transform.LookAt(target);
<aside> ๐ ์ต์ข - ๊ฒ์๋งค๋์ ์ ์
๊ฒ์ ๋งค๋์
- ๊ฒ์์ค๋ฒ๊ฐ ๋๋ฉด ‘Press R to Restart’ ๋ผ๋๊ธ์จ๊ฐ ๋ํ๋๋ค.
- ๊ฒ์์ค๋ฒ ์ ๊ฒ์ ์ฌ์์
๋ฉ์๋
- ์ฌ์ ๋ก๋ํ๊ธฐ ์ํด์๋using UnityEngine.SceneManagement; </aside>
- gameManager
(1) Canvas > Text
Transform Rect์์
- ์นด๋ฉ๋ผ ๊ธฐ์ค์ผ๋ก ์บ๋ฒ์ค๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ ๊ฒ์ธ๊ฐ?
- ์บ๋ฒ์ค ์์ ํ
์คํธ, ๋ฒํผ ๋ค์ ์ ๋ ฌ : Alt ํค๋ฅผ ๋๋ฅธ ์ํ์์ ๋ฐฐ์น
- ์ด ์ํ์์ ์ฌ์ด์ฆ ์กฐ์
(2) Text GUI ์ถ๊ฐํ๊ธฐ
- TimeText : “Time : 0” ์์กด ์๊ฐ ํํ
- GameoverText : “Press R to Restart” ํ
์คํธ ์ถ๊ฐ, ์ ์ ํ ๋นํ์ฑํ
- RecordText : “Best Record : 0” ํ
์คํธ, GameoverText์ ์์์ผ๋ก ๋ง๋ค๊ธฐ
- ํ์ฌ๊น์ง์ ์ ์๋ฅผ ๋ก์ปฌ๋ก ์ ์ฅํ๊ธฐ
(1) PlayerPref
Player Preference๋ผ๊ณ ์ฝ์ผ๋ฉฐ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์ด๋ค ์์น๋ฅผ ๋ก์ปฌ์ ์ ์ฅํ๊ณ ๋์ค์ ๋ค์ ๋ถ๋ฌ์ค๋ ๋ฉ์๋๋ฅผ
์ ๊ณตํ๋ค.
*(2) ์ ์ฅํ๊ธฐ
์ค์๊ฐ์ผ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ PlayerPref.SetFloat()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
PlayerPref.SetFloat(string key, float value);
์ ์๋ SetInt(string key, int value);
๋ฌธ์์ด์ SetString(string key, string value);*
(3) ๋ถ๋ฌ์ค๊ธฐ
๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ PlayerPref.GetFloat()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
PlayerPref.GetFloat(string key);
์ ์๋ GetInt(string key);
๋ฌธ์์ด์ GetString(string key);
์ ์ฅ๋ ๊ฐ์ด ์๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋ค. 0 ๋๋ ๋น๋ฌธ์์ด
(4) ์ด์ ์ ์ ์ฅํ ๊ฐ์ด ์๋์ง
HasKey(string key);
- ๋ฐฉํฅ ๋ฒกํฐ = ์ ๊ทํ๋ ๋ฒกํฐ(Normalized Vector)
๋ฐฉํฅ ๋ฒกํฐ๋ ํฌ๊ธฐ๊ฐ 1์ธ ๋ฒกํฐ๋ก ์ ๊ทํ๋ ๋ฒกํฐ(Normalized Vector)๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
ํฌ๊ธฐ๊ฐ 1์ด๋ฏ๋ก ๋ฐฉํฅ์ ๊ฐ์ง๋ง, ํฌ๊ธฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ฒกํฐ๋ฅผ ๋น๊ตํ๋ ๊ธฐ์ค์ผ๋ก ์ผ์ ์ ์๋ค. (1, -1)์ ๋ฐฉํฅ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด ๋ฒกํฐ์ ์์์ ์์ ๋ฐ์ง๋ฆ์ด 1์ธ ์์ ๊ทธ๋ ค์(1, -1)์ ์ ๋ฐ๊นฅ ๋ถ๋ถ์ ์๋ผ๋ธ๋ค. (๋ฐฉํฅ์ ์ ์งํ๋ฉด์) ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ 1๋ก ๋ง๋๋ ๊ฒ์ด ๋ฒกํฐ ์ ๊ทํ์ด๋ค.
์ ๊ธธ์ด๋ฅผ 1๋ก ๋ง๋๋ ๊ฒ์ผ๊น? ๋ฐฉํฅ์ ๊ฐ์ด ์๋์๋ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง (3, -3)์ด๋ผ๋ ํํ์ผ๋ก๋ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ์ผ๋ง๋งํผ์ ์๋ ฅ์๊ฐ์ง๋์ง ๋ ์ฌ๋ฆฌ๊ธฐ ํ๋ค๋ค. ์ด๋ (3, -3)์ ์์ํ ๋ฐฉํฅ๊ณผ ์์ํ ์๋ ฅ์ ๋๋์ด ํํํ๋ฉด ๋ฐฉํฅ๊ณผ ์๋๋ฅผ ํ์ ํ ์ ์๋ค. (3, -3) = ๋ฐฉํฅ * ์๋ ฅ ๋๋ ์ด๋๊ฑฐ๋ฆฌ ๋ฒกํฐ์ ์ค์นผ๋ผ ๊ณฑ์ ๋ฐฐ์ ๊ณ ๋๋ฌธ์ (3, -3)๋ (1, -1)์ 3๋ฐฐ์ ํด๋น๋๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง (3, -3)์๋ ฅ ์์ฒด๋ฅผ ํํํ์ง ๋ชปํ๋ค. ์๋ ฅ์ด 3์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. (1, -1)์ ํฌ๊ธฐ(magnitude)๋ 1.414… ์ด๊ธฐ๋๋ฌธ์ด๋ค. ‘A์ ๋ฐฉํฅ์ผ๋ก B๋งํผ์ ์๋ ฅ’์ ‘๋ฒกํฐA * ์ค์นผ๋ผB’๋ก ํํํ๊ธฐ ์ํด์๋ ๋ฒกํฐA๋ 1์ด ๋์ง ์์ผ๋ฉด ์ค์ ์๋ ฅ์ B๋ณด๋ค ํฌ๊ฑฐ๋ ์์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
๋ฐ๋ผ์ ๋ฐฉํฅ๋ฒกํฐ๋ ํฌ๊ธฐ๊ฐ 1์ธ ๋ฒกํฐ๋ก ์ฆ ์ ๊ทํ๋ ๋ฒกํฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ๊ฒ์์์ ํ๋ ์ด์ด๊ฐ ์ ์ ์์น๋ฅผ ํ์ ํ๊ณ ์์น์ ๋ฒกํฐ ๊ฐ(๋ฒกํฐ C)์ ์๊ณ ์์ ๋ ๊ทธ์ ๋ง๋ ๊ฐ์ผ๋ก ๊ณ์ ์์ผ๋ก ๋์๊ฐ๋ค๋ฉด,
๋ฒกํฐC์ ๊ฐ์ ๋ฐ๋ผ ์ด๋ ๋๋ ๋นจ๋ผ์ง๊ธฐ๋ ๋๋ ๋๋ ค์ง๊ธฐ๋ ํ๋ค. ์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฒกํฐ์ ๊ธธ์ด๋ฅผ 1๋ก ์ ๊ทํํ๋ค.
- normailzed ์ ์ฉํ ๋น๊ต
float speed = 2f;
Vector3 varPose = new Vector3(1,1,1);
//์ด์ ์์น
Vector3 prePose;
Vector3 parePose;
float magFloat;
void Update()
{
prePose = transform.position;
**transform.Translate(varPose.normalized * speed * Time.deltaTime);**
parePose = transform.position - prePose;
magFloat = parePose.magnitude;
Debug.Log(magFloat);
}
- ํ์ฌ ์์น์์ ๋ชฉ์ ์ง๋ก ํฅํ๋ ๋ฐฉํฅ
public GameObject pos1;
public GameObject pos2;
Vector3 objectPos1;
Vector3 objectPos2;
float speed = 10;
Vector3 direction;
float magTarget;
Vector3 nowSpeed;
void Update()
{
objectPos1 = pos1.transform.position;
objectPos2 = transform.position;
magTarget = (objectPos1 - objectPos2).magnitude;
direction = (objectPos1 - objectPos2).normalized;
if (magTarget < 10 )
{
nowSpeed = direction * speed * Time.deltaTime;
}
else
{
nowSpeed = new Vector3(0,0,0);
}
transform.Translate(nowSpeed);
}
๋ณ์, ํจ์ ๋ ธ๋์ ์ฝ๊ธฐ
- ํค๋ณด๋ ์ ๋ ฅ ๋ฐ๊ธฐ - 2๊ฐ์ง ๋ฐฉ๋ฒ
**(1) Input.GetKey**
GetKey, GetKeyDown, GetKeyUp
if(Input.GetKey(“Name”))
{ //๋ช
๋ น}
right, left, up, down, space, tab, delete, a, b, c, 1, 2, 3… ๋ฑ
**(2) Name๋ถ๋ถ์ KeyCode**
if(Input.GetKey(KeyCode.UpArrow))
{ //๋ช
๋ น }
Input.GetKeyDown(“space”) == Input.GetKeyDown(KeyCode.Space)
- ๋ง์ฐ์ค ์ ๋ ฅ ๋ฐ๊ธฐ
**(2) Input.GetButton**
GetButton, GetButtonDown, GetButtonUp
if(Input.**GetButtonDown**(“ButtonName”))
{ //๋ช
๋ น }
ButtonName์ ๋๋ฅด๋ ๋์ true๋ก ๋ฌด๊ธฐ๋ฅ๋ฅผ ์ฌ์ฉํ ๋ ๋ฒํผ ํธ๋ฆฌ๊ฑฐ๋ก ์ฌ์ฉํ ๋ ์ฌ์ฉํ๋ค.
Edit > Project Setting > Input์์ ๋ฏธ๋ฆฌ ์ค์ ๋ ButtonName์ ๋ณผ ์ ์๋ค. ‘Fire1’๋ ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ
**(2) Input.GetMouseButton**
GetMouseButton, GetMouseButtonDown, GetMouseButtonUp
if (Input.**GetMouseButtonDown**(0))
{
print("๋ง์ฐ์ค๋ค์ด");
}
**GetMouseButtonDown(0) : ๋ง์ฐ์ค ์ผ์ชฝ ๋ฒํผ
GetMouseButtonDown(1) : ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ
GetMouseButtonDown(2) : ๋ง์ฐ์ค ์ค์(ํ ) ๋ฒํผ**
- Rigidbody
Player ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์์ง์์ ์ ์ดํ๊ธฐ ์ํด Rigidbody๋ฅผ ์ถ๊ฐํ๋ค.
Add Component > Physics > Rigidbody
- ์ค๋ ฅ Use Gravity ๋ฅผ ์ฒดํฌํ๋ฉด ์๋์ผ๋ก ๋ฐ์ผ๋ก ๋จ์ด์ง๋ค.
Mass๊ฐ์ ๋ฐ๋ผ ๋จ์ด์ง๋ ์ค๋ ํํํ๋ค.
-์บก์์ฒ๋ผ ๋ฐ๋ฅ๋ฉด์ด ๊ณก์ ์ผ ๊ฒฝ์ฐ ์ค๋ ฅ์ผ๋ก ์ํฅ์ผ๋ก ์ฐ๋ฌ์ง ์ ์๋ค.
Constaints์์ ์๋ก ํ๊ฒจ๋๊ฐ์ง ์๋๋ก Freeze Position์ Y ์ฒดํฌํ๋ค.
์ถฉ๋ ์ดํ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ผ๋ณด๋๋ก Freeze Rotation์ X์ Z๋ฅผ ์ฒดํฌํ๋ค.
- ์ถฉ๋์ฒดํฌ๋ Collider ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ ๋ชจ๋ ์ถฉ๋ ์ฒดํฌ๋ฅผ ํ๋ค.
๋จ, Is Kinematic์ด ์ฒดํฌ๊ฐ ๋๋ฉด ๋ฌผ์ฒด๋ฅผ ํต๊ณผํ๊ฒ ๋๋ค.
ํตํตํ๋ ํจ๊ณผ ๋ง๋ค๊ธฐ(๋ฌผ๋ฆฌ ์ฌ์ง ๋ง๋ค์ด์ ์ ์ฉํ๊ธฐ)
- Freeze Position์ Y ์ฒดํฌ ํ๊ธฐ
- Project์ฐฝ์ Create > Physic Material ์ถ๊ฐ, Bounciness ๊ฐ์ 1
- Player์ Collider์ Material์ ์ถ๊ฐํ๋ค.
- Rigidbody์ ํ์ ์ถ๊ฐํ์ฌ ์ด๋
[Rigidbody.AddForce]
public void AddForce(float x, float y, float z, forceMode);
๋ฆฌ์ง๋๋ฐ๋์ ํ์ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ์ผ์ ํ ํ์ ์ง์์ ์ผ๋ก ๋ถ์ฌํ๋ค.
forceMode๋ฅผ ์ง์ ํ๋ฉด ๊ฐ์(Acceleration), ์ถฉ๊ฒฉ(Impulse), ์๋๋ณ๊ฒฝ(Velocity Change)๊ฐ ๊ฐ๋ฅํ๋ค.
์
๋ฐ์ดํธ ๋ฌธ์์ ๋ฐฉํฅํค๋ก ํ์ด ๊ฐํด์ง๋๋ก ์์ฑํ๊ฒ ๋๋ค
- ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐ๋ณ์๋ก ์กฐ์ ํ๊ธฐ
์ฐธ์กฐ ํ์
์ผ๋ก ์คํฌ๋ฆฝํธ์์ ๋ณ์๋ฅผ ํตํด ํด๋น ์ปดํฌ๋ํธ ์กฐ์ข
๊ฐ๋ฅํ๋ค. .์ฐธ์กฐ ๋ณ์๋ ์ค์ฒด๋ ์๋์ง๋ง, ์ค์ฒด์ฒ๋ผ
์ฐธ์กฐ๊ฐ์ ์ ์ฅํ๋ค. ์ด๋ก ๊ฒ์์ค๋ธ์ ํธ์ ์ปดํฌ๋ํธ๋ฅผ ์คํฌ๋ฆฝํธ์์ ์ฐธ์กฐ ํ์
๋ณ์๋ก ์ ์ธ, ์ ๊ทผํ์ฌ, ์ ์ด
๊ฐ๋ฅํ๋ค.
public Rigidbody playerRigidbody;
๋ก ์ ์ธํ ํ์
playerRigidbody.AddForce(0, 500, 0);
๐ ๋ฌธ์
-Rigidbody ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํ ๋นํ์ง ์์ ๋ฐฉ๋ฒ์?
: AddFoce()๋ ์ ์ง์ ์ผ๋ก ์๋๊ฐ ์ฆ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๋นจ๋ผ์ง๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
: ์ ๋ ฅ ๊ฐ์ง ์ฝ๋๊ฐ ๋ณต์กํ๋ค. ์ฆ, IF ๋ฌธ์ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ค.
์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ๋ง์ฐ์ค์ ์กฐ์ด์คํฑ
(1) Axis(์ถ์ ์ด์ฉ)
Input.GetAxis(“Horizontal”)
Input.GetAxis(“Vertical”)
Axis์ ์์ง์ด์ง ์์ ๋๋ 0, ์ํ์์ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด -1, ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฉด 1 ์ด๋ผ๋ ๊ฐ
์์ง์์ ์๋ก ์ฌ๋ผ๊ฐ๋ฉด 1, ๋ด๋ ค๊ฐ๋ฉด -1 ์ด๋ผ๋ ๊ฐ
“Horizontal”
- ์์ ๋ฐฉํฅ : ์ผ์ชฝ ๋ฐฉํฅํค, A | ์์ ๋ฐฉํฅ : ์ค๋ฅธ์ชฝ ๋ฐฉํฅํค, D
“Vertical”
- ์์ ๋ฐฉํฅ : ์๋์ชฝ ๋ฐฉํฅํค, S | ์์ ๋ฐฉํฅ : ์์ชฝ ๋ฐฉํฅํค, W
(2) ๋ง์ฐ์ค ์ผ์ชฝ ์ค๋ฅธ์ชฝ ์ด๋ ํ์ธ
Input.GetAxis(“Mouse X”)
Input.GetAxis(“Mouse Y”)
- Rigidbody์ ์ด๋์ ์ผ์ ํ๊ฒ ๋ง๋ค๊ธฐ
์ฒ์ ์์ง์ผ ๋๋ ์ ์์ง์ด์ง๋ง, ์ฒ์ฒํ ๊ฐ๋ค๊ฐ ๋ค๋ก ๊ฐ์๋ก ๋นจ๋ผ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์์ง์ด๋ค ๋ฐฉํฅ ์ ํ์
ํด๋ณด๋ฉด ๋ฐ๋ก ์ ํ๋์ง ์์ ๊ฒ์ด๋ค. ๋ง์น ๋นํ์์์ ๋ฐฉํฅ์ ํํ๋ฏ์ด ๋ฏธ๋๋ฌ์ ธ ๋ฐฉํฅ ์ ํ์ด ๋๋ ๋๋์ผ
๊ฒ์ด๋ค. ์ด๊ฒ์ ๋ฐ๋ก Capsule ์ด๋ผ๋ ์ค๋ธ์ ํธ๊ฐ Rigidbody๋ผ๋ ๋ฌผ๋ฆฌ์ ์์ฑ์ ๊ฐ์ง๋ฉด์ ํ์ฌ์ํ๋ฅผ
์ ์งํ๋ ค๋ **๊ด์ฑ์ด ๋ฐ์๋๊ธฐ ๋๋ฌธ์ด๋ค**. =>
[Rigidbody.velocity]
public Vector3 velocity;
๋ฆฌ์ง๋๋ฐ๋์ ๋ฒกํฐ๊ฐ์ ๋ฃ์ด์ ํด๋น ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋๋ก ํ๋ค.
์ฆ Rigidbody๋ฅผ ๊ฐ์ง ๋ฌผ์ฒด์ ์ฃผ์ด์ง ์๋๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ผ๋ก
์ง๋๊ณผ ๊ด์ฑ๋ค์ ๋ฌด์ํ๊ณ ์
๋ ฅ๋ฐ์ ์๋๋ก ๋ฐฉํฅ ์ ํ์ด ๊ฐ๋ฅํ๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ๋ฉ์๋๋ก ๊ฐ์ ธ์ค๊ธฐ
private๋ก ์ ์ธํ ์ฐธ์กฐ๋ณ์๋ ์ธ์คํํฐ์์ ๋ณผ ์ ์๋ค. ์คํฌ๋ฆฝํธ์ GetComponent<>()๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ
๊ฒ์์ค๋ธ์ ํธ ์์ ์ปดํฌ๋ํธ๋ฅผ ํ ๋นํด์ค ์ ์๋ค.
public Rigidbody playerRigidbody;
private void Start()
{
playerRigidbody = GetComponent<Rigidbody>();
}
- Character Controller ์ปดํฌ๋ํธ
Rigidbody๊ฐ ์๋ Add Component > Physics > Character Controller ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋์ ๊ตฌํํ ์ ์๋ค.
๋ฆฌ์ง๋๋ฐ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐจ์งํ๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋ค. ์ค๋ํฐ์์๋ ์ด๋ฌํ ์ ์ ์ฐฉ์ํด ์ค๋ ฅ์ด๋ ์ถฉ๋ ๋ฑ์
๊ฐ๋จํ ๋ฌผ๋ฆฌ ์ฐ์ฐ๋ง์ ํ์๋ก ํ๋ ์บ๋ฆญํฐ ์ ์ฉ ํด๋์ค์ธ character controller๊ฐ ์๋ค.
์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด์ ์ฝ๋ผ์ด๋ ์ปดํฌ๋ํธ๋ ์ญ์ ํ๋ค.
์ค๋ ฅ์ด ์ ์ฉ๋ ์ด๋์ ์ํด ์บ๋ฆญํฐ ์ปจํธ๋กค๋ฌ ํด๋์ค์ Move() ํจ์๋ฅผ ์ด์ฉํ๋ค
- Trigger(์ด์๋ง๋ค๊ธฐ)
(1) Sphere - ๋ถ์์ ๋จธํฐ๋ฆฌ์ผ ์ ์ฉ
Position = 0, 1.5, -4
Scale = 0.3
(2) Rigidbody ์ถ๊ฐ ํ use Gravity ์ฒดํฌ๋ฅผ ํด์
[Collider]
**Collider ์ปดํฌ๋ํธ๋ ๋ฌผ๋ฆฌ ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ค๋ธ์ ํธ์ ํํ๋ฅผ ์ ์ํ๋ค.**
์ฝ๋ผ์ด๋๋ ๋ณด์ด์ง ์๋ ์์์ด๋ฏ๋ก ์ค๋ธ์ ํธ์ ๋ฉ์์ ์ ํํ ๋์ผํ ๋ชจ์์ผ ํ์๋ ์์ผ๋ฉฐ, ์ค์ ๋ก๋
์ํ๋ ์ด ์์๋ ๋๋ต์ ์ธ ๊ทผ์ฌ์น๋ก๋ ํฌ๊ฒ ๊ตฌ๋ถ๋์ง ์์ผ๋ฉฐ ๋ ํจ์จ์ ์ด๋ค.
[Collision]
Kinematic(๋ฌผ์ฒด๋ฅผ ํต๊ณผํ๋ ์์ฑ) ์์ฑ์ด ๊บผ์ ธ์์ ๋ ๋ฐ์ํ๋ค.
Kinematic์ด ์ผ์ ธ ์์ผ๋ฉด ๋ด๋ถ ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ์ํด์ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ค.
๋ฌผ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ์ถฉ๋ํ ์ค๋ธ์ ํธ ๋ ๋ค Collider๊ฐ ํ์ํ๊ณ , ๊ทธ ์ค ํ๋๋ Rigidbody๊ฐ ์์ด์ผ ํ๋ค.
Enter : ์ด์์ด ๋ ์์ ๋ถ๋ช์น๋ ์๊ฐ ๋ฐ์(OnCollisionEnter)
Stay : ์ถฉ๋ ํ ๋ถ์ด์๋ ์ํฉ์์ ๊ณ์์ ์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์(OnCollisionStay)
Exit : ๋ถ์ฌ์๋ ์ดํ ๋จ์ด์ง๋ ์๊ฐ ์ด๋ฒคํธ(OnCollisionExit)
[Trigger]
Collision ์ดํ ์ถฉ๋ํ๋ค๋์ ํธ๋ฅผ ํ๋ ๊ฒ์ผ๋ก.
Tirgger๊ฐ ์ฒดํฌ ๋์ด ์๋ค๋ฉด ๋ฌผ๋ฆฌ์ ์ธ ํ์์ ์๊ณ ์ถฉ๋ํ๋ค๊ณ ๋ง ์ธ์ํ๋ค.
์ถฉ๋ ํ์ค๋ธ์ ํธ ๋ ์ค์ ํ๋๋ผ๋ ํธ๋ฆฌ๊ฑฐ๋ฉด ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ์ํ๋ค.
OnTriggerEnter, OnTriggerStay, OnTriggerExit ๊ฐ ์๋ค.
**OnCollision : ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ํตํด ์ถฉ๋ ์ฒ๋ฆฌ, ๊ดํต X, ๋ง์ด ์ฌ์ฉํ๋ฉด ๋ถํ๊ฐ ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
OnTrigger : ๋ฌผ๋ฆฌ ์ฐ์ฐ X, ๊ดํต ๊ฐ๋ฅ, Collision ๋ณด๋ค ์ฐ์ฐ์ด ์ ์ด์ ํจ์จ์ ์ด๋ค.**
- ํด๋์ค์ ๊ฐ์ฒด
(1) ํด๋์ค์ ์ค๋ธ์ ํธ๋ ๊ฐ์ฒด์งํฅ์ ํต์ฌ ๊ฐ์ฒด์งํฅ์ ์ฌ๋์ด ํ์ค ์ธ์์ ๋ณด๋ ๋ฐฉ์์ ๊ฐ๊น์ด ํ๋ก๊ทธ๋จ์ผ๋ก ์ฌ๋์ ํ์ค์ ์ฌ๋ฌผ์ ‘๋ถํดํ์ฌ’ ์๊ฐํ์ง ์๊ณ ์ฌ๋ฌผ์ ‘์จ์ ํ ๋ ๋ฆฝ์ฒด’๋ก ์ฌ๊ธฐ๋ ๊ฒฝํฅ์ด ์๋ค. ์ฌ๋ฌผ์ ์กด์ฌํ๋ ๊ฒ์ผ ์๋ ์๊ณ , ์กด์ฌํ์ง ์๋ ์์์์ ์ด๋ค ๊ฒ์ผ ์๋ ์๋ค. ์ฌ๋, ๋๋ฌผ, ๋ถ๋ชจ, ์๋์ฐจ, ๊ฐ๊ตฌ, ํธ๋ํฐ ๋ฑ ๋ชจ๋ ์ฌ๋ฌผ์ด๋ค. ํ์ง๋ง ์ด์ค์ ๊ตฌ์ฒด์ ์ด์ง์๋ ๊ฒ์ด ์๋ค. ์ฌ๋์ ๊ตฌ์ฒด์ ์ธ ๊ฐ๋ ์ด ์๋ ์ถ์์ ์ธ ๊ฐ๋ ์ด๋ค. ์ถ์์ ์ด๋๊ตฌ์ฒด์ ์ธ ๊ฐ๋ ์ด ์๋๊ณ ์ถ์์ ๊ฐ๋ ์ด๋ค. ์ถ์์ ์ธ ์ฌ๋ฌผ์ ‘ํด๋์ค’, ์๋์ฐจ, ๊ฐ๊ตฌ, ํธ๋ํฐ ๋ฑ ๊ตฌ์ฒด์ ์ธ ๊ฒ๋ค์ ‘๊ฐ์ฒด’๋ผ๊ณ ํ๋ค.
(2) ํด๋์ค ํํํ๊ณ ์ถ์ ๋์์ ์ถ์ํํ์ฌ ๋์๊ณผ ๊ด๋ จ๋ ๋ ๋ณ์ & ๋ฉ์๋๋ฅผ ์ ์ํ๋ ํ์ด๋ค.
ํ์ ๋์ ๋ณด์ด์ง๋ ์์ง๋ง ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
ํด๋์ค๋ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
(3) ๊ฐ์ฒด ๋ฌผ๊ฑด์ ์ค๊ณ๋์ธ ํด๋์ค์ ๋ฌ๋ฆฌ ์ค๋ธ์ ํธ๋ ์ค์ฒด์ด๋ค.
‘์ฌ๋’์ด๋ผ๋ ํด๋์ค๋ก ์ค๋ธ์ ํธ๋ฅผ์์ฑํ ์ ์๋ค. ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ์ค๋ธ์ ํธ๋ ์ฌ๋ฌ๊ฐ๋ฅผ ์์ฑํ ์ ์๋ค.
์ด๋ ๊ฒ ํด๋์ค๋ผ๋ ํ๋ก ์ค๋ธ์ ํธ๋ฅผ์ฐ์ด๋ด๋ ๊ฒ์ ์ธ์คํด์คํํ๋ค๊ณ ํ๋ค. ์ธ์คํด์คํ๋ฅผ์ด์ฉํด ์์ฑ๋ ์ค๋ธ์ ํธ๋ฅผ ์ธ์คํด์ค๋ผ๊ณ ํ๋ค.
๋ํ, ์ธ์คํด์คํ ์ค๋ธ์ ํธ๋ค์ ์๋ก ๋ ๋ฆฝ์ ์ด๋ฉฐ๊ตฌ๋ณ ๊ฐ๋ฅํ ์ค์ฒด์ด๋ค.
- Instantiate (์ธ์คํด์ค)
(1) ์ธ์คํด์ค ๋ณต์ Instantiate() ๋ฉ์๋๋ ์๋ณธ ์ค๋ธ์ ํธ(Prefab)๋ฅผ ๋ณต์ ํ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค. ์ฆ, ์ธ์คํดํธํ๋ฅผ ํ์ฌ ์๋ณธ์ ๋ณต์ ํ ์ธ์คํด์ค ์์ฑ Instantiate(์๋ณธ, ์์น, ํ์ ); ๋ณต์ ํ ์๋ณธ, ์ด๋ํ ์์น, ์ด๋ ๋ฐฉํฅ์ ์ค์
(2) ์ธ์คํด์ค ์ญ์ Destroy(object, float time); Destroy() ๋ฉ์๋๋ ์ ๋ ฅํ ์ค๋ธ์ ํธ๋ฅผ ํ๊ดดํ๋ค. float time ๋งํผ ์ง์ฐ ํ ํด๋น ์ค๋ธ์ ํธ๋ฅผ ํ๊ดดํ๋ค.
- Random.Range()
(1) ๋๋คํ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ํ์์ ๊ณ์ ์์ฑ Random.Range() ๋ฉ์๋๋ ์ ๋ ฅ์ผ๋ก ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์์๋๋ก ๋ฐ๊ณ , ๊ทธ ์ฌ์ด์ ๋๋คํ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ค. float ์ ์ ๋ ฅ๋ฐ์ ๋์ int ์ ๋ ฅ๋ฐ์ ๋์ ๋์์ด ๋ค๋ฅด๋ค. Random.Range(0, 3) ๋ 0, 1, 2 ์ค ํ๋๋ฅผ ์ถ๋ ฅํ๋ค. Random.Range(0f, 3f)๋ 0์์๋ถํฐ 3f ์ฌ์ด์ float ๊ฐ์ ์ถ๋ ฅํ๋ค. 0.5f
- ์ฌ์์ ๊ฒ์์ค๋ธ์ ํธ ์ฐพ๊ธฐ
**โ Find(“๊ฒ์์ค๋ธ์ ํธ ์ด๋ฆ”) - ๊ฐ์ฅ ์ฒ์ ๊ฒ์๋ ์ค๋ธ์ ํธ ๋ฐํ
โ FindWithTag(“ํ๊ทธ์ด๋ฆ”) - ํ๊ทธ๋ก ๋์์ ์ฐพ์. ์ฒ์ ์ฐพ์ ํ๋์ ์ค๋ธ์ ํธ ๋ฐํ
โ FindGameObjectsWithTag(“๊ฐ์์ด๋ฆ์ ํ๊ทธ”) - ๊ฐ์ ํ๊ทธ๋ฅผ ๊ฐ์ง ์ค๋ธ์ ํธ๋ค์ ๋ฐฐ์ด๋ก ๋ฐ์
โ FindObjectOfType(ํ์
๋ช
)
โ FindObjectsOfType(ํ์
๋ช
)**
(1) ์ฌ์์ ๊ฒ์ ์ค๋ธ์ ํธ ์ฐพ๊ธฐ FindObjectOfType() ๋ฉ์๋ player๊ฐ playerController(์ฝ๋) ์ปดํฌ๋ํธ๊ฐ ์ถ๊ฐ๋์ด ์๋ค. FindObjectOfType( ) ๋ฉ์๋๋ ๊บพ์ <>์ ์ด๋ค ํ์ ์ ๋ช ์ํ๋ฉด ์ฌ์ ๋ชจ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฒ์ํด์ ํด๋น ํ์ ์ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์ค๋ธ์ ํธ ์ณ๋ค๋ณด๊ฒ ๋ง๋ค๊ธฐ
(1) ํ๋ ์ด์ด๋ฅผ ํฅํ๋๋ก ํ์์ ์์ฑ
if(pController.enabled) {
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(target.position -
transform.position),1);
}
Die๋ถ๋ถ์ false๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
(2) ์ค๋ธ์ ํธ๋ฅผ ์ณ๋ค๋ณด๊ฒ ๋ง๋ค๊ธฐ transform.LookAt() ๋ฉ์๋๋ ๋ค๋ฅธ ๊ฒ์ ์ค๋ธ์ ํธ์ transform๋ฅผ ๋ฐ๋๋ค. ์ ๋ ฅ๋ฐ์ ๊ฒ์์ค๋ธ์ ํธ๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก ์์ ์ transform ํ์ ์ ๋ณ๊ฒฝํ๋ค.
//Update์์
bullet.transform.LookAt(target);
๐ ์ต์ข - ๊ฒ์๋งค๋์ ์ ์
๊ฒ์ ๋งค๋์
- ๊ฒ์์ค๋ฒ๊ฐ ๋๋ฉด ‘Press R to Restart’ ๋ผ๋๊ธ์จ๊ฐ ๋ํ๋๋ค.
- ๊ฒ์์ค๋ฒ ์ ๊ฒ์ ์ฌ์์
๋ฉ์๋
- ์ฌ์ ๋ก๋ํ๊ธฐ ์ํด์๋using UnityEngine.SceneManagement; </aside>
- gameManager
(1) Canvas > Text
Transform Rect์์
- ์นด๋ฉ๋ผ ๊ธฐ์ค์ผ๋ก ์บ๋ฒ์ค๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ ๊ฒ์ธ๊ฐ?
- ์บ๋ฒ์ค ์์ ํ
์คํธ, ๋ฒํผ ๋ค์ ์ ๋ ฌ : Alt ํค๋ฅผ ๋๋ฅธ ์ํ์์ ๋ฐฐ์น
- ์ด ์ํ์์ ์ฌ์ด์ฆ ์กฐ์
(2) Text GUI ์ถ๊ฐํ๊ธฐ
- TimeText : “Time : 0” ์์กด ์๊ฐ ํํ
- GameoverText : “Press R to Restart” ํ
์คํธ ์ถ๊ฐ, ์ ์ ํ ๋นํ์ฑํ
- RecordText : “Best Record : 0” ํ
์คํธ, GameoverText์ ์์์ผ๋ก ๋ง๋ค๊ธฐ
- ํ์ฌ๊น์ง์ ์ ์๋ฅผ ๋ก์ปฌ๋ก ์ ์ฅํ๊ธฐ
(1) PlayerPref
Player Preference๋ผ๊ณ ์ฝ์ผ๋ฉฐ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์ด๋ค ์์น๋ฅผ ๋ก์ปฌ์ ์ ์ฅํ๊ณ ๋์ค์ ๋ค์ ๋ถ๋ฌ์ค๋ ๋ฉ์๋๋ฅผ
์ ๊ณตํ๋ค.
*(2) ์ ์ฅํ๊ธฐ
์ค์๊ฐ์ผ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ PlayerPref.SetFloat()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
PlayerPref.SetFloat(string key, float value);
์ ์๋ SetInt(string key, int value);
๋ฌธ์์ด์ SetString(string key, string value);*
(3) ๋ถ๋ฌ์ค๊ธฐ
๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ PlayerPref.GetFloat()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
PlayerPref.GetFloat(string key);
์ ์๋ GetInt(string key);
๋ฌธ์์ด์ GetString(string key);
์ ์ฅ๋ ๊ฐ์ด ์๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋ค. 0 ๋๋ ๋น๋ฌธ์์ด
(4) ์ด์ ์ ์ ์ฅํ ๊ฐ์ด ์๋์ง
HasKey(string key);