Single RPG Project
ν λ¨μλ‘ μ μν μμ Single RPG
Stack Unity, C#
Develop 2021.12 ~ 2022.04
Made by TIOGX μ΄ν¨μ, μ μμ§
Features
1. λ‘λΉμ¬ : μ¬ μ΄λ
2. νλ μ΄μ΄ μ΄λ λ° μΉ΄λ©λΌ μ΄λ, λ―Έλλ§΅ ꡬν
3. npcμμ μνΈμμ©
4. npcμμ λν λ° νμ€νΈ μμ€ν
, UI
5. νμ€νΈ κ΅¬λΆ λ° νμ¬ μ§νμ€μΈ νμ€νΈ CHECK
6. μ ν¬ νμ€νΈ μ§ν μμ λ° λͺ¬μ€ν°μ νλ μ΄μ΄ κ°μ μνΈμμ©(μ ν¬)
7. μ‘μ
컨νΈλ‘€λ¬λ₯Ό ν΅ν μμ΄ν
νμ€νΈ μ§ν μμ λ° μμ΄ν
μ μΈλ²€ν 리μ μ μ₯
8. νμ€νΈ 보μ λ° store uiλ₯Ό μ΄μ©ν 골λ μλΉ
9. μ€ν¬ ꡬν λ° μΆκ° κΈ°λ₯ μ€λͺ
10. λ³΄μ€ μ ν¬ μμ€ν
- UnityEngine.SceneManagement λΌμ΄λΈλ¬λ¦¬μ SceneManager.LoadScene() ν¨μλ₯Ό μ¬μ©νμ¬ μ¬ μ΄λ ꡬν
-
νλ μ΄μ΄ μ΄λ
- Input.GetAxis()λ₯Ό ν΅ν΄ ν€λ³΄λ μ λ ₯μ 벑ν°κ°μΌλ‘ λ³ννκ³ , moveInput.magnitudeλ₯Ό ν΅ν΄ ν΄λΉ λ°±ν°μ ν¬κΈ°λ₯Ό ꡬνμ¬ 0 μ΄μμ κ²½μ°(μμ§μμ΄ μλ κ²½μ°) isMove λ³μλ₯Ό trueλ‘ λ³ννμ¬ μμ§μ΄λ μνλ₯Ό κ΅¬λΆ ν μ μλ€.
Vector2 moveInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxi("Vertical")); bool isMove = moveInput.magnitude > 0;
- μΉ΄λ©λΌκ° λ°λΌλ³΄λ λ°©ν₯κ³Ό ν€λ³΄λ μ λ ₯ λ²‘ν° μ¬μ΄μ μ°μ°μ ν΅ν΄ μ΄λνκ³ μ νλ λ°©ν₯ 벑ν°λ₯Ό ꡬν ν, νλ μ΄μ΄ κ°μ²΄μ positionμ ν΄λΉ λ°©ν₯μΌλ‘ moveSpeed κ³μμ λ§λ μλλ‘ μ΄λμν¨λ€.
Vector3 lookForward = new Vector3(cameraArm.forward.x, 0f, cameraArm.forward.z).normalized; Vector3 lookright = new Vector3(cameraArm.right.x, 0f, cameraArm.right.z).normalized; Vector3 moveDir = lookForward * moveInput.y + lookright * moveInput.x; characterBody.forward = moveDir; transform.position += moveDir * Time.deltaTime * moveSpeed;
-
μΉ΄λ©λΌ λ°©ν₯ μ ν λ° μ€μΈ μ€μμ
- λ§μ°μ€ μ λ ₯μ λ°λΌ μΉ΄λ©λΌλ₯Ό λλ €μ€λ€. μ΄λ x,yμΆ λ°©ν₯μΌλ‘ μ νμ λμ΄ νΉμ κ°λ μ΄μ μΉ΄λ©λΌκ° νμ νλ κ²μ λ§λλ€.
mouseX = Input.GetAxis("Mouse X") * camSpeed; // νλ‘μ νΈ μΈν μ μ λ ₯ κ° λ§€λμ λ₯Ό 보면 μ΄λ¦μ΄ Mouse Xλ‘ μ€μ λμ΄μμ mouseY = Input.GetAxis("Mouse Y") * camSpeed; Vector3 camAngle = centralAxis.rotation.eulerAngles; float x = camAngle.x - mouseY; if(x < 180f) { x = Mathf.Clamp(x, 0f, 70f); } else { x = Mathf.Clamp(x, 335f, 361f); } centralAxis.rotation = Quaternion.Euler(x, camAngle.y + mouseX, camAngle.z);
- λ§μ°μ€ ν μ νμ©νμ¬ μ€ κ΅¬ν λ° μ΅λ, μ΅μ μ€ κ±°λ¦¬ μ ν
private void Zoom() { wheel += Input.GetAxis("Mouse ScrollWheel"); if (wheel >= -3){wheel = -3;} else if(wheel <= -7){wheel = -7;} cam.localPosition = new Vector3(0, 0, wheel); } ```
-
λ―Έλλ§΅
- λ―Έλλ§΅μ© μΉ΄λ©λΌ κ°μ²΄ μμ±νμ¬ λ―Έλλ§΅ λ μ΄μ΄μ ν΄λΉνλ λ―Έλλ§΅ μ΄λ―Έμ§λ₯Ό 촬μνλ νμμΌλ‘ ꡬν
- μΉ΄λ©λΌκ° λ°λΌλ³΄λ λ°©ν₯μΌλ‘ λ°μν Rayκ° νκ·Έκ°
Npcμ΄κ³MainCamera layerμ μ‘΄μ¬νλ μ€λΈμ νΈμ μΆ©λνκ² λλ©΄ NPCActionController.NPCInfoAppear()κ° μ€νλλ€. - μ΄λ₯Ό ν΅ν΄ νμ¬ μ΄λ€ NPCμ μνΈμμ© ν μ μλμ§ μλ €μ£Όλ λ¬Έμκ° κ²μ μλ¨μ λνλλ€.
- (T)ν€λ₯Ό ν΅ν΄ μνΈμμ©μ νκ² λλ©΄, NPCManager.InitUI()μ QuestManager.checkQuest()κ° μ€νλλ€.
-
NPCManager.InitUI() λ₯Ό ν΅ν΄ μΆ©λ체μ QuestDataμ NPCDataμ μ κ·Όνλ€. λ§μ½ ν΄λΉ NPCμ νμ€νΈκ° μ§νλ μ°¨λ‘κ° μλλΌλ©΄ Idle() μνμ νμ€νΈλ₯Ό μ£Όμ§ μλ κΈ°λ³Έ μν UIκ° μμ±λκ³ κ·Έ λ°λλΌλ©΄ νμ€νΈκ° μμλλ€.
-
QuestManager.checkQuest()λ₯Ό ν΅ν΄ μΆ©λ체μ Idμ νμ€νΈ Typeλ₯Ό νμΈνλ€. ν΄λΉ μ λ³΄λ‘ νμ€νΈμ μ§νλμ ν΄λ¦¬μ΄ μ¬λΆλ₯Ό νμΈνλ€.
Type 1 : μ¬λ₯ νμ€νΈ
Type 2 : λ§κ±ΈκΈ°
Type 3 : μμ΄ν νλ
- νμ€νΈκ° μμλλ©΄ νμ¬ μ§νλκ³ μλ νμ€νΈμ λ΄μ©κ³Ό μ§νλκ° κ²μ νλ©΄ μΌμͺ½ UIμ νμλλ€. λν νμ¬ νμ€νΈκ° μ§νλκ³ μλ λμμ΄ λꡬμΈμ§ NPCμμ λ§ν¬λ₯Ό ν΅ν΄ μ μ μλ€.
- νλ μ΄μ΄μ νΌκ²© λ° λͺ¬μ€ν°μ νΌκ²© νμ ꡬν
- νλ μ΄μ΄μ νΌκ²©
- λͺ¬μ€ν°μ κ²½μ° μΌμ 거리 λ΄μ νλ μ΄μ΄κ° λ€μ΄μ€λ©΄ traceλ₯Ό μ€μνλ©°, 곡격 μ¬κ±°λ¦¬ μμ νλ μ΄μ΄κ° μ‘΄μ¬ ν μ 곡격μ μ€μ
- λͺ¬μ€ν°μ νΌκ²©
- νλ μ΄μ΄κ° 곡격ν€λ₯Ό μ λ ₯μ 곡격μ€μΈ μνκ° λλ©° μ΄λ 무기μ μ μ¬μ΄μ μΆ©λνμ μ μ€μνμ¬ μΆ©λ μ 1νμ ννμ¬ νλ μ΄μ΄μ 곡격λ ₯μ ν΄λΉνλ λ°λ―Έμ§λ₯Ό λͺ¬μ€ν°μκ° κ°ν¨
- νλ μ΄μ΄μ νΌκ²©
7. μ‘μ 컨νΈλ‘€λ¬λ₯Ό ν΅ν μμ΄ν νμ€νΈ μ§ν μμ λ° μμ΄ν μ μΈλ²€ν 리μ μ μ₯
- μμ΄ν νλ νμ€νΈ μ§νμ, νμ€νΈ ν΄λ¦¬μ΄ 쑰건μΌλ‘ λͺ μλ μμ΄ν μ νλν΄μΌ νλ€.
- Rayκ° νκ·Έκ° ItemμΈ μ€λΈμ νΈμ μΆ©λνκ² λλ©΄
ActionController.ItemInfoAppear()ν¨μκ° μ€ν. μ΄λ₯Ό ν΅ν΄ νμ¬ μ΄λ€ μμ΄ν μ νλν μ μλμ§ μλ €μ£Όλ Textκ° κ²μ μλ¨μ λνλλ€. - (E)ν€λ₯Ό λλ¬ μμ΄ν
μ νλνλ©΄, ν΄λΉ μμ΄ν
μ΄ Inventoryμ μΆκ°λκ³ ,
ItemDataUI.InstantiateItemDataUI()λ₯Ό ν΅ν΄ μ΄λ€ μμ΄ν μ νλνλμ§ UIλ₯Ό ν΅ν΄ νλ μ΄μ΄μκ² μλ €μ€λ€.
- νλν μμ΄ν
μ΄ moneyμΌ κ²½μ°, μΈλ²€ν 리μ μ μ₯λμ§ μκ³ κ²μ μλ¨μ
playerGoldUIμ λͺ μλλ€. - 골λλ₯Ό ν΅ν΄ μμ μμ ν¬μ
μ ꡬ맀ν μ μλ€. λ§μ½ μΆ©λΆν λμ κ°μ§κ³ μμ§ μμΌλ©΄
NotEnoughMoneyμ€λΈμ νΈκ° λνλλ€. - ꡬ맀ν ν¬μ μ μΈλ²€ν 리μ μ μ₯λλ€.
-
κ° μ€ν¬ prefab ,SkillpoolManagerμ ν΅ν΄ μ€ν¬ μμ€ν ꡬν
- SkillpoolManager
key : Keycode, value : skillprefab ννμ dict μλ£κ΅¬μ‘°λ₯Ό ν΅ν΄ 보μ μ€ν¬μ κ΄λ¦¬
νμ¬ λ±λ‘λ μ€ν¬μ ν€λ³΄λ μ λ ₯μ΄ λ€μ΄μ¬ κ²½μ° KeyDictionary[dic.Key].GetComponent().CanUseSkill()
- κ° μ€ν¬ prefab
κ° ν리νΉμ κ²½μ° κ³ μ ν μ€ν¬ μ΄λ¦, λ°λ―Έμ§, μΏ¨νμ λ° UseSkill() λ©μλ 보μ
-
μΆκ° κΈ°λ₯
- κ²μ μ’μΈ‘ λ²νΌμ ν΅ν΄ μ¬λ¬ UIμ μ κ·Όν μ μλ€.
- νλ μ΄μ΄ μ 보
νλ μ΄μ΄ λ 벨, Xp, νμ¬ μ²΄λ ₯, 곡격λ ₯, μ£Όλ¬Έλ ₯
- κ²μ μ 보
κ²μ νλ μ΄ μ νμν ν€λ€μ΄ μ 리λμ΄ μλ€.
- νλ μ΄μ΄μ νμ¬ μ²΄λ ₯μ΄ 0μ΄ λλ©΄ νλ μ΄μ΄μ μνκ° Dieλ‘ λ³νκ³
PlayerDieUIκ° μΌμ§λ€.
κ³μ νλ μ΄νκ² λλ©΄ 리μ€ν° μ₯μλ‘ μ΄λνλ€. κ³μ νλ μ΄νμ§ μμΌλ©΄ λ‘λΉλ‘ λμκ°λ€.
- BossController.cs
-
보μ€λ idle, tracing, die μνλ₯Ό κ°μ§
-
λ§€ μ λ°μ΄νΈλ§λ€ CheckBossState() ν¨μλ₯Ό ν΅ν΄ μνλ₯Ό 체ν¬νκ³ , μμ§μΌ μ μλ μνλΌλ©΄ BossMove(), 곡격 ν μ μλ μνλΌλ©΄ BossAttack() ν¨μλ₯Ό μ€ννλ€.
- BossMove()
nav.SetDestination() ν¨μλ₯Ό ν΅ν΄ νλ μ΄μ΄ κ°μ²΄μ positionμ TargetPosλ‘ μ§μ ν ν μ΄λνλ€.
- BossAttack()
IsAttack() ν¨μλ₯Ό ν΅ν΄ 보μ€μ μν λ° κ³΅κ²© μ£ΌκΈ°, 곡격 μ¬κ±°λ¦¬ λ΄μ νλ μ΄μ΄κ° μ‘΄μ¬νλμ§ νμΈ ν ν 곡격μ μ€μ
λλ€ λμλ₯Ό μμ±νμ¬ ν¨ν΄μ μ ννκ³ ν΄λΉ ν¨ν΄μ μ¬μ©νλ€. μ΄ν μ½λ£¨ν΄μ ν΅ν΄ 곡격 μΏ¨νμμ κ°±μ νλ€.
-




















