몬스터 스킬 제거
This commit is contained in:
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d92f0de2a85e2ad43b438f0291dd2a01
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,17 +0,0 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace TON
|
||||
{
|
||||
[System.Serializable]
|
||||
public class MonsterSkillData
|
||||
{
|
||||
public int skillId; // 스킬 ID
|
||||
public string skillName; // 스킬 이름
|
||||
public float damage; // 스킬 데미지
|
||||
public float cooldown; // 스킬 쿨다운
|
||||
public float range; // 스킬 범위
|
||||
public string prefabName; // 스킬 프리팹 이름
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e7674986391c77044bbc330f14711e86
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -7,10 +7,7 @@ namespace TON
|
||||
{
|
||||
public partial class MonsterBase : MonoBehaviour, IDamage
|
||||
{
|
||||
[SerializeField] private GameObject _target; // 몬스터의 타겟
|
||||
[SerializeField] private Collider2D _collider; // 몬스터의 콜라이더
|
||||
[SerializeField] private SpriteRenderer _spriteRenderer; // 몬스터의 스프라이트 렌더러
|
||||
// [SerializeField] private TextMeshProUGUI _textState;
|
||||
[SerializeField] public int id; // 몬스터의 ID
|
||||
public float defencePower;
|
||||
public float defenceIntention = 30; // 몬스터 방어력 변수
|
||||
@@ -27,7 +24,6 @@ namespace TON
|
||||
private float moveSpeed = 2f;
|
||||
|
||||
StateMachine _stateMachine;
|
||||
private SkillPattern _skillPattern;
|
||||
|
||||
private Vector3 _direction; // 몬스터의 이동 방향
|
||||
public bool IsDetect { get; set; } // 몬스터가 대상을 인식했는지 여부
|
||||
@@ -49,24 +45,14 @@ namespace TON
|
||||
{
|
||||
_animator = GetComponent<Animator>(); // 애니메이터 컴포넌트 초기화
|
||||
|
||||
// TODO : 추후 제거 예정
|
||||
// _stateMachine = new StateMachine(new IdleState(), this, _textState);
|
||||
_stateMachine = new StateMachine(new IdleState(), this);
|
||||
|
||||
InitializeMonsterData(); // 몬스터 데이터 로드 및 적용
|
||||
|
||||
if (_monsterData.monsterSkillID != 0)
|
||||
{
|
||||
_skillPattern = new MonsterSkillPattern(_monsterData, this);
|
||||
IsSkillAttackable = _skillPattern.IsAttackable;
|
||||
}
|
||||
|
||||
_direction = new Vector3(1, 0, 0); // 초기 이동 방향 (x 축 양의 방향)
|
||||
|
||||
_spriteRenderer.flipX = !(_direction.x > 0); // 이동 방향에 따라 스프라이트 플립
|
||||
|
||||
_collider = GetComponent<Collider2D>(); // 콜라이더 컴포넌트 초기화
|
||||
|
||||
// CharacterBase 참조 설정
|
||||
_characterBase = GameObject.Find("TON.Player").GetComponentInChildren<CharacterBase>();
|
||||
|
||||
@@ -116,11 +102,6 @@ namespace TON
|
||||
private void Update()
|
||||
{
|
||||
_stateMachine.Update();
|
||||
|
||||
if (_monsterData.monsterSkillID != 0)
|
||||
{
|
||||
_skillPattern.Update();
|
||||
}
|
||||
}
|
||||
|
||||
public void FinishAttack()
|
||||
@@ -207,31 +188,19 @@ namespace TON
|
||||
if (target != null)
|
||||
{
|
||||
Vector2 direction = target.transform.position - transform.position; // 타겟과의 방향 계산
|
||||
_spriteRenderer.flipX = target.transform.position.x < transform.position.x; // 타겟이 왼쪽에 있으면 스프라이트를 왼쪽으로, 오른쪽에 있으면 오른쪽으로 바라보도록 설정
|
||||
_spriteRenderer.flipX =
|
||||
target.transform.position.x <
|
||||
transform.position.x; // 타겟이 왼쪽에 있으면 스프라이트를 왼쪽으로, 오른쪽에 있으면 오른쪽으로 바라보도록 설정
|
||||
|
||||
transform.Translate(direction.normalized * moveSpeed * Time.deltaTime); // 타겟 방향으로 이동
|
||||
}
|
||||
}
|
||||
|
||||
public void MonsterSkillLaunch()
|
||||
{
|
||||
if (_monsterData.monsterSkillID != 0)
|
||||
{
|
||||
var target = GameObject.FindGameObjectWithTag("Player");
|
||||
_skillPattern.Attack(target);
|
||||
}
|
||||
}
|
||||
|
||||
public void DestroyMonster()
|
||||
{
|
||||
RewardData();
|
||||
SoundManager.instance.SFXPlay("Death", _deathSound);
|
||||
Destroy(gameObject); // 몬스터 파괴
|
||||
}
|
||||
|
||||
public SkillPattern GetSkillPattern()
|
||||
{
|
||||
return _skillPattern;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace TON
|
||||
{
|
||||
public class MonsterSkill : MonoBehaviour
|
||||
{
|
||||
public float speed = 5f;
|
||||
public float damage = 0f;
|
||||
|
||||
Vector2 direction;
|
||||
Transform playerTransform; // 플레이어의 Transform을 저장할 변수
|
||||
[SerializeField] private SpriteRenderer _spriteRenderer; // 스킬의 스프라이트 렌더러
|
||||
private MonsterBase _monsterBase;
|
||||
private CharacterBase _characterBase;
|
||||
public Vector2 Direction
|
||||
{
|
||||
set { direction = value.normalized; }
|
||||
}
|
||||
|
||||
void Start()
|
||||
{
|
||||
_spriteRenderer = GetComponent<SpriteRenderer>();
|
||||
|
||||
_characterBase = GameObject.Find("TON.Player").GetComponentInChildren<CharacterBase>();
|
||||
|
||||
if (_characterBase != null)
|
||||
{
|
||||
playerTransform = _characterBase.transform;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("Player 오브젝트를 찾을 수 없습니다. 태그를 확인하세요.");
|
||||
return; // 플레이어 없으면 이후 로직 실행 중지
|
||||
}
|
||||
|
||||
SetDirection(); // 발사 방향 설정
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
transform.Translate(direction * speed * Time.deltaTime);
|
||||
}
|
||||
|
||||
private void OnTriggerEnter2D(Collider2D collision)
|
||||
{
|
||||
if (collision.CompareTag("Player"))
|
||||
{
|
||||
// 플레이어에게 직접 데미지 적용
|
||||
_characterBase?.ApplyDamage(damage);
|
||||
Destroy(gameObject);
|
||||
}
|
||||
else if (collision.CompareTag("Ground"))
|
||||
{
|
||||
// 지형에 부딪히면 스킬 오브젝트만 파괴
|
||||
Destroy(gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetSkillDamage(float skillDamage)
|
||||
{
|
||||
damage += skillDamage;
|
||||
}
|
||||
|
||||
void SetDirection()
|
||||
{
|
||||
if (playerTransform == null) return; // 플레이어가 없으면 방향 설정 불가
|
||||
|
||||
Vector2 toPlayer = playerTransform.position - transform.position; // MonsterSkill과 Player의 위치 차이 계산
|
||||
|
||||
// 플레이어의 왼쪽/오른쪽 판별
|
||||
if (toPlayer.x < 0)
|
||||
{
|
||||
direction = new Vector2(-1, 0); // 플레이어가 왼쪽에 있으면 왼쪽 방향으로 발사
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = new Vector2(1, 0); // 플레이어가 오른쪽에 있으면 오른쪽 방향으로 발사
|
||||
_spriteRenderer.flipX = true; // 왼쪽 방향일 때 좌우 반전
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 190405d8d5d2c0e4683121e913af8457
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,49 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace TON
|
||||
{
|
||||
public class MonsterSkillDataManager : SingletonBase<MonsterSkillDataManager>
|
||||
{
|
||||
// 전체 몬스터 스킬 데이터 리스트
|
||||
public List<MonsterSkillData> monstersSkillData { get; private set; }
|
||||
|
||||
// 현재 선택된 몬스터 스킬 데이터
|
||||
public MonsterSkillData currentMonsterSkill { get; private set; }
|
||||
|
||||
protected override void Awake()
|
||||
{
|
||||
base.Awake();
|
||||
LoadMonsterSkillData();
|
||||
}
|
||||
|
||||
private void LoadMonsterSkillData()
|
||||
{
|
||||
monstersSkillData = JSONLoader.LoadFromResources<List<MonsterSkillData>>("MonsterSkills");
|
||||
if (monstersSkillData == null)
|
||||
{
|
||||
monstersSkillData = new List<MonsterSkillData>();
|
||||
Debug.LogError("몬스터 스킬 데이터 로드 실패");
|
||||
}
|
||||
}
|
||||
|
||||
public MonsterSkillData GetMonsterSkillData(int monsterSkillId)
|
||||
{
|
||||
if (monsterSkillId >= 0 && monsterSkillId < monstersSkillData.Count)
|
||||
{
|
||||
currentMonsterSkill = monstersSkillData[monsterSkillId];
|
||||
return currentMonsterSkill;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"유효하지 않은 몬스터 SkillID입니다: {monsterSkillId}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public List<MonsterSkillData> GetAllMonsterSkillData()
|
||||
{
|
||||
return monstersSkillData;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 517b06d480f28194b830fa1520a0a395
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -103,24 +103,23 @@ namespace TON
|
||||
SoundManager.instance.BgSoundPlay(null);
|
||||
// 필요하다면 gameStarted = false; 등을 설정하여 한 번만 실행되게 함
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void SpawnBossMonster()
|
||||
{
|
||||
GameObject bossPrefab = GetBossPrefabForWave(currentWave);
|
||||
|
||||
// 스폰 포인트 배열의 처음과 마지막 위치에 보스 몬스터 생성
|
||||
if (spawnPoints.Length >= 2)
|
||||
{
|
||||
// 왼쪽 스폰 포인트
|
||||
GameObject leftBoss = Instantiate(bossPrefab, spawnPoints[0].position, Quaternion.identity);
|
||||
monsterPool.Add(leftBoss);
|
||||
activeMonsters.Add(leftBoss);
|
||||
SetupBossComponents(leftBoss);
|
||||
|
||||
// 오른쪽 스폰 포인트
|
||||
GameObject rightBoss = Instantiate(bossPrefab, spawnPoints[spawnPoints.Length - 1].position, Quaternion.identity);
|
||||
monsterPool.Add(rightBoss);
|
||||
activeMonsters.Add(rightBoss);
|
||||
SetupBossComponents(rightBoss);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -139,6 +138,22 @@ namespace TON
|
||||
// 보스가 죽으면 Update에서 체크하여 다음 웨이브로 넘어감
|
||||
}
|
||||
|
||||
private void SetupBossComponents(GameObject boss)
|
||||
{
|
||||
MonsterBase monsterBase = boss.GetComponent<MonsterBase>();
|
||||
|
||||
Attack attackComponent = boss.GetComponentInChildren<Attack>();
|
||||
Eyesight eyesightComponent = boss.GetComponentInChildren<Eyesight>();
|
||||
|
||||
if (attackComponent != null)
|
||||
attackComponent.SetMonsterBase(monsterBase);
|
||||
if (eyesightComponent != null)
|
||||
eyesightComponent.SetMonsterBase(monsterBase);
|
||||
|
||||
monsterPool.Add(boss);
|
||||
activeMonsters.Add(boss);
|
||||
}
|
||||
|
||||
private void StartNextWave()
|
||||
{
|
||||
StageManager.Singleton.SetWaveData(currentWave); // 웨이브 정보 전달.
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace TON
|
||||
{
|
||||
public abstract class SkillPattern
|
||||
{
|
||||
protected MonsterData _monsterData;
|
||||
protected MonsterBase _monsterBase;
|
||||
|
||||
protected SkillPattern(MonsterData monsterData, MonsterBase monsterBase)
|
||||
{
|
||||
_monsterData = monsterData;
|
||||
_monsterBase = monsterBase;
|
||||
}
|
||||
|
||||
public bool IsAttackable { get; set; }
|
||||
|
||||
public abstract bool IsSkillInCooldown();
|
||||
|
||||
public abstract void Attack(GameObject target);
|
||||
|
||||
public abstract void Update();
|
||||
}
|
||||
|
||||
public class MonsterSkillPattern : SkillPattern
|
||||
{
|
||||
private float _lastSkillTime;
|
||||
private MonsterSkillData _monsterSkillData;
|
||||
private MonsterSkill _skill;
|
||||
private Vector3 _skillOffset = new Vector3(0, -0.5f, 0);
|
||||
|
||||
public MonsterSkillPattern(MonsterData monsterData, MonsterBase monsterBase) : base(monsterData, monsterBase)
|
||||
{
|
||||
_monsterSkillData = MonsterSkillDataManager.Singleton.GetMonsterSkillData(_monsterData.monsterSkillID);
|
||||
_lastSkillTime = -_monsterSkillData.cooldown; // 시작시 스킬 사용 가능하도록
|
||||
IsAttackable = true;
|
||||
|
||||
if (_monsterSkillData != null)
|
||||
{
|
||||
// Debug.Log($"몬스터 {_monsterSkillData.skillName} 데이터 로드 완료");
|
||||
_skill = Resources.Load<MonsterSkill>($"MonsterSkillPrefabs/{_monsterSkillData.skillName}");
|
||||
}
|
||||
}
|
||||
|
||||
public override void Attack(GameObject target)
|
||||
{
|
||||
if (target == null) return;
|
||||
|
||||
_monsterBase.GetComponent<SpriteRenderer>().flipX = target.transform.position.x < _monsterBase.transform.position.x;
|
||||
Vector3 spawnPosition = _monsterBase.transform.position - _skillOffset;
|
||||
|
||||
Object.Instantiate(_skill, spawnPosition, Quaternion.identity);
|
||||
SkillAttack(_monsterSkillData.damage);
|
||||
|
||||
// 스킬 사용 후 쿨다운 시작
|
||||
_lastSkillTime = Time.time;
|
||||
IsAttackable = false;
|
||||
|
||||
// Debug.Log($"스킬 사용, 쿨다운 시작: {_monsterSkillData.cooldown}초");
|
||||
}
|
||||
|
||||
public void SkillAttack(float skillDamage)
|
||||
{
|
||||
// 데미지 계산 (현재 임시 값)
|
||||
DamageCalculator damageCalculator = new DamageCalculator();
|
||||
|
||||
float baseAttack = _monsterData.attackPower * skillDamage; // 기본 공격력 * 스킬 데미지
|
||||
float equipmentAttack = 0; // 장비 공격력
|
||||
float defense = PlayerDataManager.Singleton.player.defensivePower / (PlayerDataManager.Singleton.player.defensivePower + PlayerDataManager.Singleton.defensiveIntention); // 캐릭터 방어력
|
||||
|
||||
// 기본 데미지 계산 (치명타 없음)
|
||||
float damage = damageCalculator.CalculateBaseDamage(baseAttack, equipmentAttack, defense);
|
||||
|
||||
_skill.SetSkillDamage(damage);
|
||||
|
||||
// Debug.Log($" 몬스터 스킬 공격! 최종 데미지: {damage}"); // 데미지 출력
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
// 스킬 쿨다운 체크
|
||||
if (!IsAttackable && Time.time - _lastSkillTime >= _monsterSkillData.cooldown)
|
||||
{
|
||||
IsAttackable = true;
|
||||
// Debug.Log("스킬 쿨다운 완료");
|
||||
}
|
||||
}
|
||||
|
||||
public override bool IsSkillInCooldown()
|
||||
{
|
||||
return !IsAttackable;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 55724230a1ec9b5418a40829c72b81fa
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -172,9 +172,6 @@ namespace TON
|
||||
if(_monsterBase.IsDetect== false)
|
||||
return new IdleState();
|
||||
|
||||
if (_monsterBase.IsSkillAttackable)
|
||||
return new MonsterSkillState();
|
||||
|
||||
// Attack으로 변경
|
||||
if (_monsterBase.IsAttacking)
|
||||
return new AttackState();
|
||||
@@ -240,60 +237,6 @@ namespace TON
|
||||
return this;
|
||||
}
|
||||
}
|
||||
public class MonsterSkillState : IState
|
||||
{
|
||||
private const string AniAttack = "Attack"; // 공격 애니메이션
|
||||
private MonsterBase _monsterBase;
|
||||
private float _skillAttackAnimationDuration = 0.5f; // 공격 애니메이션 지속 시간
|
||||
private float _skillAttackDelayTime = 10f; // 공격 딜레이 시간
|
||||
private float _lastSkillAttackTime; // 마지막 공격 시간
|
||||
|
||||
private bool _isSkillAttacking;
|
||||
|
||||
public void Enter(MonsterBase monsterBase)
|
||||
{
|
||||
_monsterBase = monsterBase;
|
||||
_lastSkillAttackTime = -_skillAttackDelayTime; // 처음 진입시 바로 공격하도록 설정
|
||||
SkillAttack();
|
||||
}
|
||||
|
||||
public void Update()
|
||||
{
|
||||
// 현재 공격 중이 아니고, 쿨다운이 지났다면 공격
|
||||
if (!_isSkillAttacking && Time.time >= _lastSkillAttackTime + _skillAttackDelayTime)
|
||||
{
|
||||
SkillAttack();
|
||||
}
|
||||
|
||||
// 공격 애니메이션 종료 체크
|
||||
if (_isSkillAttacking && Time.time >= _lastSkillAttackTime + _skillAttackAnimationDuration)
|
||||
{
|
||||
_isSkillAttacking = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void SkillAttack()
|
||||
{
|
||||
_monsterBase.ChangeAnimationState(AniAttack);
|
||||
_monsterBase.MonsterSkillLaunch();
|
||||
_lastSkillAttackTime = Time.time;
|
||||
_isSkillAttacking = true;
|
||||
}
|
||||
|
||||
public void Exit()
|
||||
{
|
||||
_isSkillAttacking = false;
|
||||
}
|
||||
|
||||
public IState CheckTransition()
|
||||
{
|
||||
|
||||
if(_isSkillAttacking == false)
|
||||
return new IdleState();
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
public class HitState : IState
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user