๋ก๊ทธ๋ผ์ดํฌ ๊ฒ์์ด๋, ๋ฌด๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชฌ์คํฐ๋ค์ ๋๋ ค์ก์ ์ ์์ด์ผ ํ ๊ฒ๋๋ค. ๊ทธ๋งํผ ๋ฌด๊ธฐ๋ผ๋ ๊ฒ์ด ์ฐ๋ฆฌ ๊ฒ์์์ ํต์ฌ์ด ๋๋ค๋ ์๊ธฐ์ฃ . ์ฐ์ ์ฐ๋ฆฌ ๊ฒ์์ ๊ธฐ๋ณธ ๋ฌด๊ธฐ์ธ "์นด๋ก ์ ๋ ธ(Charon's Paddle)"๋ก ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณผ ๊ฒ๋๋ค. ํ์ง๋ง ์ด๋ฒ ๊ธ์์๋ ๊ทธ ๊ธฐ๋ฐ๋ง ๋จผ์ ๋ค์ ธ๋ณผ๊น ํด์!
์์งํ ๋งํด์ ๋ฌด๊ธฐ๊ฐ ๋ ธ์ฒ๋ผ ์๊ธฐ์ง ์์์ต๋๋ค. ๊ตฌ๋งคํ๋ ๋ฌด๊ธฐ ์์ ์ค์ ๊ทธ๋๋ง ๋ ธ ๊ฐ์ด ์๊ธด ๊ฑธ๋ก ์ฅ์ด ์ฃผ์์ด์...
๊ทธ๋ฆฌ๊ณ ๊ฒ์ ๊ทธ๋ํฝ์ด ๋๋ฌด ๋ฐ๋ฐํ ๊ฒ ๊ฐ์์ URP(Universal Render Pipeline)์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์ ๊ทธ๋ ์ด๋ ํ๊ณ ์ถ์๋๋ฐ, ์ปค์คํ ์์ด๋(Custom shader)๋ URP Shader๋ก ์๋ ๋ณํ์ด ์ ๋๋๋ผ๊ตฌ์.
ํ์ฌ ๊ตฌ์ ํ๋ ์์ ์ค์ ๋ฌผ๊ณผ ๊ฒ๊ธฐ ์ดํํธ ์์ ์ด ์ปค์คํ ์์ด๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์์ด๋์ ๋ํด ๊ณต๋ถํด ๋ณธ ์ ์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์์ด๋ ์ฌ์์ฑ์ ๋ฌด๋ฆฌ๋ผ ์๊ฐํ์ฌ ์ง๊ธ ๊ทธ๋๋ก ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค... ๋ค์ ๊ฒ์์ ์ธ๋ฆฌ์ผ ์์ง(Unreal Engine)์ผ๋ก ๋ง๋ค์ด ๋ด์ผ ๊ฒ ์ด์...
๊ทธ๋ผ ์ด๋ฒ ์ฃผ์ ์ ๊ฐ ๋ฌด๊ธฐ ์์คํ ์ ๊ตฌํํ๊ธฐ ์ํด ์ด๋ค ๊ธฐ๋ฐ์ ๋จผ์ ๋ค์ก๋์ง, ์ด๋ ํ ๋ฌธ์ ๋ค์ ๊ฒช์๋์ง ์ค๋ช ์ ๋๋ฆฌ๋๋ก ํ ๊ฒ์!
1. ๊ณต๊ฒฉ ์ ๋๋ฉ์ด์ ์์ ํ๊ธฐ
ํด๋จธ๋ ธ์ด๋ ์ ๋๋ฉ์ด์ (Humanoid Animation)์ ๋ฌธ์ ์
์นด๋ก ์ ๋ ธ ๊ธฐ๋ณธ ๊ณต๊ฒฉ์ ์ด 3๊ฐ์ง ์ฝค๋ณด๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ผ์ ์๊ฐ ๋ด์ ๊ณต๊ฒฉ ์ปค๋งจ๋๋ฅผ ์ ๋ ฅํ๋ฉด ๋ค์ ์ฝค๋ณด๋ก ์ด์ด๊ฐ๊ณ , ์๋๋ผ๋ฉด ์ฒ์ ๊ณต๊ฒฉ์ผ๋ก ์ด๊ธฐํ ๋๋ ๋ฐฉ์์ด์ฃ .
*์ ๋๋ฉ์ด์ ์ ์๋ชป ๊ฑด๋๋ ธ๋์ง ๋ชจ๋ฅด๊ฒ ๋๋ฐ, ์คํํ๋ฉด ์๊พธ ํฌํํ ๊ณณ์ผ๋ก ์์น ์ด๋ํ์ฌ ์ฌ์ํ๋๋ผ๊ตฌ์... ๊ทธ๋๋ ์ธ๊ฒ์์์๋ ์ ์ ์๋ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ด์ ์๋์ ์์๋ค ๋ฌด๊ธฐ๋ฅผ ์ฅ์ด์ฃผ๊ณ , ์คํ๋ง ํ๋ฉด ๋ชจ๋ ๊ฒ ์ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ํ์ง๋ง ์ธ์์ ๊ทธ๋ ๊ฒ ์ฌ์ด ๊ฒ์ด ์๋์ฃ ...
์์ฃผ ๋๋ฆฌ๊ฐ ๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค. ์ ๋๋ฉ์ด์ ํค ํ๋ ์์ ์์ ํ๋ ์์ ์ด ํ์ํ ๊ฒ ๊ฐ๋ค์.
ํ์ง๋ง ํด๋จธ๋ ธ์ด๋ ์ ๋๋ฉ์ด์ ์ Unity ๋ด์์ ํค ํ๋ ์ ์์ ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํด๋น ์ ๋๋ฉ์ด์ ์ ๋ง๋ค์๋ ์ธ๋ถ ํ๋ก๊ทธ๋จ์์ ์์ ํ์ฌ ๋ค์ Unity๋ก ์ํฌํธ ํด์ผ ํ๋ค๊ณ ํด์.
๊ทธ๋ฌ๋ฉด ์์ ํ ์ ์๋ ๋ถ๋ถ์ ์๋ก ๋ง๋ค์ด ์ฃผ์!
์ ๋๋ฉ์ด์ ์ ๋ง๋ค ๋น์์ ์ฌ์ฉ๋์๋ ์๋์ ์ ์ฒด๋ค์ ์์ ํ์ง ๋ชปํ๋ ๊ฒ์ด์ง, ์๋ก ์ถ๊ฐํ ๊ฒ์ ์์ ํ์ง ๋ชปํ๋ค๊ณ ๋ ์ ํ์ต๋๋ค. ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณค์ฃ .
- ๋น ์ค๋ธ์ ํธ(HandleWeaponPosition)์ ์์ฑํ์ฌ, ์๋์ ์(RightHand)๊ณผ ๋๋ํ ๋๋ค.
- ์๋์ ์(RightHand) ํธ๋์คํผ ๊ฐ์ ๋น ์ค๋ธ์ ํธ(HandleWeaponPosition)์ ํธ๋์คํผ์ ๋ณต๋ถํ๋ค.
- ์ฆ, ์๋ก ์์ฑํ ๋น ์ค๋ธ์ ํธ๊ฐ ๋ฌด๊ธฐ๋ฅผ ์ฅ๋ ์๋์ ์ ์ญํ ์ ํด์ค ๊ฒ๋๋ค.
- ์์ผ๋ก ๊ฐ ๋ฌด๊ธฐ๋ค์ ์ด ๋น ์ค๋ธ์ ํธ(HandleWeaponPosition) ์์ ์ค๋ธ์ ํธ๋ก ๋ฐฐ์นํ๋ค.
์๋ก ๋ง๋ ์ ๋น ์ค๋ธ์ ํธ(HandleWeaponPosition)์ผ๋ก ํค ํ๋ ์์ ์ถ๊ฐํ์ฌ ๊ฐ ์ ๋๋ฉ์ด์ ์ ๋ฌด๊ธฐ ๋ฐฐ์น๋ฅผ ์์ ํด์ฃผ๋๋ก ํฉ์๋ค. ๊ฐ ์ ๋๋ฉ์ด์ ํค ํ๋ ์๋ง๋ค ๋ฌด๊ธฐ๊ฐ ์ด์ํ ๊ฐ๋๋ก ๋ค๋ ค ์๊ฑฐ๋, ์ด์ํ ๊ณณ์ ์์ผ๋ฉด ์์ ํด์ฃผ๋ฉด ๋ผ์!
์ ๋๋ฉ์ด์ ์ ๋ํ ์์ ์์ ์ ๋๋ฌ๋ค์! ์ด์ ๋ฌด๊ธฐ ํ์ฅ์ฐฉ ์์คํ ์ ๋ง๋ค์ด ๋ณด์ฃ .
2. ๋ฌด๊ธฐ ํ์ฅ์ฐฉ ์์คํ ์ค๊ณํ๊ธฐ
๊ฒ์์ ๊ท๋ชจ์ ๋ฐ๋ผ ๋ฌด๊ธฐ ์ข ๋ฅ๋ ๊ต์ฅํ ๋ง์ ์๋, ์ ์ ์๋ ์์ต๋๋ค. ๋ฉ์ดํ์คํ ๋ฆฌ ๊ฐ์ ๊ฒฝ์ฐ๋ง ๋ณด๋๋ผ๋ ๋ฌด๊ธฐ๊ฐ ๊ต์ฅํ ๋ง์ ๊ฒ์ ๋ณผ ์ ์์ฃ . ๊ฒ์ ๋ด์ ์๋ ๋ชจ๋ ๋ฌด๊ธฐ ์ข ๋ฅ๋ฅผ ์ฝ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ๊ฒ๋ ๋ญ๊ฐ ๋ญ๋น์ธ ๋๋์ ๋๋ค.
๊ทธ๋์ ์ ๊ฐ ์๊ฐํ ๊ฒ์ ์ ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌด๊ธฐ ๋ชฉ๋ก๋ค๋ง ๊ฐ์ ธ์์ ์ฌ๋ฆฌ์๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ ๊ฒ์์์๋ ์ค์๊ฐ์ผ๋ก ๋ฌด๊ธฐ ๊ต์ฒด๋ ํ์ง ๋ชป ํ๊ณ , ๋ก๋น์์๋ง ๋ฌด๊ธฐ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ฒ์ ํ๋ ์ด ํ ๋๋ ์นด๋ก ์ ๋ ธ ๋ฐ์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ์ง๋ง, ํ๋ ์ด ํ๋ฉฐ ์๊ฐ์ด ์ง๋ ๋ค๋ฅธ ๋ฌด๊ธฐ ์ฌ์ฉ ์กฐ๊ฑด๋ค์ ์ถฉ์กฑํ๋ค๋ฉด ์ฌ์ฉํ ์ ์๋ ๋ฌด๊ธฐ ์ข ๋ฅ๋ค์ด ๋์ด ๊ฐ๊ฒ ์ฃ .
DB๋ ๊ธฐํ ์ ์ฅ์์๋ ํด๋น ์ ์ ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌด๊ธฐ์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํน์ ์ํฉ์ด ๋๋ฉด ํด๋น ๋ฌด๊ธฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฝ์ด์ค๋ ๊ฒ์ด์ฃ . ์ ๊ฐ ์๊ฐํ๋ ํน์ ์ํฉ์ด๋ผ ํจ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฒ์์ ์ฒ์ ์คํํ๋ ์ด๊ธฐํ ๋จ๊ณ์์ ์ ์ ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ๋ ๋ฌด๊ธฐ ๋ชฉ๋ก๋ค์ ์ฝ์ด์ฌ ๋
- ๊ฒ์ ์ค, ์๋ก์ด ๋ฌด๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ ๋
๋ฌผ๋ก ์ ์ฅ/๋ถ๋ฌ์ค๊ธฐ ์์คํ ์ ์ ๊ฐ ๋ด๋นํ ๊ฒ์ด ์๋๊ธฐ์, ํด๋น ํํธ๋ฅผ ๋งก์ ๋ค๋ฅธ ํ์๊ณผ๋ ์์๋ฅผ ํ์ง์. ์ด๊ฑธ ํ ๋๋ก ์ฐ์ ์์ ํ ์คํธ์ฉ์ ๋ง๋ค์ด ๋ณผ ๊ฒ๋๋ค. ํ๋์ฉ ์ ๊ฐ ํ๋ ์์๋๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
Scriptable Object๋ก ๋ฌด๊ธฐ๋ฅผ ์ฅ๋ ๋ก์ปฌ ์ขํ ์ ๋ณด ์ ์ฅํ๊ธฐ
๋ฌด๊ธฐ ์ข ๋ฅ๊ฐ ์ฌ๋ฌ ๊ฐ์ง์ผ ์๋ ์์ง๋ง, ์บ๋ฆญํฐ๊ฐ ๋ชจ๋ ๋ฌด๊ธฐ๋ฅผ ์ฅ๋ ๋ฐฉ๋ฒ์ด ์ ๋ถ ๋ค๋ฅด์ง๋ ์์ ๊ฒ๋๋ค. ์ฌ๋ฌ ๋ฌด๊ธฐ๋ค์ด ์๋๋ผ๋ ๊ทธ ๋ฌด๊ธฐ๋ค์ด ํ์ ๋ฌด๊ธฐ ํ์ ์ด๋ฉด, ์บ๋ฆญํฐ๋ ํด๋น ๋ฌด๊ธฐ๋ค์ ์ฅ ๋ ํ ์์ผ๋ก๋ง ์ฅ ๊ฒ๋๋ค.
์ฆ, ์ฅ๋ ๋ฐฉ๋ฒ์ด ๊ณตํต์ ์ธ ๋ฌด๊ธฐ๋ค๋ ๋ง๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ ์ ๋ฏธ๋ฃจ์ด ๋ณด์์ ๋, ์คํฌ๋ฆฝํฐ๋ธ ์ค๋ธ์ ํธ(Scriptable Object)๋ก ๊ด๋ฆฌํ๋ฉด ๊ต์ฅํ ํธํ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "Weapon Handle Data", menuName = "Scriptable Object/Weapon Handle Data", order = int.MaxValue)]
public class WeaponHandleData : ScriptableObject
{
public Vector3 localPosition;
public Vector3 localRotation;
public Vector3 localScale;
}
๋ฌด๊ธฐ๋ ์์ ์์ ์ค๋ธ์ ํธ๋ก ๋ฐฐ์น๋๊ธฐ ๋๋ฌธ์, ์๋ ์ขํ๊ฐ ์๋ ๋ก์ปฌ ์ขํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค. ์ด๊ฑธ ํ ๋๋ก ์นด๋ก ์ ๋ ธ๋ฅผ ์ฅ ๋์ ๋ก์ปฌ ์ขํ ์ ๋ณด๋ฅผ ์ ์ฅํ์์ต๋๋ค.
์ค์ ๋ก ์บ๋ฆญํฐ์ ์ฅ์ด๋ณด๊ฒ ํ ํ์ ํธ๋์คํผ(Transform)์ ๋ณด๋, ์์ ๊ฐ๋๊ตฐ์. ๊ทธ๋์ ํด๋น ์ ๋ณด๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ด ์คฌ์ต๋๋ค. ์ด์ ์ค์ ๋ฌด๊ธฐ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค.
๋ฌด๊ธฐ ํด๋์ค์ ๋ฌด๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค ์ ์ํ๊ธฐ
๋ชจ๋ ๋ฌด๊ธฐ๋ค์ ๊ณตํต์ ์ธ ๋ถ๋ถ๋ค์ ๋ชจ์์, ์ถ์ ํด๋์ค๋ก ๋ง๋ค์ด ์ฃผ์์ต๋๋ค.
using CharacterController;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class BaseWeapon : MonoBehaviour
{
// ๋ฌด๊ธฐ์ ํ์ฌ ์ฝค๋ณด ์นด์ดํธ
public int ComboCount { get; set; }
// ์ด ๋ฌด๊ธฐ๋ฅผ ์ฅ ๋์ ๋ก์ปฌ ์ขํ ์ ๋ณด
public WeaponHandleData HandleData { get { return weaponhandleData; } }
// ์ด ๋ฌด๊ธฐ๋ฅผ ์ฌ์ฉํ ๋์ ์ ๋๋ฉ์ดํฐ
public RuntimeAnimatorController WeaponAnimator { get { return weaponAnimator; } }
public string Name { get { return _name; } }
public float AttackDamage { get { return attackDamage; } }
public float AttackSpeed { get { return attackSpeed; } }
public float AttackRange { get { return attackRange; } }
#region #๋ฌด๊ธฐ ์ ๋ณด
[Header("์์ฑ ์ ๋ณด"), Tooltip("ํด๋น ๋ฌด๊ธฐ๋ฅผ ์ฅ์์ ๋์ Local Transform ๊ฐ ์ ๋ณด์
๋๋ค.")]
[SerializeField] protected WeaponHandleData weaponhandleData;
[Header("๋ฌด๊ธฐ ์ ๋ณด")]
[SerializeField] protected RuntimeAnimatorController weaponAnimator;
[SerializeField] protected string _name;
[SerializeField] protected float attackDamage;
[SerializeField] protected float attackSpeed;
[SerializeField] protected float attackRange;
#endregion
public void SetWeaponData(string name, float attackDamage, float attackSpeed, float attackRange)
{
this._name = name;
this.attackDamage = attackDamage;
this.attackSpeed = attackSpeed;
this.attackRange = attackRange;
}
public abstract void Attack(BaseState state); // ๊ธฐ๋ณธ ๊ณต๊ฒฉ
public abstract void DashAttack(BaseState state); // ๋์ ๊ณต๊ฒฉ
public abstract void ChargingAttack(BaseState state); // ์ฐจ์ง ๊ณต๊ฒฉ
public abstract void Skill(BaseState state); // ์คํฌ
public abstract void UltimateSkill(BaseState state); // ๊ถ๊ทน๊ธฐ
}
๊ทธ๋ ๋ค๋ฉด, ์ด๋ฌํ ๋ฌด๊ธฐ๋ค์ ๊ด๋ฆฌํด์ฃผ๋ ํด๋์ค๋ ํ์ํ ๊ฒ๋๋ค.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponManager
{
// ํ์ฌ ๋ฌด๊ธฐ ์คํฌ๋ฆฝํธ
public BaseWeapon Weapon { get; private set; }
// ์ด ๋ถ๋ถ์ ํฌ๊ฒ ์ ๊ฒฝ ์ ์ฐ์
๋ ๋ฉ๋๋ค.
public Action<GameObject> unRegisterWeapon { get; set; }
// ๋ฌด๊ธฐ๋ฅผ ์ฅ๋ ์์ ํธ๋์คํผ
private Transform handPosition;
// ํ์ฌ ๋ด ๋ฌด๊ธฐ ์ค๋ธ์ ํธ
private GameObject weaponObject;
// ํ์ฌ WeaponManager์ ๋ฑ๋ก๋ ๋ฌด๊ธฐ ๋ฆฌ์คํธ
private List<GameObject> weapons = new List<GameObject>();
public WeaponManager(Transform hand)
{
handPosition = hand;
}
// ๋ฌด๊ธฐ ๋ฑ๋ก
public void RegisterWeapon(GameObject weapon)
{
if (!weapons.Contains(weapon))
{
BaseWeapon weaponInfo = weapon.GetComponent<BaseWeapon>();
weapon.transform.SetParent(handPosition);
weapon.transform.localPosition = weaponInfo.HandleData.localPosition;
weapon.transform.localEulerAngles = weaponInfo.HandleData.localRotation;
weapon.transform.localScale = weaponInfo.HandleData.localScale;
weapons.Add(weapon);
weapon.SetActive(false);
}
}
// ๋ฌด๊ธฐ ์ญ์
public void UnRegisterWeapon(GameObject weapon)
{
if (weapons.Contains(weapon))
{
weapons.Remove(weapon);
unRegisterWeapon.Invoke(weapon);
}
}
// ๋ฌด๊ธฐ ๋ณ๊ฒฝ
public void SetWeapon(GameObject weapon)
{
if (Weapon == null)
{
weaponObject = weapon;
Weapon = weapon.GetComponent<BaseWeapon>();
weaponObject.SetActive(true);
Player.Instance.animator.runtimeAnimatorController = Weapon.WeaponAnimator;
return;
}
for(int i = 0; i < weapons.Count; i++)
{
if (weapons[i].Equals(Weapon))
{
weaponObject = weapon;
weaponObject.SetActive(true);
Weapon = weapon.GetComponent<BaseWeapon>();
Player.Instance.animator.runtimeAnimatorController = Weapon.WeaponAnimator;
continue;
}
weapons[i].SetActive(false);
}
}
}
์ฝ๋๊ฐ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ ๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค. ํ์ฌ ๋ด๊ฐ ์ฌ์ฉํ๋ ๋ฌด๊ธฐ๋ง ํ์ฑํ ๋์ด์๊ณ , ๋๋จธ์ง ๋ฌด๊ธฐ๋ค์ ๋นํ์ฑํ๋ ์ฑ๋ก ์ฅ๊ณ ์๋ค๋ ๊ฒ์ด ํต์ฌ์ด ๋๊ฒ ๋ค์. WeaponManager ํด๋์ค๋ฅผ ๋ง๋ค์์ผ๋, Player ์คํฌ๋ฆฝํธ์ ์ ์ธํด์ฃผ๋๋ก ํฉ์๋ค.
์ด์ ์์๋ก ํ ๋ฒ ํ ์คํธํด๋ณด๋๋ก ํ์ฃ . ๋น ์ค๋ธ์ ํธ์ ์ธ๋ฒคํ ๋ฆฌ ๋งค๋์ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ด์, ์นด๋ก ์ ๋ ธ ๋ฌด๊ธฐ๋ฅผ ๋ฑ๋กํ์ฌ ๋ด ์๋ค.
*์๋ก์ด ๋ฌด๊ธฐ๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ ๋์ ๊ฐฑ์ ๋๋ ์ฝ๋ ๋ถ๋ถ์ ์์ฑํ์ง ์์์ต๋๋ค. ๋์ค์ ์งํ์ด ๋ ๋๋ฉด ๊ทธ๋ ๋ง๋ค๋ ค๊ตฌ์!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InventoryManager : MonoBehaviour
{
public static InventoryManager Instance { get; private set; }
private static InventoryManager instance;
public GameObject charonPaddle; /// ํ
์คํธ์ฉ ์นด๋ก ์ ๋
ธ
void Awake()
{
if(instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
return;
}
DestroyImmediate(gameObject);
}
void Start()
{
Init();
}
private void Init() /// ๊ฒ์ ์์ ํ ์ ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌด๊ธฐ๋ฅผ ์ฝ์ด์ค๋ ์ด๊ธฐํ ๋ฉ์๋
{
/*
---------์๋ ์ฝ๋---------
๋๊ฐ ์ด๋ฐ ๋ก์ง์ผ๋ก ๋์๊ฐ๋ค๊ณ ๋ง ์๊ฐ์ ํด๋์์ต๋๋ค.
GameObject[] weapons = Database.LoadWeapons();
for(int i = 0; i < weapons.Length; i++)
{
Player.Instance.weaponManager.RegisterWeapon(weapon[i]);
}
*/
// ์นด๋ก ์ ๋
ธ ํ
์คํธ์ฉ
GameObject weapon = Instantiate(charonPaddle);
Player.Instance.weaponManager.RegisterWeapon(weapon);
Player.Instance.weaponManager.SetWeapon(weapon);
}
}
์ด์ ๊ฒ์์ ์คํํด๋ณด๋ฉด, ์๋ ๋น์์ด์์ง๋ง ์นด๋ก ์ ๋ ธ๋ฅผ ์ฅ๊ณ ์๋ ๋ชจ์ต์ ๋ณผ ์ ์์ ๊ฒ๋๋ค.
์ง๊ธ์ ๋ฌด๊ธฐ๋ฅผ ํ๋ ๋ฐ์ ์ถ๊ฐํ์ง ์์์ง๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌด๊ธฐ๋ค์ด ์ฌ๋ฌ ๊ฐ์๋ค๋ฉด, HandleWeaponPosition ์์์ผ๋ก ์์ฑ๋์์ ๊ฒ์ด๊ณ , ํ์ฌ ์ฌ์ฉ ์ค์ธ ๋ฌด๊ธฐ๋ง ํ์ฑํ๊ฐ ๋์ด ์๊ฒ ์ง์. ์ด๋ฐ ๊ธฐ๋ฐ์ ๋ง๋ค์ด ๋์์ผ๋, ์์ผ๋ก ์๋ก์ด ๋ฌด๊ธฐ๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด, ์ฌ๊ธฐ์ ๋ฑ๋กํ๊ธฐ๋ง ํ๋ฉด ๋๊ฒ ์ต๋๋ค.
๋ ์์ฑํ๋ ค๊ณ ํ๋๋ฐ, ๊ธ์ด ๊ธธ์ด์ง ๊ฒ ๊ฐ์์ ๋ค์ ๊ธ์์ ์จ์ผํ ๊ฒ ๊ฐ๋ค์. ๋ค์ ๊ธ์์๋ ๋ค์ ๋ด์ฉ๋ค์ ๋ค๋ค๋ณผ๊น ํฉ๋๋ค.
- ์ฌ์ฉ์์ ์ฌ๋ฌ ๊ณต๊ฒฉ ํค ์ ๋ ฅ๋ค ๋ฐ์ ๋ถ๊ธฐ ์ฒ๋ฆฌํ๊ธฐ
- ๊ณต๊ฒฉ ์ํ(AttackState)๋ฅผ ์ํ๋จธ์ (StateMachine)์ ์ถ๊ฐํ๊ธฐ
- ์นด๋ก ์ ๋ ธ ๊ธฐ๋ณธ 3ํ ๊ณต๊ฒฉ ๊ตฌํํ๊ธฐ
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!