Menu
CoddyTech

무기 능력치

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 24번째.

검과 망치는 같은 동작을 합니다. 휘두르고, 기다렸다가, 다시 휘두릅니다. 둘의 차이는 수치입니다. 검은 4의 피해를 주고 0.5초마다 휘두르며, 망치는 10의 피해를 주고 1.5초마다 휘두릅니다. 따라서 하나의 Weapon 스크립트로 둘 다 사용할 수 있고, 각 무기의 수치는 에셋에 저장됩니다.

[CreateAssetMenu(menuName = "Combat/Weapon Data")]
public class WeaponData : ScriptableObject
{
    public string weaponName;
    public int damage;
    public float swingTime;
    public GameObject hitEffect;
}
public class Weapon : MonoBehaviour
{
    public WeaponData data;
    private float nextSwing;

    public void Swing(Health target)
    {
        if (Time.time < nextSwing) return;
        nextSwing = Time.time + data.swingTime;
        target.TakeDamage(data.damage);
        Instantiate(data.hitEffect, target.transform.position, Quaternion.identity);
    }
}

프로젝트에는 Sword 에셋(4, 0.5, 불꽃 프리팹)과 Hammer 에셋(10, 1.5, 먼지 프리팹)이 있습니다. 기사와 오우거 모두 Weapon 스크립트를 가지고 있습니다. 기사의 data 필드에는 Sword가, 오우거의 필드에는 Hammer가 할당됩니다. Create 메뉴에서 창 에셋을 하나 더 만들면 되며, 어떤 스크립트도 변경할 필요가 없습니다. 에셋은 hitEffect처럼 프리팹이나 다른 에셋을 참조할 수 있지만, 씬에 있는 오브젝트는 참조할 수 없습니다. 에셋은 프로젝트에 저장되어 모든 씬의 바깥에 있기 때문입니다.

무기를 다르게 만드는 다른 방법은 각각 수치를 코드에 넣습니다. if (weaponName == "Sword") damage = 4; else if ...는 무기가 늘어날 때마다 코드가 길어지고, 수치만 설정하는 Weapon의 Sword 하위 클래스는 에셋마다 하나씩 클래스가 필요합니다. 하위 클래스는 화살을 발사하는 활처럼 다르게 작동하는 무기에 사용합니다. 더 강한 피해를 주거나 더 빠르게 휘두를 뿐인 무기는 별도의 에셋만 있으면 되며 코드는 필요하지 않습니다.

challenge icon

챌린지

중급

모든 총이 GunData 에셋에서 수치를 읽도록 하세요.

  1. Gun에 public GunData data;를 추가하세요.
  2. data.bulletPrefab을 발사하고, 발사 사이에 data.fireInterval만큼 기다린 다음 각 탄환에 data.damage를 지정하세요.
  3. gunType, 두 개의 탄환 필드, 세 개의 private 복사본, 그리고 Start()를 삭제하세요.

‘플레이’를 누르고 Space를 누른 채로 있으면 블래스터도 발사됩니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;
using UnityEngine.InputSystem;

public class Gun : MonoBehaviour
{
    public string gunType = "Pistol";
    public GameObject pistolBullet;
    public GameObject rifleBullet;
    private GameObject bulletPrefab;
    private float fireInterval;
    private int damage;
    private float nextShot;

    void Start()
    {
        if (gunType == "Pistol")
        {
            bulletPrefab = pistolBullet;
            fireInterval = 0.25f;
            damage = 1;
        }
        else if (gunType == "Rifle")
        {
            bulletPrefab = rifleBullet;
            fireInterval = 0.6f;
            damage = 4;
        }
    }

    void Update()
    {
        if (Keyboard.current.spaceKey.isPressed && Time.time >= nextShot)
        {
            nextShot = Time.time + fireInterval;
            GameObject bullet = Instantiate(bulletPrefab, transform.position + transform.forward, transform.rotation);
            bullet.GetComponent<Bullet>().damage = damage;
        }
    }
}

Unity 게임 아키텍처의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드