2026-04-06 스킬시스템
This commit is contained in:
54
Assets/02_Scripts/Skill/Data/SkillData.cs
Normal file
54
Assets/02_Scripts/Skill/Data/SkillData.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
using UnityEngine;
|
||||
|
||||
/*
|
||||
사용법:
|
||||
Project에서 Create → Skill/SkillData로 스킬 에셋 생성, 레벨별 수치 입력
|
||||
Create → Skill/WeaponSkillSet로 무기별 스킬 묶음 생성
|
||||
플레이어에 SkillManager + Effect 컴포넌트들 부착
|
||||
무기 변경 시 LoadWeaponSkills(skillSet) 호출
|
||||
입력 시 SkillInput(slotIndex, inputState) 호출
|
||||
*/
|
||||
|
||||
[CreateAssetMenu(menuName = "Skill/SkillData")]
|
||||
public class SkillData : ScriptableObject
|
||||
{
|
||||
[Header("기본 정보")]
|
||||
public string SkillName;
|
||||
[TextArea] public string Description;
|
||||
public Sprite Icon;
|
||||
|
||||
[Header("스킬 분류")]
|
||||
public SkillType SkillType;
|
||||
public ActivationType ActivationType;
|
||||
public TargetType TargetType;
|
||||
|
||||
[Header("애니메이션")]
|
||||
public string AnimTrigger;
|
||||
|
||||
[Header("이펙트")]
|
||||
public GameObject EffectPrefab;
|
||||
|
||||
[Header("레벨별 수치")]
|
||||
public SkillLevelData[] Levels;
|
||||
|
||||
public SkillLevelData GetLevelData(int level)
|
||||
{
|
||||
int idx = Mathf.Clamp(level - 1, 0, Levels.Length - 1);
|
||||
return Levels[idx];
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class SkillLevelData
|
||||
{
|
||||
public float Damage;
|
||||
public float Range;
|
||||
public float Cooldown;
|
||||
public float ManaCost;
|
||||
public float Duration;
|
||||
public float ChargeTimeMax;
|
||||
}
|
||||
|
||||
public enum SkillType { Active, Passive }
|
||||
public enum ActivationType { Instant, Charge }
|
||||
public enum TargetType { Self, Single, Area, Projectile }
|
||||
9
Assets/02_Scripts/Skill/Data/WeaponSkillSet.cs
Normal file
9
Assets/02_Scripts/Skill/Data/WeaponSkillSet.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
[CreateAssetMenu(menuName = "Skill/WeaponSkillSet")]
|
||||
public class WeaponSkillSet : ScriptableObject
|
||||
{
|
||||
public WeaponType WeaponType;
|
||||
public List<SkillData> Skills;
|
||||
}
|
||||
25
Assets/02_Scripts/Skill/Effects/AreaEffect.cs
Normal file
25
Assets/02_Scripts/Skill/Effects/AreaEffect.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class AreaEffect : MonoBehaviour, ISkillEffect
|
||||
{
|
||||
public void Execute(SkillInstance skill, Transform caster, float chargeRatio)
|
||||
{
|
||||
SkillLevelData levelData = skill.CurrentLevelData;
|
||||
float finalDamage = levelData.Damage * chargeRatio;
|
||||
|
||||
Vector3 center = caster.position + caster.forward * levelData.Range;
|
||||
|
||||
if (skill.Data.EffectPrefab != null)
|
||||
{
|
||||
Instantiate(skill.Data.EffectPrefab, center, Quaternion.identity);
|
||||
}
|
||||
|
||||
Collider[] hits = Physics.OverlapSphere(center, levelData.Range);
|
||||
foreach (Collider hit in hits)
|
||||
{
|
||||
if (hit.transform == caster) continue;
|
||||
|
||||
Debug.Log($"[범위] {hit.name}에게 {finalDamage} 데미지");
|
||||
}
|
||||
}
|
||||
}
|
||||
14
Assets/02_Scripts/Skill/Effects/BuffEffect.cs
Normal file
14
Assets/02_Scripts/Skill/Effects/BuffEffect.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class BuffEffect : MonoBehaviour, ISkillEffect
|
||||
{
|
||||
public void Execute(SkillInstance skill, Transform caster, float chargeRatio)
|
||||
{
|
||||
SkillLevelData levelData = skill.CurrentLevelData;
|
||||
|
||||
// PlayerStat에 버프 적용
|
||||
// caster.GetComponent<PlayerStat>()?.ApplyBuff(levelData);
|
||||
|
||||
Debug.Log($"버프 적용: {skill.Data.SkillName}, 지속시간 {levelData.Duration}초");
|
||||
}
|
||||
}
|
||||
20
Assets/02_Scripts/Skill/Effects/DamageEffect.cs
Normal file
20
Assets/02_Scripts/Skill/Effects/DamageEffect.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class DamageEffect : MonoBehaviour, ISkillEffect
|
||||
{
|
||||
public void Execute(SkillInstance skill, Transform caster, float chargeRatio)
|
||||
{
|
||||
SkillLevelData levelData = skill.CurrentLevelData;
|
||||
float finalDamage = levelData.Damage * chargeRatio;
|
||||
float range = levelData.Range;
|
||||
|
||||
Collider[] hits = Physics.OverlapSphere(caster.position + caster.forward * range * 0.5f, range);
|
||||
foreach (Collider hit in hits)
|
||||
{
|
||||
if (hit.transform == caster) continue;
|
||||
|
||||
// IDamageable 등 인터페이스가 있으면 여기서 적용
|
||||
Debug.Log($"{hit.name}에게 {finalDamage} 데미지");
|
||||
}
|
||||
}
|
||||
}
|
||||
6
Assets/02_Scripts/Skill/Effects/ISkillEffect.cs
Normal file
6
Assets/02_Scripts/Skill/Effects/ISkillEffect.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
using UnityEngine;
|
||||
|
||||
public interface ISkillEffect
|
||||
{
|
||||
void Execute(SkillInstance skill, Transform caster, float chargeRatio);
|
||||
}
|
||||
15
Assets/02_Scripts/Skill/Effects/ProjectileEffect.cs
Normal file
15
Assets/02_Scripts/Skill/Effects/ProjectileEffect.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class ProjectileEffect : MonoBehaviour, ISkillEffect
|
||||
{
|
||||
public void Execute(SkillInstance skill, Transform caster, float chargeRatio)
|
||||
{
|
||||
if (skill.Data.EffectPrefab == null) return;
|
||||
|
||||
Vector3 spawnPos = caster.position + caster.forward + Vector3.up;
|
||||
GameObject proj = Instantiate(skill.Data.EffectPrefab, spawnPos, caster.rotation);
|
||||
|
||||
// 투사체에 데미지 정보 전달
|
||||
// proj.GetComponent<Projectile>()?.Init(skill.CurrentLevelData.Damage * chargeRatio);
|
||||
}
|
||||
}
|
||||
26
Assets/02_Scripts/Skill/SkillInstance.cs
Normal file
26
Assets/02_Scripts/Skill/SkillInstance.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
public class SkillInstance
|
||||
{
|
||||
public SkillData Data { get; private set; }
|
||||
public int Level { get; set; } = 1;
|
||||
public float CooldownTimer { get; set; }
|
||||
public bool IsOnCooldown => CooldownTimer > 0f;
|
||||
|
||||
public SkillLevelData CurrentLevelData => Data.GetLevelData(Level);
|
||||
|
||||
public SkillInstance(SkillData data, int level = 1)
|
||||
{
|
||||
Data = data;
|
||||
Level = level;
|
||||
}
|
||||
|
||||
public void StartCooldown()
|
||||
{
|
||||
CooldownTimer = CurrentLevelData.Cooldown;
|
||||
}
|
||||
|
||||
public void TickCooldown(float deltaTime)
|
||||
{
|
||||
if (CooldownTimer > 0f)
|
||||
CooldownTimer -= deltaTime;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user