Graditude Project Wiki : VR Rhythm Game - UAVisonline/Portfolio GitHub Wiki
ํด๋น ๊ฒ์ ํ๋ก์ ํธ๋ ํ์์ ํ์๋ํ๊ต ์กธ์
์ ์ํด ์งํ๋ ํ๋ก์ ํธ์ด๋ฉฐ, ์ด 3๋ช
์ ํ์ผ๋ก ํ๋ก์ ํธ ๊ธฐํ ๋ฐ ์ ์์ด ์งํ๋์๋ค.
ํด๋น ํ๋ก์ ํธ๋ VR(Oculus Rift 1)์ผ๋ก ํ๋ ์ด ํ๋๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ฒ์ ๋ด 6๊ฐ์ง ์์
์ ๋ฐ๋ผ ์์ ๋์ค๋ ๋ฌผ์ฒด๋ฅผ ํ์ด๋ฐ์ ๋ง์ถฐ์ ์ฃผ๋จน์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋๋ค. ๋ํ 5๊ฐ์ ์์
์ ๋ํด์ ์ฃผ๋ณ ํ๊ฒฝ ๋ด ์ฐ์ถ์ด ์กด์ฌํ๋ฉฐ ํด๋น ์กธ์
ํ๋ก์ ํธ์์๋ ์ด๋ฌํ ์ฐ์ถ์ด ์ฌ์ฉ์์๊ฒ ์ด๋ ํ ์ํฅ์ ๋ฏธ์น๋์ง ํ์
ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
ํด๋น ํ๋ก์ ํธ๋ 2022๋ 3์๋ถํฐ ๊ฐ๋ฐ์ด ์งํ๋์์ผ๋ฉฐ 2023๋ 7์ ๋ง ๊ฐ๋ฐ์ด ์๋ฃ, 8์ ์ฌ์ฉ์ ์กฐ์ฌ ๋ฐ ๋ณด๊ณ ์ ์์ฑ์ ํตํด ํ๋ก์ ํธ๊ฐ ์๋ฃ๋์๋ค.
์ด๋ฒ Wiki์์๋ ํด๋น ํ๋ก์ ํธ ๋ด์์ ํ์๊ฐ ๋งก์ ๊ฐ๋ฐํ ์์ญ์ ๋ํด ์์ ํ๊ณ ์ ํ๋ฉฐ ์ด๋ฅผ ์์ฝํ๋ฉด ์๋์ ๊ฐ๋ค.
-
๊ฒ์ ๋ด ์์ ๋ฐ ์ฐ์ถ, ๋์ด๋ ์ ํ ๊ธฐ๋ฅ
-
์์ ์ ๋ฐ๋ฅธ ๊ฐ์ํ์ค ์ฐ์ถ ํจ๊ณผ ์ ์ด
1.ํ๋ ์ด๋ฅผ ์ํด์ ๊ฒ์์ ์ด๋ ํ ์ ๋ณด๋ฅผ ๋ด์์ผ ํ๋๊ฐ? (Unity - ScriptableObject)
ํด๋น ๊ฒ์์ 6๊ฐ์ง ์์ ์ ๋ํด ์ฐ์ถ, ๋์ด๋ ๋ฐ ๋ฉํฐํ๋ ์ด ์ ๋ฌด๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ ์ด์ ๋ฐ๋ผ ์ค์ ๊ฒ์์ ๋ด์ฉ์ด ๋ณํํ๋ค. ์ฐ์ ์ด๋ ์ ์์๊ฐ ์์ ํญ๋ชฉ์ ๋ํด์ ๊ณ ๋ คํ ์์๋ ์๋์ ๊ฐ๋ค.
1. ์์
์ ๋ชฉ ๋ฐ ์๊ณก๊ฐ ์ด๋ฆ
2. ์ฌํท ์ด๋ฏธ์ง
3. ์์
์์
4. ์์
๋์ด๋์ ๋ฐ๋ฅธ ํจํด ๋ฐ ํด๋น ๋์ด๋ level
5. ์์
์ฐ์ถ ์ค์ ์ ๋ฐ๋ฅธ ์ฐ์ถ๊ฐ๋
์ค๋ธ์ ํธ (2. ์์
์ ๋ฐ๋ฅธ ๊ฐ์ํ์ค ์ฐ์ถ ํจ๊ณผ ์ ์ด์์ ์ค๋ช
)
์ด๋ฌํ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ ํด๋์ค Script๋ฅผ ๋ง๋ค ์ ์์ง๋ง, ์ด๋ฅผ ๊ฒ์ ๋ด ๊ฐ์ฒด๋ก ์ ์ฅํ๋ฉด ๊ฐ ์์ ๋ง๋ค ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ด์ผํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค. ๋ณ๊ฒฝ๋์ง ์๋ ๋จ์ํ ์ ๋ณด๋ฅผ ์ ์ฅ/๋ถ๋ฌ์ค๋ ์ฉ๋๋ก ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ์๋ ๋ถํ๊ฐ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ํด๋น ํ๋ก์ ํธ์์๋ Unity์ ScriptablObject๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
ํ๋ก์ ํธ์๋ MusicTemplateObject๋ผ๋ Script๊ฐ ์์ผ๋ฉฐ ํด๋น Script๋ ์๋์ ๊ฐ์ ์ฝ๋ ๋ด์ฉ์ ํตํด ์์์ ์ธ๊ธํ ์ ๋ณด๋ฅผ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ, ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
10 [TabGroup("UI Component")] [SerializeField] private Sprite album_jacket;
...... // ๋ฐ์ดํฐ ๋ณ์
27 [BoxGroup("Director Object")] [SerializeField] private GameObject nothing_director;
29 public Sprite get_album_jacket()
...... //๋ฐ์ดํฐ ๋ฐํ ํจ์
96 public GameObject get_nothing_stage()
๋ํ ๊ฒ์ ๋ด ํจํด ๋ฐ์ดํฐ(MusicPatternObject Script)๋ ScriptableObjectํ์์ผ๋ก ํ์ ์์ฑ, ํจํด ๋ฐ์ดํฐ ๋ด ๊ฐ ๋ ธํธ์ ๋ํ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋๊ฒจ์ฃผ๋ ๋ฐํํจ์๋ฅผ ํตํด ์ค์ ๊ฒ์๊ณผ ์ํธ์์ฉ ํ๋๋ก ํ์๋ค. ๋จ ํด๋น ScriptableObject๋ ์ ์ํธ์๋ฅผ ์ํด ์๋์ ๊ฐ์ ํจ์๊ฐ ์ถ๊ฐ๋์ด์๋ค.
1. set_temp_position : ๋
ธํธ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์์น ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด๊ฐ์ ์ฝ์ด์ Vector ์์น๊ฐ์ ํ ๋นํ๋ ํจ์ (3๋ฒ ๊ฐ์ ํจ์๋ก ๋ณ๊ฒฝ)
2. apply_reference : reference TextAsset์ ์ฝ์ด์ ๋
ธํธ ๋ฐ์ดํฐ์ ์๊ฐ ๋ฐ ์์น ๊ตฌ์กฐ์ฒด ๊ฐ์ ์ฝ๋ ํจ์
3. amke_pattern_using_reference : ์ 2๋ฒ ํจ์์์ ์ฝ์ ์๊ฐ/์์น ๊ตฌ์กฐ์ฒด ๊ฐ์ ์ด์ฉํด ์ค์ ๋
ธํธ ๋ฐ์ดํฐ๋ฅผ ์ฑ์ฐ๋ ํจ์
2. ์ ์ ๋ณด๋ฅผ ๊ฒ์ ์์คํ ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋๊ฐ? (AlbumSelect Script ๋ฐ GameStart Script)
์ค์ ๊ฒ์ ๋ด์์๋ ์ฌ์ฉ์๊ฐ ์ ์์ ์ ๋ณด๋ค์ ์ ํํ ์ ์์ด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์ํด ๊ฒ์ ๋ด์์ ์ ํ ์ค๋ธ์ ํธ๊ฐ ํ์ํ๋ค. ํด๋น ์ ํ ์ค๋ธ์ ํธ ๋ด์๋ AlbumSelect Script๊ฐ ์์ผ๋ฉฐ, ํด๋น Script์๋ ๋ ธ๋์ ๊ดํ ์ ScriptablObject ๋ฐฐ์ด ๋ฐ ํ์ฌ ๊ฐ๋ฆฌํค๋ ๋ ธ๋ index ๋ณ์ ๋ฐ ๋์ด๋, ์ฐ์ถ๋ชจ๋, ๋ฉํฐ์ ํ๋ชจ๋ ์ด๊ฑฐ์ฒด ๋ณ์๊ฐ ์กด์ฌํ๋ค.
๊ฒ์์ด ์์ํ๋ฉด AlbumSelect Script์์๋ ์ 4๊ฐ์ง ๋ณ์ 4๊ฐ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ฉฐ function_about_clip_change()๋ผ๋ ํจ์๋ฅผ ์ด์ฉํด ์์ ์ฌ์ ๋ฐ Text UI์ ํด๋น ์์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋ค. ๊ทธ ๋ค ์, ๋ค ๋ฒํผ์ ์ด์ฉํด index๊ฐ์ ๋ณํํ๊ณ ์ ํจ์๋ฅผ ๋ค์ ์คํํด ์ ๋ณด๋ฅผ ๋ณ๊ฒฝ, ๋์ด๋ ๋ฐ ์ฐ์ถ, ๋ฉํฐํ๋ ์ด ๋ฒํผ์ ๋๋ฅด๋ ๊ฒ์ผ๋ก ์ด๊ฑฐ์ฒด ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ค.
๊ทธ ๋ค ํ๋ ์ดํ ์์ ๋ฐ ๋์ด๋, ์ฐ์ถ์ ๋ฌด๋ฅผ ๊ณ ๋ฅด๊ณ ๊ฒ์์์์ ๋๋ฅด๋ฉด GameStart Script์์ AlbumSelect Script ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ GameManager์ ์ง์ด ๋ฃ์ํ Play field๋ก ์ ํํ๋ค. Play field์์๋ GameManager์์ ๋ฐฉ๊ธ ๋ฐ์์จ ์ ๋ณด๋ฅผ ์ฝ์ด ์์ ๋ฐ ๋ ธํธ, ์ฐ์ถ์ฅ์น๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๋ฉฐ, 3๊ฐ์ง ๋ชจ๋ ์์ฑ์ด ๋์์ ๋ ์์ ์ ์คํ์์ผ์ ๋ ธํธ ๋ฐ ์ฐ์ถ์ฅ์น๋ฅผ ์๊ฐ์ ๋ง์ถฐ ๋์์ํจ๋ค.
GameManager๋ ์ค์ ๊ฒ์ ํ๋ ์ด Scene์ผ๋ก ์ด๋ํ๊ฒ ๋๋ ๊ฒฝ์ฐ, 1-1์์ ์ธ๊ธํ 5๋ฒ ์ฐ์ถ๊ฐ๋
์ค๋ธ์ ํธ๋ฅผ ๋
ธ๋์ ๋ฐ๋ผ ๋ถ๋ฌ์ค๊ฒ ๋๋ค.
ํด๋น ์ฐ์ถ๊ฐ๋
์ค๋ธ์ ํธ๋ ๋
ธ๋์ ๋ฐ๋ฅธ ๋ค์ํ ๊ฐ์์ฐ์ถ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ด๋ฅผ ์ ์ ํ ์์ ์ ๋ง์ถ์ด ๋ฐ๋ํ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
์๋ 2๊ฐ์ง ํญ๋ชฉ์ ํตํด ํด๋น ๋ฐฉ์์ ์ด๋ป๊ฒ ๋ง๋ค์๋์ง ์ค๋ช
ํ๊ณ ์ ํ๋ค.
๋ ธ๋ ๋ด ๊ฐ์ ์ฐ์ถ์ ๋ถ, ์๋ก์ด ๋น, ํ๋๊ต์ฒด, ์ค๋ธ์ ํธ์ ์๊น๋ณ๊ฒฝ ์ธ ๋ค์ํ ์ฐ์ถ๋ค์ด ์กด์ฌํ๋ค. ์ด๋ฌํ ์ฐ์ถ์ ๊ด๋ฆฌํ๊ณ ์ ์ฐ์ ๊ฐ ์ฐ์ถ์ ๊ณตํต์์๋ก ๋ฌถ์ด์ ์ ๋ฆฌํ๊ณ ์ ํ์ผ๋ฉฐ, ์๋ 3๊ฐ์ง๋ก ๊ฐ์ ์ฐ์ถ์ ์ ๋ฆฌํ ์ ์์๋ค.
1. ๋น๊ณผ ๊ฐ์ ๊ด์์ ๊ฐ์ง ์ฐ์ถ์ค๋ธ์ ํธ(LightObject.cs)
2. ํํฐํด ํจ๊ณผ๋ฅผ ์์ฑํ๋ ์ฐ์ถ์ค๋ธ์ ํธ(ParticleDirectObject.cs)
3. ๊ทธ ์ธ ํจ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฐ์ถ์ค๋ธ์ ํธ(DirectGameObject.cs)
๊ฐ ์ฐ์ถ ์ค๋ธ์ ํธ๋ ํ์ Component๋ฅผ ์๊ตฌํ๋ฉฐ, ์ด๋ฅผ ์ด์ฉํด ์ฐ์ถ์ ๊ตฌํ/์ฌ์ํ๋ค.
๋ํ ๊ธฐ๋ณธ์ ์ธ function์ด ์ฐ์ถ ์ค๋ธ์ ํธ ๋ง๋ค ๋ฐ๋ก ์กด์ฌํ๋ฉฐ ์ด๋ฅผ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
๊ด์์ฐ์ถ ์ค๋ธ์ ํธ (LightObject.cs)
ํ์Component : Unity Light Component (Unity ๋ด ๊ด์ Component๋ฅผ ์ด์ฉํด ๊ฒ์ ๋ด ๊ด์ ์ฐ์ถ์ ์ ์ฉ)
๊ถ์ฅComponent : Reference GameObject (์ ๋ฐ๊ดํจ๊ณผ๋ฅผ ๊ฐ์ง ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ผ๋ฉด ํด๋น GameObject Reference๊ฐ ํ์)
function
- set_color_instant(Color color) : ๋งค๊ฐ๋ณ์ color๊ฐ์ผ๋ก ๊ด์์ ์๊น ๋ณ๊ฒฝ,
๋ํ Ref GameObject๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น Object์ material EmissionColor๋ ํด๋น color๋ก ๋ณ๊ฒฝ
ํํฐํด ์ค๋ธ์ ํธ (ParticleDirectObject.cs)
ํ์Component : Unity ParticleSystem Component List (ํํฐํดํจ๊ณผ๋ฅผ ์ฌ์ํ๋ Unity Component๋ฅผ ์ด์ฉํด ๊ฒ์ ๋ด ํํฐํด ์ฐ์ถ)
function
- play & stop : ์ Component List ๋ด ๋ชจ๋ ํํฐํด ํจ๊ณผ๋ฅผ ์ฌ์ ํน์ ์ค๋จ
์ฐ์ถ์ค๋ธ์ ํธ (DirectGameObject.cs)
๊ถ์ฅ Component : Unity Animator Component (์ค๋ธ์ ํธ์ ์ ๋๋ฉ์ด์
์ ๋ฐ๊ฟ๊ฒฝ์ฐ ์ฌ์ฉํด์ผํ๋, ์ ๋๋ฉ์ด์
์ ๋ฐ๊ฟ ํ์์๋ ์ค๋ธ์ ํธ์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ์ง ์์)
function
- play_animation(string name) : name์ด๋ฆ์ Animation์ ์คํํด์ ์ ์ฉ, ์ Animator Component๊ฐ ํ์
- function0~4 : ๊ฐ์ํจ์, ์์ํ Script์์ ์ค๋ฒ๋ผ์ด๋ฉํด ์์ธ ๋ด์ฉ์ ๊ตฌํ
GameManager๊ฐ ์ค์ Game Scene์ผ๋ก ์ด๋ํ๊ฒ ๋๋ ๊ฒฝ์ฐ, ์์์ ๋งํ๋๋ก ๋ ธํธ ํจํด ๋ฐ ์ฐ์ถ์ฅ์น๋ฅผ ๋ง๋ ๋ค๊ณ ํ์๋ค. ์ด ๋ ์ฐ์ถ์ฅ์น๋ 1-1์ 5๋ฒ ํญ๋ชฉ์ด GameManager StageObject์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉฐ, ์ด๋ฅผ Game Scene ๋ด GetDirector Object๊ฐ GameManager์ making_Stage function์ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ์์ฑ๋๋ค.
making_Stage function์ ์ฐ์ถ์ฅ์น๋ฅผ ์์ฑํ ๋ค GameManager์ game_director ๋ณ์๋ฅผ true๋ก ๋ง๋ค์ด ์ฐ์ถ์ฅ์น๊ฐ ์ค๋น๋์๋ค๋ ๊ฒ์ ์ ๋ฌ, ๋ ธํธํจํด๋ ๋น์ทํ ๋ฐฉ์์ ํตํด ์ค๋น๊ฐ ๋์๋ค๋ ๊ฒ์ GameManager์๊ฒ ์ ๋ฌํ์ฌ 2๊ฐ์ ๋ณ์๊ฐ ๋ชจ๋ true์ธ ๊ฒฝ์ฐ ์ค์ ์์ ์ ์ฌ์ํ๊ฒ ๋๋ค.
์ด ๋ GameManager๋ ์ฐ์ถ์ฅ์น DirectorObject์๊ฒ ํ์ฌ ์์ ์ ์ฌ์์๊ฐ์ ๋งค ํ๋ ์๋ง๋ค ๋ณ์๋ก ์ ๋ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ DirectorObject๋ ์ด๋ฅผ ์ด์ฉํด ์์ ์๊ฒ ์ ๋ ฅ๋ ์ฐ์ถ์ ํ์ธ, ์์ ์ ์๊ฐ์ด ์ฐ์ถ์ด ๋ฐ์๋์ด์ผํ ์๊ฐ์ ๋์์ ๊ฒฝ์ฐ ํด๋น ์ฐ์ถ์ ์ฌ์ํ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. (DirectorObject.cs : Direct_update function)
DirectorObject Script๋ direct_information ์ง๋ ฌํ ๊ตฌ์กฐ์ฒด๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ํด๋น ๊ตฌ์กฐ์ฒด๋ ๋ช ๋ น์ด(string), ์คํ์ง์ (float), ์ ์์ธ์ ๋ฐ ์ค์์ธ์, ์ฌ์์ฉ ์ ์์ธ์ 5๊ฐ์ง ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. ์ฐ์ถ์ ์์๋ DirectorObject ๋ด ํด๋น ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด์ ์ฑ์ ๋ฃ๋ ๊ฒ์ผ๋ก ์ด๋ค ์ฐ์ถ์ ์ด๋ป๊ฒ ์ฌ์ํ ์ง ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
DirectorObject๋ ์ 3๊ฐ์ง ์ฐ์ถ์ค๋ธ์ ํธ๋ฅผ List ํํ๋ก ์ฐธ์กฐํ๊ณ ์์ผ๋ฉฐ ๊ตฌ์กฐ์ฒด์ ์ ์์ธ์ ๋ฐ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ํน์ ์ฐ์ถ์ค๋ธ์ ํธ์ ์ ๊ทผ ๋ฐ ํจ์ํธ์ถ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฅผ ์ด์ฉํด ์์ ์ ํน์ ์์ ์์ ์ฐ์ถ์ค๋ธ์ ํธ๋ฅผ ์ฌ์/์ ์ง/์ฐ์ถ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ, Direct_update function์ ๋ด์ฉ์ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ์๋ก์ด ๊ณตํต ์ฐ์ถ๋ช ๋ น์ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
-
DirectObject์ function์ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ ๊ฒ์ผ๋ก ๊ฐ๋ณ ์ฐ์ถ ์ค๋ธ์ ํธ์ ์ธ์ธํ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๊ฒ์ด ๊ฐ๋ฅ, ์ด๋ ๊ณตํต ์ฐ์ถ๋ช ๋ น 'GameObject_function'์ผ๋ก ์ฒ๋ฆฌ
-
๋ ธ๋์ ๋ฐ๋ฅธ ๋ฉ์ธ๊ด์ ๋ฐ Skybox๊ฐ ๋ค๋ฅผ ์ ์์, ์ด๋ DirectorObject์ sun_object, first_skybox ๋ณ์๋ฅผ ์ด์ฉํด ์กฐ์ ํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ์ํ ๊ณตํต ์ฐ์ถ๋ช ๋ น๋ ์กด์ฌ
-
์ถ์ํ๋ 3๊ฐ์ง ์ฐ์ถ์ค๋ธ์ ํธ๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ณตํต ์ฐ์ถ๋ช ๋ น์ ์ฌ์ฉ, ๋ฐ๋ผ์ Particle์ ๋ํด DirectObject ๋ช ๋ น์ ์ฌ์ฉํ๋ ๊ฒ์ ์์คํ ์ ๋ถ๊ฐ๋ฅ