TIL_240117

Z_제트·2024년 1월 17일
0

TODAY I LEARNED

목록 보기
56/88
post-thumbnail

to do_오늘 할 일

retro_오늘 한 일(회고)

최종프로젝트 진행상황

오늘의 작업 :

  • Unit.cs 작업

Unit.cs 작업

개별적인 Unit( = 유닛, 플레이어가 배치할 타워라고 생각해도 ok.) 이
들고있어야 하는 기능들을 생각해보니
공격 / 데미지 피격 / 죽음
크게 이렇게 세 가지가 떠올랐다.
(뭔가 더 있을 것 같은데 나의 한계..)

(아직 유니티 상에서 작업한 건 없고 코드로만 작업 ing)

  • Attack

    • 일단 계획은 범위(적) 인식을 trigger 체크로 진행하는 것으로 설계해봤다.
    • 공격은 collider - trigger 를 이용해서 Enemy 가 해당 범위 안에 들어올 경우(collision.CompareTag(“Enemy”)) List 안에 추가하고, 적이 collider 범위 밖으로 나가면(근데 나갈 일이 있으려나?) List 에서 제거하는 방식을 도전해보고자 한다.
    • 그리고 Enum 을 활용해서 범위 안에 들어온 적을 담고 있는 List 요소의 개수가 0 개라면 유닛은 idle 상태, 1 이상이라면 attack 상태로 구분해보려고 한다.
  • GetDamage

    • ❓ 전투를 자기 자리에서 허공에 칼질해가지고 유닛과 적이 서로 데미지를 주고받는 방법으로 진행하기로 했는데, 데미지를 어떻게 주고받지....? 적이 projectile 을 날려주려나...?
    • 아직 감이 오지 않는 파트다..하하
  • Die

    • hp 가 0 이 됐을 때 죽겠죠.
    • ObjectPooling 적용된 친구라면 Push( = 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 제작 및 스크립트 작성 작업이 이루어질 것 같다.
🔥
아자아자 파이팅 ~!

profile
trying to make the world a better place with a cool head and warm heart

0개의 댓글