- WeaponTrait enum 추가 (Melee/TwoHanded/Defense/Magic/Ranged) - SkillData에 allowedWeaponTraits 필드 및 MatchesWeaponTrait() 검증 메서드 추가 - WeaponEquipment에 보조손(오프핸드) 슬롯 지원 (장착/해제/스탯 보너스/네트워크 동기화) - EquippedWeaponTraits 프로퍼티로 메인+보조 무기 특성 합산 제공 - PlayerSkillInput 4곳(OnSkillInput/RPC/CanUseSkill/DebugExecute)에 무기 trait 제약 검증 추가 - SkillSlotUI에 무기 불호환 시 회색 표시(weaponIncompatibleColor) 지원 - 기존 검 에셋에 weaponTrait=Melee 설정
128 lines
4.8 KiB
C#
128 lines
4.8 KiB
C#
using System;
|
|
|
|
using UnityEngine;
|
|
|
|
using Colosseum.Stats;
|
|
|
|
namespace Colosseum.Weapons
|
|
{
|
|
/// <summary>
|
|
/// 무기 특성. 스킬 사용 조건 제약에 사용합니다.
|
|
/// 여러 특성을 동시에 가질 수 있습니다.
|
|
/// </summary>
|
|
[Flags]
|
|
public enum WeaponTrait
|
|
{
|
|
None = 0,
|
|
Melee = 1 << 0, // 근접 (한손검, 양손검, 완드, 스태프)
|
|
TwoHanded = 1 << 1, // 양손 (양손검, 스태프)
|
|
Defense = 1 << 2, // 방어 (방패)
|
|
Magic = 1 << 3, // 마법 (완드, 스태프)
|
|
Ranged = 1 << 4, // 사격 (활)
|
|
}
|
|
|
|
/// <summary>
|
|
/// 무기 장착 위치
|
|
/// </summary>
|
|
public enum WeaponSlot
|
|
{
|
|
RightHand, // 오른손
|
|
LeftHand, // 왼손
|
|
Back, // 등
|
|
Hip, // 허리
|
|
TwoHanded, // 양손
|
|
}
|
|
|
|
/// <summary>
|
|
/// 무기 데이터. 무기의 기본 정보, 스탯 보너스, 배율, 외형을 관리합니다.
|
|
/// </summary>
|
|
[CreateAssetMenu(fileName = "NewWeapon", menuName = "Colosseum/Weapon")]
|
|
public class WeaponData : ScriptableObject
|
|
{
|
|
[Header("기본 정보")]
|
|
[SerializeField] private string weaponName;
|
|
[TextArea(2, 4)]
|
|
[SerializeField] private string description;
|
|
[SerializeField] private Sprite icon;
|
|
|
|
[Header("장착 설정")]
|
|
[Tooltip("무기의 특성 (근접/양손/방어/마법/사격). 스킬 사용 조건에 사용됩니다.")]
|
|
[SerializeField] private WeaponTrait weaponTrait = WeaponTrait.Melee;
|
|
[Tooltip("무기가 장착될 슬롯")]
|
|
[SerializeField] private WeaponSlot weaponSlot = WeaponSlot.RightHand;
|
|
[Tooltip("무기 프리팹 (메시, 콜라이더 등 포함)")]
|
|
[SerializeField] private GameObject weaponPrefab;
|
|
[Tooltip("장착 시 위치 오프셋")]
|
|
[SerializeField] private Vector3 positionOffset = Vector3.zero;
|
|
[Tooltip("장착 시 회전 오프셋 (오일러 각도)")]
|
|
[SerializeField] private Vector3 rotationOffset = Vector3.zero;
|
|
[Tooltip("장착 시 스케일")]
|
|
[SerializeField] private Vector3 scale = Vector3.one;
|
|
|
|
[Header("스탯 보너스 (Flat)")]
|
|
[Tooltip("힘 보너스")]
|
|
[SerializeField] private int strengthBonus = 0;
|
|
[Tooltip("민첩 보너스")]
|
|
[SerializeField] private int dexterityBonus = 0;
|
|
[Tooltip("지능 보너스")]
|
|
[SerializeField] private int intelligenceBonus = 0;
|
|
[Tooltip("활력 보너스")]
|
|
[SerializeField] private int vitalityBonus = 0;
|
|
[Tooltip("지혜 보너스")]
|
|
[SerializeField] private int wisdomBonus = 0;
|
|
[Tooltip("정신 보너스")]
|
|
[SerializeField] private int spiritBonus = 0;
|
|
|
|
[Header("배율")]
|
|
[Tooltip("데미지 배율 (1.0 = 100%, 1.5 = 150%)")]
|
|
[Min(0f)] [SerializeField] private float damageMultiplier = 1f;
|
|
[Tooltip("사거리 배율 (1.0 = 100%, 1.2 = 120%)")]
|
|
[Min(0f)] [SerializeField] private float rangeMultiplier = 1f;
|
|
[Tooltip("마나 소모 배율 (1.0 = 100%, 0.8 = 80%)")]
|
|
[Min(0f)] [SerializeField] private float manaCostMultiplier = 1f;
|
|
|
|
// Properties - 기본 정보
|
|
public string WeaponName => weaponName;
|
|
public string Description => description;
|
|
public Sprite Icon => icon;
|
|
|
|
// Properties - 장착 설정
|
|
public WeaponTrait WeaponTrait => weaponTrait;
|
|
public WeaponSlot WeaponSlot => weaponSlot;
|
|
public GameObject WeaponPrefab => weaponPrefab;
|
|
public Vector3 PositionOffset => positionOffset;
|
|
public Vector3 RotationOffset => rotationOffset;
|
|
public Vector3 Scale => scale;
|
|
|
|
// Properties - 스탯 보너스
|
|
public int StrengthBonus => strengthBonus;
|
|
public int DexterityBonus => dexterityBonus;
|
|
public int IntelligenceBonus => intelligenceBonus;
|
|
public int VitalityBonus => vitalityBonus;
|
|
public int WisdomBonus => wisdomBonus;
|
|
public int SpiritBonus => spiritBonus;
|
|
|
|
// Properties - 배율
|
|
public float DamageMultiplier => damageMultiplier;
|
|
public float RangeMultiplier => rangeMultiplier;
|
|
public float ManaCostMultiplier => manaCostMultiplier;
|
|
|
|
/// <summary>
|
|
/// 스탯 타입에 해당하는 보너스 값 반환
|
|
/// </summary>
|
|
public int GetStatBonus(StatType statType)
|
|
{
|
|
return statType switch
|
|
{
|
|
StatType.Strength => strengthBonus,
|
|
StatType.Dexterity => dexterityBonus,
|
|
StatType.Intelligence => intelligenceBonus,
|
|
StatType.Vitality => vitalityBonus,
|
|
StatType.Wisdom => wisdomBonus,
|
|
StatType.Spirit => spiritBonus,
|
|
_ => 0,
|
|
};
|
|
}
|
|
}
|
|
}
|