60. Unity 최종 프로젝트 3주차

이규성·2024년 1월 22일
0

TIL

목록 보기
66/106

01/22

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

크기가 작은 부분문자열

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

입출력 예

tpresult
"3141592""271"2
"500220839878""7"8
"10203""15"3
using System;
using System.Collections.Generic;

public class Solution
{
    public int solution(string t, string p)
    {
        int answer = 0;
        string str = "";

        char[] chars1 = t.ToCharArray();

        List<string> strings1 = new List<string>();
        List<long> numbers1 = new List<long>();

        for (int i = 0; i < chars1.Length - (p.Length - 1); i++)
        {
            str += chars1[i];
            for (int j = 1; j < p.Length; j++)
            {
                str += chars1[i + j];
            }
            strings1.Add(str);
            str = "";
            numbers1.Add(long.Parse(strings1[i]));
        }

        long nump = long.Parse(p);

        for (int i = 0; i < numbers1.Count; i++)
        {
            if (numbers1[i] <= nump)
            {
                answer++;
            }
        }

        return answer;
    }
}

런타임 에러가 나서 수정 중 . . .
p의 길이가 int 자료형의 표현 범위를 넘어가서 에러가 났던 것이었다. long 자료형으로 바꿔주어 해결하였다.
전체적인 설계는 t의 값을 p의 길이로 쪼개어 List에 저장하고 List를 p와 크기 비교를 시켜서 풀었다.

📌팀 프로젝트 진행

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

금일 구현 설계

Player가 공격할 시 Monster에게 Knockback을 적용시키자.
TwinDagger가 오른손에 쥐어졌을 때 이슈를 해결하자.

금일 구현한 사항

  1. Knockback system
// Monster.cs

private Rigidbody _rigidbody;
private float _knockbackTime = 0f;

protected virtual void Awake()
{
    _rigidbody = GetComponent<Rigidbody>();
}

private void Start()
{
    _rigidbody.isKinematic = true;
}

private void FixedUpdate()
{
    _knockbackTime -= Time.deltaTime;
    if (_knockbackTime <= 0f)
    {
        _rigidbody.isKinematic = true;
    }
}

public void OnTriggerEnter(Collider other)
{
    if (other == null)
    {
        return;
    }

    if (other.gameObject.layer == 8 && _rigidbody.isKinematic == true)
    {
        _rigidbody.isKinematic = false;
        _rigidbody.AddForce((transform.position - other.transform.position).normalized, 
        ForceMode.Impulse);
        _knockbackTime = 0.5f;
    }
    else
    { 
        return;
    }
}

monster가 navmesh로 동작하여 단순히 rigibody.AddForce를 할 경우 고장나는 이슈가 있었다. 그래서 충돌이 발생하면 rigidbody의 Kinematic을 껐다 켰다하며 knockback을 구현하였다.

  1. Weapon animation, Switching issue 수정



    RunState 상태에서 도구를 교체할 시 플레이어의 애니메이션이 멈춘 상태로 움직이는 이슈가 있었다. Animator에서 transition을 추가하여서 해결하였다.
// PlayerBaseStste

public virtual void Rotate(Vector3 movementDirection)
{
    if(movementDirection != Vector3.zero)
    {
        Transform playerTransform = _stateMachine.Player.transform;
        Quaternion targetRotation = Quaternion.LookRotation(movementDirection);
        playerTransform.rotation = Quaternion.Slerp(playerTransform.rotation, targetRotation, 
        _stateMachine.RotationDamping * Time.deltaTime);
    }
}
// PlayerComboAttackStste

public override void Rotate(Vector3 movementDirection)
{

}

플레이어가 공격하는 상태에서 방향키 조작 시 회전하는 이슈가 있었고, 진영님의 아이디어로 Rotate메서드를 추상 메서드로 바꾼 뒤 Override 후 메서드 내부를 비워두어 해결하였다.

금일 이슈

  1. Monster의 Hit가 두 번 실행된다.

예상으로는 Weapon과 Monster 둘 다 OnTriggerEnter 메서드를 사용하고 있어서 일어나는 이슈인 듯 하다. 내일 공유할 예정이다.

금일 커밋한 사항

넉백 시스템 수정 중입니다.
걷는 모션 중 도구 스위칭 시 캐릭터가 멈추는 현상을 수정하였습니다.
공격 모션 중 캐릭터가 회전하는 이슈를 수정하였습니다.

0개의 댓글