59. Unity 최종 프로젝트 2주차(4)

이규성·2024년 1월 19일
0

TIL

목록 보기
65/106

01/19

📌알고리즘 코드 카타 (Algorithm Code Kata)

삼총사

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

입출력 예

numberresult
[-2, 3, 0, 2, -5]2
[-3, -2, -1, 0, 1, 2, 3]5
[-1, 1, -1, 1]0
using System;

public class Solution
{
    public int solution(int[] number)
    {
        int answer = 0;
        int n;
        int m = number.Length - 1;

        for (int i  = 0; i < number.Length - 1; i++)
        {
            for (int j = i + 1; j < m; j++)
            {
                n = number[i] + number[j];
                for (int k = j + 1; k < number.Length; k++)
                {
                    if (n + number[k] == 0)
                    {
                        answer++;
                    }
                }
            }
        }
        return answer;
    }
}

반복문을 세 번이나 중첩시켜버렸다. 계산 속도에서 이슈가 있을까 걱정이 되었지만 워낙 입력 데이터와 계산 과정의 크기가 작다보니 별 문제 없이 성공하였다.
반복문과 조건문의 사용이 익숙해 지는 것은 좋은 것 같지만... 뭔가 이러한 연산을 할 때 사용하는 알고리즘이 있을 것 같다. 추후에 추가 예정.

📌팀 프로젝트 진행

Weapon 구현 설계

필요한 사항

공격 애니메이션

  1. 캐릭터의 손에 대검 위치 시킨다.
    대검의 위치를 수정하였다.
  2. 대검을 들었을 시 Idle 애니메이션 변경이 필요해 보인다.
    ToolSystem의 OnEquip 이벤트에 도구의 TwoHandedTool bool값을 판단해주는 함수를 구독한다.
    두 손 State를 만들어서 함수 내에 ChangeState를 해준다.
  3. 대검 공격 애니메이션의 콤보 어택이 통으로 되어 있던데 나눌 수 있는지 확인이 필요해 보인다.
    콤보가 나누어져 있는 것을 확인하였다. Player의 Animator에 추가하였다.

PlayerAttackState.cs, PlayerComboAttackState.cs

1. 위의 사항을 점검하고 알맞게 두 스크립트의 수정이 필요해 보인다.

Weapon.cs, Health.cs

  1. FSM에 맞게 강의에 따라 우선 구현을 시도한다.
  2. 정상적으로 무기 공격이 동작한다면 상태이상 시스템을 적용해 본다.
    https://teamsparta.notion.site/231211-4c21f35ab2dc494eb063a324a94e54de

금일 구현 설계 2트

Weapon과 monster 사이의 상호작용을 구현하자. collider등 . . .
Weapon의 damage를 어떻게 player에게 전달할지 결정하자. ItemSO -> Player . . .
TwinDagger가 오른손에 쥐어졌을 때 이슈를 해결하자.
Weapon.cs에 상태이상 등의 효과 추가를 트라이해보자.

금일 구현한 사항

  1. monster에게 takedamage 구현

skleton의 inspactor 창의 HP 항목을 보면 10 -> 8로 줄어든 것을 확인할 수 있다.

Weapon.cs
public class Weapon : MonoBehaviour, IAttack
{
    // lgs 24.01.19
    private int damage; // SO의 데미지를 받아오자

    private void Awake()
    {
        gameObject.GetComponentInChildren<BoxCollider>().enabled = false;
        Managers.Game.Player.ToolSystem.OnEquip += DamageOfTheEquippedWeapon;
        // ToolSystem의 이벤트에 무기 데미지를 참조해오는 메서드를 구독하여 구현
    }

    private void OnTriggerEnter(Collider other)
    {
        Attack(other.GetComponent<IHit>());
    }

    public void Attack(IHit target)
    {
        if (target == null) // target이 null인 상황을 배제한다.
        {
            return;
        }
        target.Hit(this, damage);
    }

    public void DamageOfTheEquippedWeapon(QuickSlot quickSlot)
    {
        // WeaponDataSO의 damage 값을 참조해오는 메서드
        ItemData weapon = quickSlot.itemSlot.itemData;
        ToolItemData toolItemDate = (ToolItemData)weapon;

        damage += toolItemDate.damage;
    }
}

금일 이슈

  1. 무기와 플레이어가 닿는 순간 데미지가 들어오는 이슈

여태까진 자기 자신의 collider를 판별하여 배제하는 방식으로 구현했었는데, 이슈 공유 후 Layer에서 충돌 범위를 제한하는 것이 어떻냐는 조언을 들었고 더 직관적이라고 생각이 되어서 그대로 구현하였다.

  1. 무기의 collider가 항상 켜져 있어서 몬스터에 다가가기만 해도 데미지가 들어가는 이슈
PlayerComboAttackState.cs
public override void Enter()
{
    base.Enter();
    StartAnimation(_stateMachine.Player.AnimationData.ComboAttackParameterHash);

    _weapon = Managers.Game.Player.GetComponentInChildren<Weapon>(); // lgs 24.01.19
    _weapon.gameObject.GetComponentInChildren<BoxCollider>().enabled = true;

    _alreadyAppliedForce = false;
    _alreadyApplyCombo = false;

    int comboIndex = _stateMachine.ComboIndex;
    _attackInfoData = _stateMachine.Player.Data.AttackData.GetAttackInfo(comboIndex);
    _stateMachine.Player.Animator.SetInteger("Combo", comboIndex);
}

public override void Exit()
{
    base.Exit();
    StopAnimation(_stateMachine.Player.AnimationData.ComboAttackParameterHash);

    _weapon.gameObject.GetComponentInChildren<BoxCollider>().enabled = false; // lgs 24.01.19

    if (!_alreadyApplyCombo)
        _stateMachine.ComboIndex = 0;
}

FSM 패턴으로 구동 중이니 공격하는 State에서 플레이어가 현재 들고 있는 무기의 BoxCollider를 켜고 끄는 방식으로 해결하였다. 추후에 수정될 가능성 농후 . . .

금일 커밋한 사항

Weapon.cs를 추가하였습니다.
Monster와 Weapon 간의 damage를 구현하였습니다.
Player, Weapon, Monster에 각각 이름과 같은 Layer를 추가하였습니다.
한 손 검 이슈를 수정하였습니다.

🤸🏻‍♀️Feedback

테스트를 위해 타인의 스크립트를 건드렸다면 꼭 다시 돌려놓자...! 간 떨려라

0개의 댓글