์ฌ ํ๋ก ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ
1. ์ฌ ํ๋ก ๋ฐ์ดํฐ ๊ด๋ฆฌ
1) ์ค์๊ฐ 3D ๊ฒฝํ ๋์์ธ ์๊ฐ
[๋์์ธ ํ๋ก์ธ์ค]
Pre-projection -> Production -> Post-production -> Operations
์ฌ์ ์ ์ -> ์ ์์ ์ -> ์ฌํ ์ ์ -> ์ด์
ํ์ดํ๋ผ์ธ ๊ด๋ฆฌ์ ์์ด์ ๋์์ธ ํ๋ก์ธ์ค๋ ์ ์ ์ฌ์ดํด์ ์ 3 ๋จ๊ณ์ธ ์ฌ์ ์ ์, ์ ์ ์ ์, ์ฌํ ์ ์์ ํด๋นํ๋ค.
๊ตฌ์ฒด์ ์ธ ๋จ๊ณ๋ ์๋์ ๊ฐ๋ค.
1๋จ๊ณ: ๋ฌธ์ ํ์ ๋๋ ์์ด๋์ด ์ ์
2๋จ๊ณ: ์ฌ์ฉ์ ๋ฐ ์์ฅ ์กฐ์ฌ ์งํ
3๋จ๊ณ: ์ฌ์ฉ์ ํ๋ฅด์๋ ์์ฑ ๋ฐ ์ฌ์ฉ ์ฌ๋ก ์ ์
4๋จ๊ณ: ๋ธ๋ฆฌํ ๊ฐ์ ๋ฐ ๋ชฉํ ๋ช ํํ
5๋จ๊ณ: ์๋น ๋์์ธ ๋ง๋ค๊ธฐ
6๋จ๊ณ: ํ๋กํ ํ์ดํ
7๋จ๊ณ: ๋ฐ๋ณต ๋์์ธ ๋ฐ ๊ฐ๋ฐ (ํ๋กํ ํ์ ์ ์น์ธํ๋ฉด ๋์์ธ -> ์ ์ -> ํ ์คํธ -> ํ๊ฐ -> ๋์์ธ ๊ฐ์ ์์ ์ ๊ณ์ ๋ฐ๋ณตํจ)
[๋์์ธ ๋ฐ ๊ฐ๋ฐ ์ ๊ทผ ๋ฐฉ์]
1) ์ํฐํ ์ ๊ทผ ๋ฐฉ์
๋ง์น ํญํฌ๊ฐ ์๋๋ก ํ๋ฅด๋ ๊ฒ์ฒ๋ผ ํ ๋จ๊ณ๊ฐ ์๋ฃ๋๊ณ ์น์ธ๋๋ฉด ๋ค์ ๋จ๊ณ๊ฐ ์์๋จ.
2) ์ ์์ผ ์ ๊ทผ ๋ฐฉ์
๊ณผ์ ๋ฐ๋ณต์ ์ธ ์ ๊ทผ ๋ฐฉ์
3) ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์
์ ์์ผ + ์ํฐํ ์์ํ ๋ฐฉ์. ํ๋ก์ ํธ ์ฌ์ ์ ์ ๊ณผ์ ์์ ์ ํ์ ์ธ ๋ฐฉ์์ผ๋ก ์ค๋น๋ฅผ ์๋ฃํ ๋ค์, ํน์ ๊ธฐ๋ฅ์ ์ค์ ์ ๋ ์ฌ์ดํด์์ ๋ฐ๋ณต์ ์ผ๋ก ์ ์ ๋ฐ ํ ์คํธํ๋ ์์ ์ด ํฌํจ๋ ์ ์์.
2. ๋ฒ์ ๊ด๋ฆฌ ์ค์
๋ชจ๋ ์ข ๋ฅ์ ํ์ผ์ด๋ ์ํํธ์จ์ด, ์น์ฌ์ดํธ, ๊ธฐํ ๋ฐ์ดํฐ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅ, ๊ด๋ฆฌ, ์ถ์ ํ๋๋ก ์ค์ ํ ์ ์์.
๊ฐ์ธ์ด๋ ์๊ท๋ชจ ํ, ๋๊ท๋ชจ ์กฐ์ง์ ๋ณต์กํ ํ๋ก์ ํธ๋ฅผ ๊ฐํธํ๊ฒ ๋ฐฑ์ ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉ.
๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ผ๊ด๋๊ฒ ์กฐ์จํ์ง ์์ผ๋ฉด ๋นํจ์จ์ฑ, ๋ณ๋ชฉ ํ์, ์ฝ๋ ์์ค, ์ฌ์์ ๋ฑ ๋ง์ ๊ณ ์ถฉ์ ์ง๋ฉดํ ์ ์์.
[๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ๊ธฐ๋ฅ 3๊ฐ์ง]
1) ๋ฐฑ์ ์คํ ๋ฆฌ์ง
2) ์์ ์ฌํญ ์ถ์
3) ํ๋ก์ ํธ ๊ด๋ฆฌ
[๋ฒ์ ๊ด๋ฆฌ์ ์๋ ๋ฐฉ์]
1) ๋ณ๊ฒฝ ์ฌํญ ํธ์ฌ ๋ฐ ํ
2) ๋ณ๊ฒฝ ์ฌํญ ๋ณํฉ
3) ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆฌ๊ธฐ.
์์ ํด์ฆ)
์ ๋ต) 4๋ฒ. ์ ์ฅ์์ ์ฌ๋ฌ ๋ธ๋์น์์ ๋์ผํ ํ์ผ์ ๊ฐ์ ๋ผ์ธ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ.
3. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์น
์๋ก ๊ด๋ จ์๋ ๋ฉ์๋์ ๋ณ์๋ฅผ ๊ทธ๋ฃนํํ์ฌ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ ๊ฒ.
[๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ 4๊ฐ์ง ์์น]
1) ์ถ์ํ: ๋ค๋ฅดํ๋ก๊ทธ๋๋จธ๊ฐ ๋ณผ ์ ์๋ ์คํฌ๋ฆฝํธ์์ ๋ณต์กํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ค์ ๋ก ํ์ํ ๊ธฐ๋ฅ๋ง ๋ ธ์ถํ๋ ํ๋ก์ธ์ค.
2) ์์: ์์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๋ง๋๋ ํ๋ก์ธ์ค.
์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค(๊ธฐ๋ณธ ํด๋์ค)์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์๋์ผ๋ก ๊ฐ์ ธ์ด.
3) ๋คํ์ฑ: ๋ถ๋ชจ ํด๋์ค์์ ์์๋ ์ฝ๋๋ฅผ ์ปค์คํ ํ ์ ์์.
๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ํด์ ์ปค์คํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์.
4) ์บก์ํ: ์ฝ๋ ๊ฐ๊ฒฐํ ๋ฐ ์์ ์ฑ์ ์ํด ์ ๊ทผ์ฑ์ ์ ์ดํ๋ ๊ฒ.
4. ์ฌ ํ๋ก ์์ฑ
using UnityEngine.SceneManagement;
๋ค์์คํ์ด์ค ์ถ๊ฐ
public void StartNew(){
SceneManager.LoadScene(1);
}
์๋ก์ด ์ฌ ํธ์ถ.
LoadScene(์ฌ ์ธ๋ฑ์ค) ํจ์ ์์ ์ธ์๋ Build Settings์ ์๋ ์ฌ ์ธ๋ฑ์ค ์ด๋ค.
Build Settings ์ฐฝ์ File > Build Settings์ ์๋ค.
์์๋ฌธํญ)
* ์กฐ๊ฑด๋ถ ์ปดํ์ผ
#if UNITY_EDITOR
using UnityEditor;
#endif
public void Exit()
{
#if UNITY_EDITOR
EditorApplication.ExitPlaymode();
#else
Application.Quit(); // Unity ํ๋ ์ด์ด๋ฅผ ์ข
๋ฃํ๋ ์๋ณธ ์ฝ๋
#endif
}
์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ํจ์์ธ Application.Quit() ๊ฐ ์๋ํฐ์์์๋ ์๋จน๋๋ค.
์์ ๊ฐ์ด ์กฐ๊ฑด๋ถ ์ปดํ์ผ์ ์ฌ์ฉํด์ Editor์ผ๋๋ EditorApplication.ExitPlaymode() ํจ์๋ฅผ ํธ์ถํด์ ์ข ๋ฃํด์ผ ํ๋ค.
์ฝ์์ 'The name 'EditorApplication' does not exist in the current context'๋ผ๋ ์ค๋ฅ๊ฐ ๋ํ๋๋ฉด UnityEditor ๋ค์์คํ์ด์ค๋ฅผ ์ถ๊ฐํด์ฃผ์.
5. ์ฌ๊ฐ ๋ฐ์ดํฐ ์ง์์ฑ ๊ตฌํ
public class MainManager : MonoBehaviour{
public static MainManager Instance;
private void Awake(){
if(Instance == null) Instance = this;
DontDestroyOnLoad(gameObject);
}
}
DontDestroyOnLoad ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
static ํค์๋๋ ์ด ํด๋์ค ๋ฉค๋ฒ์ ์ ์ฅ๋ ๊ฐ์ด ํด๋น ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค์์ ๊ณต์ ๋จ์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด ํ ์ฌ์ MainManager Instance๊ฐ 10๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ชจ๋ ์ธ์คํด์ค์ ์ ์ฅ๋ ๊ฐ์ด ๋์ผํ๋ค. ํ๋๋ผ๋ ๋ณ๊ฒฝ๋๋ฉด ๋๋จธ์ง 9๊ฐ๋ ๋ณ๊ฒฝ๋๋ค.
์ด ๋, Awake() ํจ์ ์์์ if(Instance == null) ๊ตฌ๋ฌธ์ด ์์ ๊ฒฝ์ฐ, ์ฌ์ ๋ค์ ๋์์ฌ ๋๋ง๋ค ๊ณ์ MainManger ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๋ฌธ์ ๊ฐ ์์ ์ ์๋ค. ์ฆ ์ฌ์ ์ฌ๋ก๋ํ์ ๋ MainManger ๊ฐ ์์ผ๋ฉด ๋ ์์ฑํ์ง ์๋๋ก ์กฐ๊ฑด๋ฌธ์ ์ถ๊ฐํด์ค์ผ ํ๋ค.
์ด๊ฒ ๋ฐ๋ก ์ฑ๊ธํค์ด๋ค.
6. ์ธ์ ๊ฐ ๋ฐ์ดํฐ ์ง์์ฑ ๊ตฌํ
{
"name": "John",
"age": 27,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York"
}
"pet": [“dog”, “cat”]
}
์ธ์ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ ค๋ฉด ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅ๊ฐ๋ฅํ ํ์์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ Serialization(์ง๋ ฌํ), ์ ์ฅ๋ ํ์์ ๋ฐ์ดํฐ๋ก ๋ฐ๊พธ๋ ๊ฑธ Deserialization(์ญ์ง๋ ฌํ)๋ผ๊ณ ํ๋ค.
Unity์์ ๋ฐ์ดํฐ ์ ์ฅ์ ํํ ์ฌ์ฉ๋๋ Json ํ์์ JavaScript Object Notation ์ ์ฝ์์ด๋ค.
Key : Value ํ์ด๋ก ๋์ํ๋ค.
Obejct๋ {} ์ค๊ดํธ๋ก, ๋ฐฐ์ด์ [] ๋๊ดํธ๋ก ๋ฌถ์ธ๋ค.
Unity์๋ JsonUtility๋ผ๋ ํฌํผ ํด๋์ค๊ฐ ์๋ค.
JsonUtility๋ ์ง๋ ฌํ ๊ฐ๋ฅํ ์ ํ์ธ MonoBehaviour ๋๋ [Serializable] ์์ฑ์ ์ถ๊ฐํ ์ ์๋๋ก ์์ฑํ๋ ๋ค๋ฅธ ํด๋์ค/๊ตฌ์กฐ์ฒด์์๋ง ์๋ํ๋ค.
JsonUtility๋ ๊ธฐ๋ณธํ, ๋ฐฐ์ด, ๋ฆฌ์คํธ, ๋์ ๋๋ฆฌ์์ ์๋ํ์ง ์๋๋ค.
[Serializable]
public class PlayerData
{
public int level;
public Vector3 position;
public string playerName;
}
์์ ๊ฐ์ PlayerData ๋ฐ์ดํฐ ํด๋์ค๊ฐ ์๋ค.
PlayerData myData = new PlayerData();
myData.level = 1;
myData.position = new Vector3(3.0f, 4.4f, 2.3f);
myData.playerName = "John";
์์ฒ๋ผ playerData ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
string json = JsonUtility.ToJson(myData);
ToJson ํจ์๋ฅผ ์ด์ฉํ๋ฉด myData ๊ฐ์ฒด๊ฐ ์๋์ฒ๋ผ json ํ์์ผ๋ก ๋ฐ๋๋ค.
“level”: 1,
“position”: {
“x” : 3.0,
“y” : 4.4,
“z” : 2.3 },
“playerName”: “John”
PlayerData myData = JsonUtility.FromJson<PlayerData>(json);
๋ฐ๋๋ก FromJson ํจ์๋ฅผ ์ด์ฉํ๋ฉด myData๊ฐ JSON ๋ฌธ์์ด์ ๊ฐ์ผ๋ก ์ฑ์์ง๋๋ค.
//File์ ์ด์ฉํ json ํ์ผ ์ ์ฅ ๋ฐ ๋ก๋ ์ฝ๋ ์์
using System.IO;
[System.Serializable]
class SaveData{
public Color TeamColor;
}
public void SaveColor(){
SaveData data = new SaveData();
data.TeamColor = TeamColor;
string json = JsonUtility.ToJson(data);
File.WriteAllText(Application.persistentDataPath + "/savefile.json", json);
}
public void LoadColor(){
string path = Application.persistentDataPath + "/savefile.json";
if (File.Exists(path)){
string json = File.ReadAllText(path);
SaveData data = JsonUtility.FromJson<SaveData>(json);
TeamColor = data.TeamColor;
}
}
๊ฐ์ฒด์งํฅ ์์น ์ ์ฉ
1. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ถ์ํ
*์ถ์ํ: ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ณผ ์ ์๋ ์คํฌ๋ฆฝํธ์์ ๋ณต์กํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ค์ ๋ก ํ์ํ ๊ธฐ๋ฅ๋ง ๋ ธ์ถํ๋ ํ๋ก์ธ์ค.
๋ณต์กํ ๋ด๋ถ ์๋ ๋ฐฉ์์ ์ถ์์ ์ด๋ฉด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ ์ฝ๋๋ก ๋์ฒดํ๋ค.
์๋ก, 4๋จ์ ๊ฒ์ํ๋ ์ด ๋ฉ์นด๋ ํ๋ก์ ํธ(๊ณต๋์ด)์์ Enemy ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
private void Start(){
for (int i = 0; i < 3; i++){
Instantiate(enemyPrefab, GenerateSpawnPosition(),
enemyPrefab.transform.rotation);
}
}
์์ ๊ฐ์ด Start() ๋ฌธ์ Enemy ๊ฐ์ฒด ์์ฑ์ฝ๋๋ฅผ ๋ฃ์ผ๋ฉด ์คํ์ 1๋ฒ๋ง ์คํ๋๊ณ , ๋ค์ ์์ฑํ๋ ค๋ฉด ๋ค๋ฅธ ํจ์์ ์ ์ฝ๋๋ฅผ ๋ณต์ฌ๋ถ์ฌ๋ฃ๊ธฐ ํด์ผํ๋ค. ์ค๋ณต์ฝ๋๊ฐ ๋ฐ์ํ๋ฉฐ ๋นํจ์จ์ ์ด๋ค.
// ๋ ๋์ ์์ค์ ๋ฉ์๋ ์๋ก ์์ฑ
void SpawnEnemyWave() {
for (int i = 0; i < 3; i++){
Instantiate(enemyPrefab, GenerateSpawnPosition(),
enemyPrefab.transform.rotation);
}
}
private void Start(){
SpawnEnemyWave(); // Start()๋ก ๋ ๋์ ์์ค์ ๋ฉ์๋ ํธ์ถ
}
์์ ๊ฐ์ด ์ค๋ณต๋ ์ฝ๋๋ฅผ SpawnEnemyWave() ํจ์๋ผ๋ ๋ ๋์ ์์ค์ ๋ฉ์๋๋ฅผ ์์ฑํ๋ฉด Enemy ๊ฐ์ฒด์ ์์ฑ์ด ํ์ํ ๋, ํจ์ ํ๋๋ง ํธ์ถํด์ฃผ๋ฉด ๋๋ค. ๋ค๋ฅธ ๊ณ ๋ฏผ์ ํ ํ์๊ฐ ์๋ค. ์์ ์์๋ SpawnEnemyWave() ํจ์ ์์์ ํ๋ฒ๋ง ์์ ํ๋ฉด ๋๋ค. ๊ตฌํ์์ ์ด ๋ ๊ฐ๋จํ๊ฒ ๊ฐ์ ๋์๋ค. ์ด๋ฌํ ์์ ์ ์ถ์ํ๋ผ๊ณ ํ๋ค.
2. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์๊ณผ ๋คํ์ฑ
*์์: ๊ธฐ๋ณธ ํด๋์ค(๋ถ๋ชจ ํด๋์ค)๋ฅผ ์์ฑํ๋ ํ๋ก์ธ์ค. ์ด ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ํด๋์ค(์์ ํด๋์ค)๋ฅผ ๋ง๋ฌ.
์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์๋์ผ๋ก ๊ฐ์ ธ์ค๋ฉฐ ์ด๋ฅผ ์์์ด๋ผ ํจ.
public class SomeClass : MonoBehaviour { }
Unity์์ MonoBehaviour๊ฐ ๊ธฐ๋ณธ ํด๋์ค ์ญํ ์. MonoBehaviour๋ฅผ ์์๋ฐ๊ธฐ์ OnTriggerEnter(), GetComponent, Start(), Update() ๋ฑ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์.
*๋คํ์ฑ: ๋ถ๋ชจ์๊ฒ ์์๋ฐ์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ์ฌ ์ปค์คํ ํ๋ ๊ฒ.
public class Enemy : MonoBehaviour {
public void DealDamage () {
Player.Health -= 10;
}
}
public class Thief : Enemy {
private void Update() {
if (Player.isSeen) {
DealDamage(); // ๋ถ๋ชจ ํด๋์ค๋ก๋ถํฐ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์
}
}
}
Thief ํด๋์ค์ Update()๋ฌธ์์ ํธ์ถํ DealDamage() ํจ์๋ ๋ถ๋ชจ ํด๋์ค Enemy ์ DealDamage() ํจ์๋ฅผ ํธ์ถํ๋ค.
๋ถ๋ชจ ํด๋์ค์ ์์ฑ๋ ํจ์๋ฅผ ๊ณ ๋๋ก ์ฌ์ฉ ์ํ๊ณ ์ปค์คํ ํ๊ธฐ ์ํด ์ฌ์ ์ธ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น.
public class Enemy : MonoBehaviour {
public virtual void DealDamage () { // ๊ฐ์ ํค์๋๊ฐ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํ์ฉํจ
Player.Health -= 10;
}
}
๋ถ๋ชจ ํด๋์ค์์ virtual ํค์๋๋ก ํจ์๋ฅผ ๊ตฌํํ๋ค.
๋ถ๋ชจ ํด๋์ค์์ ๋ฉ์๋๋ฅผ virtual๋ก ์๋ณํ๋ฉด ์ค๋ฒ๋ผ์ด๋๊ฐ ๊ฐ๋ฅํ๋ ํ์๋ ์๋๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก ์ค๋ฒ๋ผ์ด๋๊ฐ ์ ํ ์ฌํญ์ธ virtual ๋ฉ์๋์ ๋ฌ๋ฆฌ, abstract ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋๋์ด์ผ ํ๋ค.
public class Thief : Enemy {
// ๋ถ๋ชจ ํด๋์ค์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ ์ ์์
public override void DealDamage() {
Player.Health -= 2;
CommitPettyTheft();
}
private void Update() {
if (Player.isSeen) {
DealDamage();
}
}
}
๊ทธ๋ฌ๋ฉด ์์ ํด๋์ค์์ override ํค์๋๋ก DealDamage() ํจ์๋ฅผ ์ฌ๊ตฌํํ ์ ์๋ค.
์ด ๋, ์์ํด๋์ค์ Update()๋ฌธ์์ DealDamage()๋ Thief ํด๋์ค ๋ด๋ถ์์ override ํ DealDamage() ํจ์๋ฅผ ์๋ฏธํ๋ค.
๋ง์ฝ base ๋ ์ด๋ธ์ ์ฌ์ฉํ์ฌ base.DealDamage(); ๋ก ํธ์ถํ๋ค๋ฉด, ์๋ ๋ฉ์๋๋ฅผ ์คํํ๋ผ๋ ๋ป์ด ๋๋ค.
public virtual void GoTo(Building target){
m_Target = target;
if (m_Target != null) {
m_Agent.SetDestination(m_Target.transform.position);
m_Agent.isStopped = false;
}
}
public virtual void GoTo(Vector3 position){
m_Target = null;
m_Agent.SetDestination(position);
m_Agent.isStopped = false;
}
๋ํ, ์์/๋คํ์ฑ์ ๊ฒฝ์ฐ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ํจ์๋ฅผ ์ธ์๋ฅผ ๋ฌ๋ฆฌํ์ฌ ์ฌ๋ฌ๊ฐ ๋ง๋ค ์ ์๋ค.
public void Translate(Vector3 translation);
// transform.Translate(Vector3.forward);๋ก ๊ตฌํ๋จ
public void Translate(float x, float y, float z);
// transform.Translate(0, 0, 1);๋ก ๊ตฌํ๋จ
public void Translate(Vector3 translation, Transform relativeTo);
// transform.Translate(Vector3.forward, Space.Self);๋ก ๊ตฌํ๋จ
public void Translate(float x, float y, float z, Transform relativeTo);
// transform.Translate(0, 0, 1, Space.Self);๋ก ๊ตฌํ๋จ
Unity Rigidbody ์ Translate ํจ์๊ฐ ์ธ์๋ง ๋ค๋ฅด๊ณ ์ฌ๋ฌ๊ฐ ์ ์๋์ด ์๋ ์์๋ฅผ ๋ณด๋ฉด ํ ์๋ฟ์ ๊ฒ์ด๋ค.
์์๋ฌธํญ)
* ํ์ฅ๋ฉ์๋
: ๊ธฐ์กด ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๊ธฐ๋ฒ. ์์๊ณผ๋ ๋ค๋ฆ
ํด๋์ค์ ์ธ๋ถ์์ ํด๋์ค์ ๋ฉ์๋์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ ์๋ก์ด ๋ฉ์๋๋ฅผ ๋ง๋๋ ๊ธฐ๋ฅ.
ํ์ฅ๋ฉ์๋๋ static ํด๋์ค์์ ์ ์ํด์ผ ํ๋ค.
public class OriginClass {
public void Print1(){
Console.WriteLine("Print1() Method Call");
}
public void Print2(){
Console.WriteLine("Print2() Method Call");
}
public void Print3(){
Console.WriteLine("Print3() Method Call");
}
}
public static class ExtensionMethod {
public static void Print4(this OriginClass O){
Console.WriteLine("Print4() Method Call");
}
public static void Print5(this OriginClass O, String str){
Console.WriteLine("Print5() Method Call");
Console.WriteLine("Print5() Param: " + str);
}
}
class Program{
static void Main(string[] args){
OriginClass originClass = new OriginClass();
originClass.Print4();
originClass.Print5("Hello!");
}
}
์ถ์ฒ: https://developer-talk.tistory.com/477
์์๋ฌธํญ)
*์ธํฐํ์ด์ค
: ์ธํฐํ์ด์ค์์ ๋ชธ์ฒด์๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ํด๋์ค๋ค์์ ์์๋ฐ์์ ์ฌ์ฉํ๋ค.
: ๋จ ์์๋ฐ์ ํด๋์ค๋ค์ ์ธํฐํ์ด์ค์ ๋ฉค๋ฒ๋ฅผ ๋ฐ๋์ ๊ตฌํํด์ค์ผ ํ๋ค.
: ์ถ์ ํด๋์ค์์ ์ฐจ์ด์ ์ ์ถ์ํด๋์ค๋ ๋ค์ค์์์ ์ง์ํ์ง ์์ง๋ง ์ธํฐํ์ด์ค๋ ๋ค์ค์์์ ์ง์ํ๋ฉฐ, ์ธํฐํ์ด์ค ์์ฒด๋ก ์ธ์คํด์ค ์์ฑ์ด ์๋๋ค.
namespace InterfaceEx{
class Program {
static void Main(string[] args) {
Person myPerson = new Person();
Lion myLion = new Lion();
Camel myCamel = new Camel();
myPerson.Eat();
myLion.Eat();
myCamel.Eat();
Console.WriteLine();
MyEatFunc(myPerson);
MyEatFunc(myLion);
MyEatFunc(myCamel);
}
private static void MyEatFunc(object obj) {
IAnimal target = obj as IAnimal;
if (target != null) {
target.Eat();
}
}
}
class Person : IAnimal{
public void Eat(){ Console.WriteLine("๋ฐฅ์ ๋จน์ต๋๋ค."); }
}
class Lion : IAnimal{
public void Eat() { Console.WriteLine("๊ณ ๊ธฐ๋ฅผ ๋จน์ต๋๋ค."); }
}
class Camel {
public void Eat(){ Console.WriteLine("ํ์ ๋จน์ต๋๋ค."); }
}
interface IAnimal{
void Eat();
}
}
์ถ์ฒ: https://frozenpond.tistory.com/27
=> ์คํ๊ฒฐ๊ณผ:
๋ฐฅ์ ๋จน์ต๋๋ค.
๊ณ ๊ธฐ๋ฅผ ๋จน์ต๋๋ค.
ํ์ ๋จน์ต๋๋ค.
๋ฐฅ์ ๋จน์ต๋๋ค.
๊ณ ๊ธฐ๋ฅผ ๋จน์ต๋๋ค.
=> ํด์:
MyEatFunc(object obj) ํจ์์์ myCamel์ IAnimal ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ target์ด ๋์ง ์์์ Eat() ํจ์๋ฅผ ์คํํ์ง ์๋๋ค.
3. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์บก์ํ
์ฝ๋์ ์์ ์ฑ์ ์ํด ์ก์ธ์ค ๊ถํ์ ์ ์ดํ ์ ์๋๋ก ๊ฐ์ธ๋ ๊ฒ.
์ฝ๋๊ฐ ์๋ ์๋ํ ๋๋ก๋ง ์ฌ์ฉ๋๊ณ ํ๋ก๊ทธ๋๋จธ๊ฐ ์กฐ์ํ๋ ๊ฐ๊ณผ ๋ฐ์ดํฐ๊ฐ ์์๋์ง ์๋๋ก ๋ณด์ฅํ๋ ํ๋ก์ธ์ค.
*์ ๊ทผ์ ์ด์: private, public, protected, default
1) private ๋ณ์ ์ธ์คํํฐ์ ๋ ธ์ถ์ํค๊ธฐ
public class Rabbit : MonoBehaviour {
[SerializeField] // ์ธ์คํํฐ์ private ๋ณ์ ํ์
private Color furColor;
}
์๋ private ์ ๊ทผ์ ์ด์๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์คํํฐ์ ๋ ธ์ถ์ด ์๋๋ค.
ํ์ง๋ง, ์ง๋ ฌํ๋ฅผ ์ด์ฉํด์ [SerializeField] ํ๊ทธ๋ฅผ ์ถ๊ฐํ์ฌ private ๋ณ์๋ฅผ ์ธ์คํํฐ์ ๋ ธ์ถํ๋ฉด์๋ ๋ค๋ฅด ์ฝ๋์์๋ ๋ ธ์ถํ์ง ์๋๋ก ๋ง๋ค ์ ์๋ค.
2) public ๋ณ์ ๋ณดํธํ๊ธฐ
public static MainManager Instance;
public ์ด์ด์ผ๋ง ํ๋ ๋ณ์๋ฅผ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ static ํค์๋๋ฅผ ์ด์ฉํ๋ค.
ํ์ง๋ง Instance์ ์ ๊ทผํ get(), se() ํจ์๊ฐ ์๋ค๋ฉด MainManager.Instance ํธ์ถ ์ ์๋ฌ๊ฐ ๋๋ค.
public static MainManager Instance
{
get {return Instance;}
set {Instance = this;}
}
์ ๋ํฐ์์๋ get, set ํค์๋๋ฅผ ์ฌ์ฉํด์ ์๋์ผ๋ก get(), set() ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋กํผํฐ๊ฐ ์๋ค.
public static MainManager Instance { get; set; } // private ์ธํฐ ์ถ๊ฐ
๋ ๋์๊ฐ์ get, set ํ๋กํผํฐ ์์ return, ๋์ ๊ตฌ๋ฌธ์ ์๋ฃ์ด๋ ๋๋ ์๋ ๊ตฌํ ํ๋ฌํผํฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
3) get, set ์, ์กฐ๊ฑด ๋ถ์ฌํ๊ธฐ
private float m_ProductionSpeed = 0.5f;
public float ProductionSpeed // ์ธ๋ฏธ์ฝ๋ก ์ญ์
{
get { return m_ProductionSpeed; } // ๊ฒํฐ์์ ์ง์ ํ๋ ๋ฐํ
set { m_ProductionSpeed = value; } // ์ธํฐ์์ ์ง์ ํ๋ ์ฌ์ฉ
}
์ ์ฒ๋ผ public ํ๋กํผํฐ์ ์ก์ธ์คํ ๋ ์ง์ ํ๋๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ํ ๋นํ๋ get ๋ฐ set ํจ์๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํ ์๋ ์๋ค.
set{
if (value < 0.0f) {
Debug.LogError("You can't set a negative production speed!");
}
else{
m_ProductionSpeed = value; // ์๋ ์ธํฐ๊ฐ ํ์ฌ if/else ๋ฌธ์ ์์
}
}
์ ์ฒ๋ผ ์กฐ๊ฑด๋ฌธ์ ์ถ๊ฐํด์ ์ง์ ํด์ค ์๋ ์๋ค.
4. ์ฝ๋ ํ๋กํ์ผ๋ง
*์ ๋ํฐ ํ๋กํ์ผ๋ฌ: ์คํฌ๋ฆฝํธ ํธ์ถ, ๋ฉ๋ชจ๋ฆฌ ํ ๋น, ๋ ๋๋ง ๋ฑ ํ๋ก์ ํธ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ ๋ชจ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Window > Analysis > Profiler
์๋จ: CPU ์ฌ์ฉ ํํฉ์ด ๋ด๊ธด ์ฐจํธ๊ฐ ๋ณด์ฌ์ง.
ํ๋จ: ๊ฐ ํ๋ ์์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์๊ฐ์ ์ผ๋ก ์์ฝ๋ ๋ด์ฉ์ด ๋ณด์ฌ์ง.
์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด Scripts์ ์์ฒญ๋ ์๊ฐ์ด ์์๋๋ ๊ฒ์ ๋ณผ ์ ์์. ์ฆ Script์ ๋ฌธ์ ๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ด ๋ง์.
์๋จ ๊ทธ๋ํ์์ CPU ์ฌ์ฉ๋์ด ๊ธ์ฆํ๋ ๊ตฌ๊ฐ์ ํด๋ฆญํด์ ํ๋จ์ ์ดํด๋ณด๋ฉด CPU: 117.26ms ์์ ์ ์ ์์
CPU ms๋ ํด๋น ํ๋ ์์ ๋ชจ๋ ์์ ์ ์๋ฃํ๋ ๋ฐ ์์๋ ์ด ์๊ฐ(๋ฐ๋ฆฌ์ด)์ ๋ํ๋ ๋๋ค.
1,000ms / ๋ชฉํ ์ด๋น ํ๋ ์ ์ = ๋ฐ๋ฆฌ์ด ์์ฐ
๋ชฉํ ์ด๋น ํ๋ ์์๊ฐ 60FPS์ด๋ผ๋ฉด ๊ฐ ํ๋ ์์ ๋ฐ๋ฆฌ์ด ์์ฐ์ 16์. 117.26ms๋ ์ฝ 7๋ฐฐ...
* Player Loop: ๊ฒ์ ์์ฒด์์ ์คํ ์ค์ธ ๋ชจ๋ ์์
* EditorLoop: ์๋ํฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ๋ฐ์ํ๋ ๋ชจ๋ ์์ .
=> ์ค์ ๊ฒ์์ Editor์์ ํ๋๊ฒ ์๋๋ฏ๋ก Player loop๋ง ๋ณด๋ฉด ๋จ.
* ์ฝ๋์ ํน์ ์น์ ํ๋กํ์ผ๋ง
Profiler.BeginSample("Moving"); // ํ๋กํ์ผ๋ง ์์
Move();
Profiler.EndSample(); // ํ๋กํ์ผ๋ง ์ข
๋ฃ
ํน์ ๋ถ๋ถ์ Profiler.BeginSample(), Profiler.EndSample() ์ ์คํํ๋ฉด ํ๋กํ์ผ๋ฌ์์ ๋ฌธ์ ๊ฐ ์๊ธด ๋ถ๋ถ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ ์๋ค.
void Move() {
Vector3 position = transform.position;
float distanceToCenter = Vector3.Distance(Vector3.zero, position);
float speed = 0.5f + distanceToCenter / areaSize.magnitude;
int steps = Random.Range(1000, 2000);
float increment = Time.deltaTime / steps;
for (int i = 0; i < steps; ++i) {
position += currentVelocity * increment * speed;
}
transform.position = position;
transform.position = transform.position + currentVelocity * Time.deltaTime;
}
void Move() {
transform.position = transform.position + currentVelocity * Time.deltaTime;
}
Moveํจ์์ ๊ธด ์ฝ๋๋ฅผ ์ด๋ํ์๋ง ํ๋๋ก 1์ค๋ก ๋ณ๊ฒฝํ์๋ค.
์ฝ๋ ๋ณ๊ฒฝํ ๋ค์ ํ๋กํ์ผ๋ฌ๋ฅผ ๋๋ ค๋ณด์.
์ด์ ์๋ Move ์ฝ๋๋ฅผ ์๋ฃํ๋ ๋ฐ 99.74ms๊ฐ ์์๋์๋๋ฐ, ์ต์ ํ ๋ณ๊ฒฝ ํ์๋ ์์ ์๊ฐ์ด 1.08ms ์ด๋ค.
์ด CPU ms๋ ํ๊ฒ์ธ 16ms๋ณด๋ค ์งง์ 14.94ms๋ก ๋จ์ถ๋์๋ค.