Project Emerald (Horizontal Scroll Game) - UAVisonline/Portfolio GitHub Wiki
Project Emeraldλ 'λͺ¨λͺ¨λλΌ : λ¬ μλμ μ§νΌκ³‘'κ³Ό κ°μ ν‘μ€ν¬λ‘€ μ‘μ κ²μμ λ§λ€κ³ μ νλ λͺ©μ μΌλ‘ μ μν Gameμ΄λ€. ν΄λΉ Gameμ νλ μ΄μ΄λ₯Ό μ‘°μ’ ν΄, μ μ μμ λ©° μΈμμ νννλ κ²μ λͺ©νλ‘ μΌμΌλ©° μ΄λ¬ν λΆλΆμ μμ΄μ μ¬μ©μμ 컨νΈλ‘€ μμλ₯Ό μκ·Ήνλλ‘ μ μλμλ€.
ν΄λΉ νλ‘μ νΈλ 2019λ μ μ ν, μ λν°μ λ€μ μ μνκ³ μ μ μμ μμνμλ€. λν νμμ μ€λ ₯μ λΉν΄ κΈ°νν κ²μμ΄ λ§€μ° λ°©λνμ¬μ 체νμ΄ κ°λ₯ν μ λλ‘λ§ μ μ ν μ°¨ν λ€μ μ μν κ²μ λͺ©νλ‘ νμ¬ κ°λ°μ μ€μ§νλ€.
ν΄λΉ νλ‘μ νΈλ₯Ό μ§ννλ©΄μ μ¬μ©ν κ·Έλν½μ μ§μ μμλ‘ μ μνμμΌλ©°, μ¬μ΄λμ κ°μ λΆλΆμ freesound.orgμμ λ€μ΄λ‘λν΄ μ¬μ©νμλ€.
ν΄λΉ νλ‘μ νΈμ λν μν€μμλ μλμ κ°μ λΆλΆμ λν΄ μ€λͺ νκ³ μ νλ€.
- νλ μ΄μ΄ μΊλ¦ν° μ‘°μμ μν΄ μ€ν¬λ¦½νΈλ₯Ό μ΄λ»κ² μμ±νμλκ°?
- μ μ ꡬννκΈ° μν΄ μ€ν¬λ¦½νΈλ₯Ό μ΄λ»κ² μμ±νμλκ°?
- μ§κΈ μμ μμ νλ‘μ νΈμ μμ¬μ΄ λΆλΆμ 무μμΈκ°? μ΄λ₯Ό μ΄λ»κ² μμ ν΄μΌ μ’μκΉ?
νλ μ΄μ΄ μΊλ¦ν° μ‘°μμ λ΄λΉνλ PlayerController Scriptλ 물리μ μΈ κ°μ κ°μ§λ μμ§μμ λν΄μ λ§€ νλ μλ§λ€ νΈμΆνλ Update ν¨μκ° μλ μΌμ μκ°κ°κ²©λ§λ€ νΈμΆλλ FixedUpdateλ₯Ό μ¬μ©ν΄ μ²λ¦¬νλλ‘ μ§μ¬μ Έ μλ€.
νλ μ΄μ΄ μΊλ¦ν°κ° λ μμ μμ΄μ μμ§μΌ μ μμλ, λ μμ μμ§λ§ 곡격μ νκ³ μμ λ, λ μμ μμ§μκ³ λ¨μ΄μ§κ±°λ, μ νν΄ μ¬λΌκ° λμ κ°μ΄ μΊλ¦ν°μ μν©μ λ°λΌ μμ§μ μ²λ¦¬λ₯Ό λ€λ₯΄κ² ν΄μΌνλ€. μ΄λ₯Ό μν΄ Scriptλ μμ μ νμ¬ νλμ λν μ 보λ₯Ό λνλ΄λ μ΄κ±°μ²΄ λ³μ player_stateλ₯Ό κ°μ§κ³ μμΌλ©°, FixedUpdateλ ν΄λΉ λ³μλ₯Ό 쑰건μΌλ‘ μ¬μ©ν΄ νλ μ΄μ΄μ μμ§μμ μ²λ¦¬νλ€.
85 RaycastHit2D[] hit2D = Physics2D.RaycastAll(transform.position - new Vector3(0.2f, 0.2f, 0.0f), Vector2.right, 0.4f); // λ μ΄μΊμ€νΈλ₯Ό ν΅ν μ§μκ³Όμ μΆ©λ 체ν¬
bool ground = false;
foreach(var hit in hit2D)
{
if(hit.collider.CompareTag("Ground"))
{
ground = true;
break;
}
}
if (ground) // νλ μ΄μ΄κ° λ
μ μλ κ²½μ°
{
Can_Jump = true;
if(!Input.GetKey(KeyCode.D)) // μ νν€ μ
λ ₯ μ€μ΄ μλ κ²½μ°
{
up_time = 0.0f; // μ ν μκ° 0μΌλ‘ μ΄κΈ°ν
}
}
else if (rb.velocity.y < 0.0f && !ground) // 곡μ€μμ λ¨μ΄μ§λ μ€
{
Can_Jump = false;
up_time = up_time_limit + 0.1f; // νμ¬ μ ννλ μκ° κ°μ λ°κΏ κ°μ λ‘ μ νλΆκ°λ₯μΌλ‘ κ΅μ²΄
108 }
μ°μ PlayerController Scriptμ 85λ²μ§Έ μ€λΆν° 108λ²μ§Έ μ€μ μΊλ¦ν°κ° λ μμ μμλμ§ κ·Έλ μ§ μμμ§ νμΈνκ³ , κ·Έ μνμ λ°λΌ μ ν κ΄λ ¨ λ³μλ₯Ό λ°κΎΈλλ‘ νκ³ μλ€. μ΄λ₯Ό μν΄ μΊλ¦ν° μλμ λν΄ raycastλ₯Ό μκ³ Ground Tagλ₯Ό κ°μ§ μ€λΈμ νΈκ° κ²μΆλλμ§ νμΈ, μ΄μ λ°λΌ ground λ³μμ κ°μ λ³κ²½νλ€.
κ·Έ λ€ λ μμ μμΌλ©΄μ νμ¬ μ ν ν€λ₯Ό λλ₯΄μ§ μμΌλ©΄ μ ν μκ°μ 0μΌλ‘ μ΄κΈ°νν΄ μ νλ₯Ό λλ₯΄λ©΄ κ·Έ μκ°μ μ λ°μν μ μλλ‘ μ€μ νλ©°, λ μμ μμ§ μμΌλ©΄μ λ¨μ΄μ§λ κ²½μ°μλ μ ν μκ°μ κ°μ ν¬κ² μ€μ ν΄ μ νκ° λμ§ μλλ‘ μ€μ νμλ€.
110 if (player_state == current_State.S_standing || player_state == current_State.S_running || player_state == current_State.S_jumping || player_state == current_State.S_jumpswording) // μμκ±°λ, λ°κ±°λ, μ ννκ±°λ, μ ν 곡격μ€μ΄κ±°λ
{
if (Can_move) // μμ§μΌ μ μμΌλ©΄
{
.....(μ΄λ λ° μ’μ°λ°μ κ΄λ ¨)
if (Can_Jump) // μ ν κ°λ₯ν λ
{
...... (νλ μ΄μ΄ μμ λ
μ΄ μ‘΄μ¬νλμ§, μλμ§ Raycastλ₯Ό μ΄μ©ν΄ νμΈ)
if(!not_up && ready_time<=0.0f && rb.mass>=1.0f) // μκ° λΉμ΄μμΌλ©΄μ νλ μ΄μ΄ μ§λμ΄ 1.0μ΄μμ΄λ©΄μ μ€λΉμκ°μ΄ 0.0 μ΄νμ΄λ©΄
{
if (Input.GetKey(KeyCode.D))
{
if (up_time < up_time_limit) // νμ¬ μ ν μκ°μ΄ μ νμκ°μ λμ§ μμ κ²½μ°μ λν΄
{
145~158 .....(μ ν μ²λ¦¬ κ΄λ ¨)
}
}
}
}
}
}
166 player_animator.SetBool("Can_jump", ground); // μ νμ λλ©μ΄μ
μ μμ°μ€λ½κ² λ§λ€μ΄μ€
}
μΊλ¦ν°μ νλ μ μμ§μ κ°μ κ°μ Έλ μκ΄ μλ κ²½μ°μ λν΄ 110λ²μ§Έ μ€κ³Ό κ°μ΄ player_state λ³μλ₯Ό 쑰건μΌλ‘ μ΄μ©, μΊλ¦ν°μ νλμ μ½μΌλ©° μμ§μμ λν λΆλΆμ μ²λ¦¬νλλ‘ νλ€. μ΄λ¬ν μ²λ¦¬ λ΄μ©μΌλ‘λ ν¬κ² μΊλ¦ν° μ΄λ(Run ν¨μ), μΊλ¦ν° μ ν(145~158 Line)μ΄ μ‘΄μ¬νλ©°, μ¬κΈ°μμλ player_stateλ₯Ό μ΄μ©ν΄ ν΄λΉ λΆλΆμ μμ΄μ μΈλΆμ μΈ μ²λ¦¬ (Runν¨μ λ΄ μ ν곡격과 κ·Έλ μ§ μμ κ²½μ°λ₯Ό λΆλ¦¬ν λΆλΆ)κ° κ°λ₯νλ€.
2. μμ§μμ μ μΈν νλ(곡격 λ° μμ΄ν μ¬μ©)μ μ΄λ»κ² μ²λ¦¬νλκ°? (PlayerController Script)
νλ μ΄μ΄ μΊλ¦ν°μ 곡격 λ° μμ΄ν μ¬μ©κ³Ό κ°μ λΆλΆμ Update ν¨μλ₯Ό ν΅ν΄ μ²λ¦¬νλ©° μ¬κΈ°μλ νλ μ΄μ΄μ 무μ μκ°, νλ μΏ¨νμκ³Ό κ°μ μκ° κ°λ Time.deltaTimeμ μ΄μ©ν΄ μ²λ¦¬νκ³ μλ€. λν Update λ΄ νλ μ²λ¦¬λ FixedUpdate λ΄ μμ§μ μ²λ¦¬μ κ°μ΄ player_stateλ₯Ό ν΅ν΄ νμ¬ νλ μ΄μ΄μ νλμ μ½κ³ , μ΄λ₯Ό 쑰건μΌλ‘ μΌμ ν μ μλ νλμ μ ν΄μ£Όλ λ°©μμΌλ‘ λμνλ€.
200 if (player_state == current_State.S_standing || player_state == current_State.S_running) // λ°κ±°λ μμμΌλ©΄
{
if(ready_time>0.0f) // μ€λΉ μκ°μ΄ μμΌλ©΄ (λ€λ₯Έ μ ν¬ νλμ ν μ μμ)
{
ready_time -= Time.deltaTime;
}
if(ready_time<=0.0f) // μ€λΉ μκ°μ΄ μμΌλ©΄
{
...(컀맨λ μ
λ ₯μ λ°λ₯Έ νλμ²λ¦¬ - Battle_Action ν¨μ νΈμΆ)
}
if (Input.GetKeyDown(KeyCode.Space)) // μ λ©Έ
{
if (Rolling == false)
{
Battle_Action("Roll");
}
}
}
μμλ‘ Updateλ΄ μ μ½λμ κ°μ΄ player_stateκ° standing, runningμ΄λ©΄μ μΊλ¦ν°κ° νλμ ν΅ν μΏ¨νμμ΄ μμΌλ©΄ 컀맨λμ λ°λΌ string μΈμλ₯Ό κ°μ§λ Battle_Action ν¨μλ₯Ό νΈμΆ, player_stateμ μν λ° Animatorμ© λ³μλ₯Ό λ³κ²½νλ€. κ·Έλ¦¬κ³ μ΄λ₯Ό ν΅ν΄ Animatorλ νλ μ΄μ΄μ νλ λ³νλ₯Ό animationμΌλ‘ μ§ν, animation_eventλ₯Ό ν΅ν΄ μμΈνλ³νλ₯Ό μ€μ λ‘ κ΅¬μΆνλ€.
ꡬνν΄μΌ νλ μ λ€μ 체λ ₯ λ° νλ μ΄μ΄ νμ§, 곡격λ°μ, λλ°±κ³Ό κ°μ 곡ν΅μ μΌλ‘ 곡μ νλ κΈ°λ₯μ΄ μ‘΄μ¬νλ€. λ°λΌμ μ΄λ₯Ό μν΄ λͺ¨λ μ κ°μ²΄λ€μ΄ μμλ°μ λΆλͺ¨ Scriptλ₯Ό λ§λ€μ΄μΌ νλ©°, μ΄λ₯Ό Enemy Scriptμ κ°μ ννλ‘ κ΅¬ννλ€.
ν΄λΉ μ€ν¬λ¦½νΈμλ μμμ λ§ν λΆλΆμ μ²λ¦¬νκ³ μ κ° κΈ°λ₯μ ν¨μ(Damaged_bullet, Damaged_sword, Knockback, detect) λ° λ³μ(detection, hp)λ‘ κ΅¬ννλ€.
λν μ λ€μ€μμλ ν¬κΈ°κ° ν° κ°μ²΄, μμ κ°μ²΄, μ거리곡격μ λν΄ λ¬΄μ μΈ κ°μ²΄ λ± λ€μν μ’
λ₯μ κ°μ²΄κ° μμΌλ©° μ΄μ λν μ΄ννΈ μ²λ¦¬λ₯Ό ν΄μΌνλ―λ‘ μ΄λ₯Ό μν λ³μ(size_big, size_small)λ₯Ό μ€μ , ν¨μμμλ νμμ λ°λΌ μ΄λ₯Ό μ¬μ©νλλ‘ νλ€.
λν μ μ νμ§ μνλ νλ μ΄μ΄λ₯Ό μμ ν νμ§νλλ, νμ§νλλ° μμΉλ₯Ό λͺ¨λ₯΄λ, νμ§νκ³ μμΉλ μκ³ μλλμ λ°λΌ νλμ΄ λ¬λΌμ ΈμΌ νλ€. μ΄λ₯Ό μν λ³μ follow_time, detect_timeμ μ€μ νλ©°, λ³μμ μ°μ μμμ λ°λΌ κ°μ΄ κ°μνλλ‘ Updateμ½λλ₯Ό μ§ λ€.
λν νμ§λ₯Ό νλλ° μμΉλ₯Ό λͺ¨λ₯΄λ©΄ νμ§λ°κ²½μ΄ λμ΄μ ΈμΌ νλ―λ‘ μ΄λ₯Ό μν λ²μ DetectZoneμ μ€μ , μ΄λ₯Ό μν Detect Zoneμ μμ±νμλ€. ν΄λΉ Scriptλ Collider λ΄ νλ μ΄μ΄κ° μ κ·Όνλ©΄ Enemy Scriptμ Detectν¨μλ₯Ό μ€ννμ¬μ μ μ΄ λ€μ νλ μ΄μ΄λ₯Ό νμ§νλλ‘ λ§λλ μμ μ μ€ννλ€.
μ Enemy Scriptλ₯Ό ν΅ν΄ νμ λ§λ€μμΌλ©΄ Grunt_Swordman, Grunt_Archerμ κ°μ΄ μ΄λ₯Ό μμλ°μ Scriptλ₯Ό μμ±, μμΈν νλμ μ€μ νλ κ²(Raycastλ₯Ό ν΅ν 곡격λ²μ λ° κ³΅μ€μ λ μλμ§ νμΈ, Animator μ€μ )μΌλ‘ μ€μ μ μ€λΈμ νΈλ₯Ό κ²μ λ΄μμ ꡬνν μ μλ€.
3. μ§κΈ μμ μμ νλ‘μ νΈμ μμ¬μ΄ λΆλΆμ μ΄λλΌκ³ μκ°νλκ°? μ΄λ₯Ό μ΄λ»κ² μμ ν΄μΌ μ’μκΉ?
μ½λ λ΄ μΆ©λκ³Ό κ΄λ ¨λ λΆλΆμμ Raycastλ€μ Raycastallμ μ΄μ©ν΄ λμνκ³ μλ€. κ·Έλ¬λ RaycastAllμ λΆλͺν λͺ¨λ μ€λΈμ νΈλ₯Ό κ²μΆνκ³ μμΌλ©°, μ€λΈμ νΈ μκ° λ§μμλ‘ μ°μ°λμ΄ λ§μμ§λ€.
λ°λΌμ μ΄λ₯Ό λ§κΈ°μν΄ κ° μ€λΈμ νΈλ§λ€ Tagκ° μλ Layerλ₯Ό μ€μ νλ©° μ΄λ₯Ό Raycast μΆ©λμ λν 쑰건μΌλ‘ μ£Όλ λ°©μμΌλ‘ μμ νλ€λ©΄, μ°μ°λΆλΆμ μμ΄μ ν° μ΄λμ μ»μ μ μμ κ²μ΄λ€.