최종프로젝트 진행상황
오늘의 작업 :
개별적인 Unit( = 유닛, 플레이어가 배치할 타워라고 생각해도 ok.) 이
들고있어야 하는 기능들을 생각해보니
공격 / 데미지 피격 / 죽음
크게 이렇게 세 가지가 떠올랐다.
(뭔가 더 있을 것 같은데 나의 한계..)
(아직 유니티 상에서 작업한 건 없고 코드로만 작업 ing)
Attack
GetDamage
Die
gameObject.SetActive(false);
) 해주기로 계획하고 있다.개별적인 unit 을 위한 스크립트를 작성하고
(아직은 껍데기만 있는 ^.^)
Unit.cs (아직 작업ing)
using UnityEngine;
public enum EUnitState
{
Idle,
Attacking
}
public class Unit : MonoBehaviour
{
private Animator _animator;
private EUnitState unitState;
//private List<Enemy> currentEnemiesInRange = new List<Enemy>(); // 플레이어의 공격 범위 안에 들어온 적들을 List 로 관리.
private int damage; // 얘네 나중에 DataManager 에서 델꼬오는걸로.
private float attackRate; // 얘네 나중에 DataManager 에서 델꼬오는걸로.
private float lastAttackTime; // 얘네 나중에 DataManager 에서 델꼬오는걸로.
// Update is called once per frame
void Update()
{
// Enemy List 가 비어있는지 확인하여 상태 업데이트.
UpdateUnitState();
}
private void UpdateUnitState()
{
if (currentEnemiesInRange.Count > 0) // 범위 안에 적이 있을 때 공격 상태로 전환.
{
SetUnitState(EUnitState.Attacking);
}
else // 범위 안에 적이 없을 때 Idle 상태로 전환.
{
SetUnitState(EUnitState.Idle);
}
}
private void SetUnitState(EUnitState newState)
{
unitState = newState;
// 여기에 상태가 변경될 때 수행할 작업 추가 가능.
switch (unitState)
{
case EUnitState.Idle:
// todo : Idle Animation 추가
//_animator.SetBool("Idle", unitState == EUnitState.Idle);
Debug.Log("Unit is in Idle state");
break;
case EUnitState.Attacking:
Attack();
Debug.Log("Unit is in Attacking state");
break;
}
}
private void Attack()
{
if (Time.time - lastAttackTime > attackRate) // Time.time - lastAttackTime 은 최근 공격 시간 간격을 의미함. 이 값이 attackRate 보다 크다면 공격 go !
{
lastAttackTime = Time.time;
// todo : Attacking 상태에서의 공격 동작
foreach (Enemy enemy in currentEnemiesInRange)
{
// e.g. 적에게 데미지를 입히는 등의 동작 수행
// enemy.GetComponent<Enemy>().TakeDamage(damageAmount);
}
// todo : Attack Animation 추가
//_animator.SetTrigger("Attack");
}
}
private void OnTriggerEnter(Collider other) // Enemy 가 해당 범위 안에 들어올 경우 List.Add
{
if (other.CompareTag("Enemy"))
{
currentEnemiesInRange.Add(other);
}
}
private void OnTriggerExit(Collider other) // 적이 collider 범위 밖으로 나가면(근데 나갈 일이 있으려나?) List 에서 제거
{
if (other.CompareTag("Enemy"))
{
currentEnemiesInRange.Remove(other);
}
}
private void GetDamage(int damage) // todo : GetDamage() 구현
{
//hp 가 0 이 되면 죽겠지
}
private void Die() // todo : Die() 구현
{
}
}
이걸 이제 실제 Unit 이 될 친구들한테 상속받아가게끔 하고싶은데
상속 공부를 더 해봐야겠다...!
말로만 들어보고 한번도 직접 구현해본 적이 없는 작업이라
아직 감이 잘 안 잡힌다 ~!
내일 조원분들이랑 이야기해서 부족한 부분들을 보완하는 작업을 이어가봐야겠다.
그리고 내일은 아마 유닛 말고도 GameManager 쪽과 구매(유닛, 땅&방타일) 관련한 UI 제작 및 스크립트 작성 작업이 이루어질 것 같다.
🔥
아자아자 파이팅 ~!