카테고리 없음

1121 Codex

버스창문 2025. 11. 21. 16:56

사실 18일 19일치 분량

 

 

18일 가호

가호의 내용 : (방어모드) 지속 중 받는 피해 감소, 영역내 아군의 데미지의 일부를 대신 받음

(공격모드) 지속 중 받는 피해 증가, 공격력 및 공격속도 증가

 

테스트용 더미 플레이어를 만들어줘

 

Assets/02.Scripts/Player/Player_Dummy.cs에 더미 플레이어를 추가했습니다. 기본 이동 입력은 막고 ContextMenu로 피해를 줄 수 있어 버프나 데미지 모디파이어를 손쉽게 시험할 수 있습니다. Key 포인트:

  • initialMaxHP, testDamageAmount 인스펙터 설정 후 인게임에서 “Apply Test Damage” 메뉴로 즉시 피해 적용 가능.
  • ApplyCustomDamage(int amount) 메서드를 외부 스크립트나 에디터에서 호출해 원하는 값으로 데미지 테스트 가능.
  • Update/FixedUpdate는 지면 체크만 유지하고 이동 속도를 0으로 고정해 안정적인 테스트 스탠딩 상태를 제공합니다.

필요에 따라 입력 액션을 추가하거나 애니메이션 훅을 연결하면 실제 전투 씬에서도 더미를 손쉽게 배치할 수 있습니다.

 

버프를 받는걸 테스트하기위한 더미

 

BasePlayerController에 체력이 있을 이유가 없다고 생각해
체력, 공격력 등의 스탯 관련은 Player코드에서 처리할거야
지금 BasePlayerController에 만들어놓은 TakeDamage 등등의 코드는 Player쪽으로 옮겨줘

 

주요 변경

  • Assets/02.Scripts/Player/BasePlayerController.cs를 이동/입력 전용 클래스로 재작성해 체력/피해 로직을 제거했고, Assets/02.Scripts/Player/Player.cs가 IDamageModifier 목록을 순회하며 체력 감소·무적·UI 갱신을 전담하도록 재구성했습니다. 덕분에 모든 버프/보호 효과는 Player 컴포넌트를 통해 일관되게 적용됩니다.
  • Assets/02.Scripts/Player/IDamageModifier.cs와 Player/Buff 아래 버프 스크립트들을 전부 Player 기반으로 리팩터링했습니다. 가호/무적 버프(Player_Chico_Buff_GahoDefense.cs, Player_Chico_Buff_GahoAttack.cs, Player_Chico_Buff_Invincibility.cs)는 실패 시 자가 제거 로직을 갖추고, 오라·링크(Player_Chico_GahoAura.cs, Player_Chico_GahoLink.cs)도 Player 컴포넌트를 탐지하도록 변경했습니다. 공통 부모(PlayerBuffBase.cs)는 Player/컨트롤러 참조를 안전하게 보관합니다.
  • 스킬과 기타 스크립트가 새 구조를 사용하도록 정리했습니다. Player_Chico_Skill_Gaho.cs/Player_Chico_Skill_Protection.cs는 Player 참조를 확보해 새 버프 컴포넌트를 세팅하며, 더 이상 Player_Chico.cs에 추가 피해 전달 메서드가 필요하지 않습니다. 테스트용 더미(Assets/02.Scripts/Player/Player_Dummy.cs)도 Player 컴포넌트를 요구하도록 갱신했습니다.

검증/안내

  • 코드만 수정됐고 플레이 모드 테스트는 수행하지 못했습니다. 각 플레이어 오브젝트에 Player 컴포넌트가 반드시 붙어 있어야 하며, 전투 씬에서 가호/무적/링크 동작을 한번씩 확인해 주세요.

그냥 쭉 만들게 시켰더니 어느샌가 Hp등의 스탯을 키입력을 받기위해 만든 Controller 스크립트에 다 때려박아놓았다

분리

 

Gaho, Protection에 playerStats를 다시 선언한 이유가 뭐야?

 

가호/보호 스킬에서 playerStats를 다시 선언한 건, 기존 BasePlayerSkill이 GetComponentInParent<Player>()로 가져오던 플레이어 스탯을 더 이상 상속 계층에서 공유하기 어려워졌기 때문이에요. 리팩터링 후에는

  • 피해/체력 처리를 전부 Player 컴포넌트가 맡게 되었고,
  • 버프 컴포넌트(Player_Chico_Buff_*)를 붙일 때도 대상 Player를 넘겨야 합니다.

그래서 각 스킬에서 playerStats(=Player 참조)를 명시적으로 잡아두고, 버프 생성 시 Setup(chico, playerStats, …)처럼 전달하고 있습니다. 이렇게 하면 스킬이 자체적으로 필요한 Player를 확실히 찾고, 해당 값이 없을 때 디버그 메시지를 띄워 문제를 조기에 발견할 수 있어요.

 

저 두개의 스킬이 상속받는 쪽에는 이미 playerStats가 들어가있었다.

근데 그걸 양쪽에서 새로 선언해서 기존에 있던 애가 가려져 null로 잡히는 문제가 일어났고,

솔직히 왜 다시 선언했는지도 모르겠어서 물어봤다.

 

답변도 "새로" 선언해야할 이유가 되진 않았다

 

지금 playerStats가 null로 잡혀
원인 찾고 해결해줘

 
  • Player_Chico_Skill_Gaho.cs (lines 24-35)와 Player_Chico_Skill_Protection.cs (lines 11-22)에서 별도의 Player 필드를 만들지 않고, BasePlayerSkill이 초기화한 playerStats를 그대로 사용하도록 수정했습니다. 이제 playerStats가 비어 있으면 바로 부모 계층에서 Player 컴포넌트를 다시 찾아주므로, 기존처럼 null로 남는 문제가 발생하지 않습니다.

그럼에도 한번 ai흐름대로 따라가보고자 문제점만 말했더니 그냥 기존의 playerStats를 사용하게 바꿔놓길래 다시 지워버렸다.

 

 

____________________________________________________________________

 

19일 돌진돌진의 내용 : (방어모드) 주위 아군의 위치로 이동(공격모드) 보스의 위치로 돌진해 관통하여 이동하며 이동경로를 공격

 

돌진의 내용을 바꿔보자
공격모드 돌진이 지금 무조건 보스의 왼쪽으로 가려고 하는데 내가 보스를 바라보는 방향으로 쭉 이동하며 베는걸로 바꿔줘
이동도 빠르게 해줘
방어모드 돌진은 지금 아군과 완전히 동일한 위치까지 이동하려고해서 아군과 붙은채로 추가 입력도 막혀서 공중에 붕 떠있어, 아군 위치 직전까지만 이동하고 멈춰줘

 
  • Player_Chico_Skill_Rush.cs (lines 5-125): 공격 모드는 이제 보스를 찾지 않고 플레이어가 바라보는 방향으로 attackDashDistance만큼 attackDashSpeed로 질주하며, 도중에 경로 박스 판정으로 베는 형태로 바뀌었습니다. 방향은 로컬 스케일에서 판단하도록 DetermineFacingDirection()을 추가했습니다.
  • 방어 모드는 가장 가까운 아군 위치 바로 앞(stopDistance + 0.5f)까지만 이동해 겹치지 않도록 MoveTo(...)에 커스텀 정지거리 인자를 추가했습니다. 기존처럼 완전히 겹쳐서 공중에 뜨는 문제가 해결됩니다.
  • 공통 이동 루틴 MoveTo와 새로운 DashForward는 속도를 각각 dashSpeed, attackDashSpeed로 제어해 방어/공격 모드 이동 속도를 구분합니다.

테스트는 수행하지 못했습니다. 실제 전투 씬에서 두 모드 돌진이 의도대로 동작하는지(공격 모드 방향·속도, 방어 모드 멈춤 위치) 확인해 주세요.

 

뭐 이것저것 함수를 추가했다.

 

공격모드가 이상하게 날아가
그냥 어느경우에서 쓰든 오른쪽으로만 날아가

 
  • BasePlayerController.cs:24-39, 94-105에 facingDirection 필드를 추가해 마지막 이동 입력의 부호를 추적하도록 했습니다. OnMove에서 moveInput.x가 0이 아니면 해당 부호를 기록하고, FacingDirection 프로퍼티로 외부에서 읽을 수 있게 했습니다.
  • Player_Chico_Skill_Rush.cs (lines 68-179)의 공격/방어 돌진을 재작성했습니다. 공격 모드는 FacingDirection을 사용해 플레이어가 바라보는 방향으로 attackDashDistance만큼 attackDashSpeed로 질주하며, 이동 경로를 기준으로 박스 판정을 적용합니다. 방어 모드는 아군 위치 직전(stopDistance + 0.5f)에서 멈추도록 MoveTo에 커스텀 정지 거리를 도입했습니다.

테스트는 아직 수행하지 못했습니다. 게임에서 돌진을 사용해 보며 (1) 공격 모드가 실제 바라보는 방향으로 빠르게 이동하는지, (2) 방어 모드가 아군을 통과하지 않고 바로 앞에서 멈추는지 확인해 주세요.

 

공격모드가 그냥 이유없이 오른쪽으로 돌진하는 형태가 되었다.

어디가 문제인지 분석하려면 할수야 있겠는데 그럼 돈을 왜 쓰나

그냥 문제점을 말했다.

하지만 이러고나서도 똑같았는데, 답변쪽을 읽다가 알았다.

그냥 아예 다른걸 만들어놓은거였다.

보스 위치로 돌진하게 해줘
보스를 지나가며 베는 형태로 만들어줘

 
  • Player_Chico_Skill_Rush.cs (lines 54-75)의 공격 모드를 보스 관통식으로 바꿨습니다. 이제 돌진 시 BaseBoss 위치를 찾아 그 지점을 기준으로 attackDashDistance만큼 더 전진하도록 목표를 잡고(// 보스 위치… 주석), 지나간 경로에 DealPathDamage를 적용합니다.
  • 보스를 찾지 못하면 경고를 출력하고 즉시 종료하므로 예외 상황에서도 안전하게 동작합니다.

테스트는 진행하지 못했으니, 실제 전투에서 돌진이 보스를 관통하며 베는지 확인해 주세요.

 

이제야 원하는대로 보스가 있는 위치로 돌진하는 형태가 되었지만, 보스를 관통하지 못해 그냥 보스와 착 붙어서 조작이 막혔었다.

 

 

보스를 관통을 못해서 똑같이 중간에 멈추는 현상이 일어나

 
  • Player_Chico_Skill_Rush.cs가 보스를 관통하지 못하던 이유는 Rigidbody 충돌이 돌진 도중 멈추게 했기 때문입니다. 공격 모드에서 돌진을 시작할 때 보스의 콜라이더와 일시적으로 충돌을 무시하도록 IgnoreCollisionsWithBoss 헬퍼를 추가해 충돌을 해제하고, 돌진이 끝나면 재활성화하도록 했습니다.
  • 같은 파일에서 공격 모드의 목표 지점을 보스 위치를 기준으로 설정했습니다. 먼저 BaseBoss를 찾고, 그 위치까지의 방향을 구한 후 보스를 통과해 attackDashDistance만큼 더 진행한 지점까지 질주하도록 변경했습니다. 돌진 이동은 DashForward 루틴이 담당하며, 경로 판정은 기존처럼 유지돼 지나가면서 베는 효과가 그대로 적용됩니다.
  • BasePlayerController.cs에 facingDirection 필드를 추가해 최근 이동 입력의 방향을 추적하고, 돌진 스킬이 보스를 찾지 못했을 때도 마지막 이동 방향으로 정상 작동하도록 DetermineFacingDirection이 이 값을 사용합니다.

테스트는 진행하지 못했으니, 게임 내에서 공격 모드 돌진을 사용해 보스가 있는 위치를 통과해 베는지 확인해 주세요.

 

이러고나서 관통을 못하는 현상은 해결했지만, 그냥 돌진이 끝나지않고 계속 이어졌다.

 

 

이제 관통은 하는데 돌진이 종료가 안돼

 
  • Player_Chico_Skill_Rush.cs (lines 9-106)에 maxDashDuration(기본 1.5s)을 추가하고, 방어/공격 모드 이동 루프(MoveTo, DashForward)에서 경과 시간을 체크해 일정 시간 이후 강제로 탈출하도록 했습니다. 이제 보스를 관통한 뒤 목적지에 다다르지 못해도 루프가 무한히 돌지 않고, FinishDash()가 호출돼 돌진이 정상 종료됩니다.

그냥 지속시간으로 때워버리길래 다시 명령했다.

지속시간 말고 목표로 한 보스 뒤로 넘어가면 바로 멈추게 해줘

 
  • Assets/02.Scripts/Player/Skill/Player_Chico_Skill_Rush.cs 공격 모드 돌진이 이제 목표 지점(보스 뒤)뿐 아니라 실제 보스 위치를 지나치는 순간 바로 종료됩니다. DashForward가 선택적으로 passThroughPoint를 받아 방향 벡터와의 내적이 0 이하가 되는 시점(통과)에서 루프를 빠져나오도록 했습니다.
  • 안전장치였던 maxDashDuration 체크는 그대로 두어, 보스를 못 찾거나 물리적으로 막혔을 때도 무한 돌진이 발생하지 않습니다.

테스트는 하지 못했으니, 전투에서 돌진이 보스를 통과하자마자 멈추는지 확인해 주세요.

 

이러고나서야 내가 원하는 형태가 되었지만, 보스가 벽을 등지고있거나, 내가 위에서 아래쪽으로 돌진하게 되면 보스와 겹치거나 움직임이 어색해지는 현상이 있었다.

 

보스를 지나치고 나서 도착하는게 벽이라면 보스 직전에서 멈추게 하고 대미지 처리는 본래 지나갔을 거리에 다 넣는식으로 만들어줘

 
  • 공격 돌진 경로에 장애물이 있는 경우를 구분하도록 수정했습니다. Player_Chico_Skill_Rush.cs에 obstacleMask를 추가하고, 보스 뒤쪽에서 벽을 만나면 실제 이동 목표를 보스 직전으로 조정하면서도 DealPathDamage는 원래 계획했던 거리(plannedDestination)를 사용해 지나간 것처럼 처리합니다.
  • 보스를 통과하지 않을 때는 충돌 무시를 설정하지 않고, 통과할 때만 IgnoreCollision을 활성화해 부자연스러운 멈춤을 방지합니다. 이동 루프는 새 목표 지점에 맞춰 즉시 멈추고, 충돌 무시는 마지막에 항상 해제됩니다.

씬에서 돌진을 사용해 벽 뒤 보스와의 상호작용을 확인해 보세요. 필요 시 obstacleMask 필드를 지형 레이어로 지정해야 합니다.

 

 

actualDestination = hit.point - (Vector3)(direction * stopDistance);
이쪽에서 에러가 나네

 
  • 방어용 레이케스트에서 벽을 만났을 때 hit.point(Vector2)를 그대로 Vector3 연산에 사용하면서 타입 오류가 발생했습니다. Player_Chico_Skill_Rush.cs에서 해당 지점을 Vector3 hitPoint = new Vector3(hit.point.x, hit.point.y, chico.transform.position.z);로 변환한 뒤 사용하도록 수정하여 컴파일 에러를 해결했습니다.

이제 돌진이 벽 앞에서 멈추는 분기에서도 에러 없이 정상 빌드될 것입니다.

벽에 막힐때 보스 위치에서 멈추게 되는데 보스에게 닿기 직전에 멈추게 해줘

 
  • Player_Chico_Skill_Rush.cs: 벽 탐지 시 보스 직전에서 멈추도록 버퍼를 도입했습니다. 공격 모드 설정에 bossStopBuffer 직렬화 필드를 추가하고, 레이캐스트가 보스 뒤쪽 벽을 감지했을 때 실제 도착 지점을 bossPosition - direction * (stopDistance + bossStopBuffer)로 조정해 보스에 닿기 전 자연스럽게 멈춥니다.

이제 벽에 막혀도 보스에 겹치지 않고 앞에서 멈춥니다. 필요하면 bossStopBuffer 값을 씬에서 조절해 주세요.

 

그 후 일어났던 스크립트 에러, 그리고 보스 직전이 아닌 결국엔 보스위치에서 멈추던 문제를 해결하니 내가 원하는 형태가 되었다.

 

 

이제 방어모드 돌진을 고칠거야
방어모드 돌진은 아군에 닿기 직전에 멈추면 돼

 
  • Player_Chico_Skill_Rush.cs (lines 45-64) 방어 모드 돌진이 이제 아군과의 벡터를 기준으로 stopDistance만큼 뒤에서 목표 지점을 잡아, 실제 아군을 완전히 겹치지 않고 “닿기 직전”에 멈추도록 수정했습니다. 목적지 계산 시 ally.transform.position - normalizedVector * stopDistance를 사용하고, MoveTo에 기본 정지 거리를 넘겨 좀 더 자연스럽게 멈춥니다.

테스트는 진행하지 못했습니다. 방어 모드 돌진 시 아군 앞에서 멈추는지 플레이 모드에서 확인해 주세요.

 

당연하겠지만 안멈췄었다. 아군에 착 붙어서 움직이지 않았다.

 

닿기 직전에 멈추지 않고 아군에 계속 붙어있어

 
  • Player_Chico_Skill_Rush.cs (lines 44-66)의 방어 모드 돌진은 이제 아군 Transform을 직접 추적하는 MoveNearTarget 코루틴을 사용합니다. 매 프레임 목표 위치와 거리를 재계산하여 bufferDistance 이내로 들어오면 즉시 멈추므로, 더 이상 아군 몸에 겹쳐 붙지 않습니다.
  • MoveNearTarget(새 메서드, 줄 112 이후)은 최대 지속 시간(maxDashDuration)과 버퍼 거리 두 조건을 모두 만족해야 종료되도록 하여, 아군 위치가 이동하더라도 자연스럽게 따라붙다 일정 거리에서 정지합니다.

테스트는 진행하지 못했습니다. 방어 모드 돌진 사용 시 아군 앞에서 멈추는지 확인해 주세요.

 

이러고도 그대로 안멈추고 붙어있었다.

 

공격모드 돌진에서 뒤에 벽이있을때 처리하던 방법이랑 같은 방식으로 처리해줘

 
  • 방어 돌진이 아군에 밀착하던 문제는 아군 위치를 직접 추적하는 MoveNearTarget 방식 때문이었습니다. 해당 코루틴을 제거하고, 아군까지의 벡터·장애물 여부를 계산해 목표 지점을 명확히 지정하는 CalculateDefenseDestination 헬퍼를 추가했습니다.
  • DefenseRush는 이제 CalculateDefenseDestination(ally.transform)을 통해 “아군에 닿기 직전” 좌표를 구한 뒤 기존 MoveTo 루틴으로 이동합니다. 이 과정에서 장애물이 있으면 레이캐스트로 감지해 그 앞에서 멈추고, 아군과의 거리도 stopDistance + allyStopBuffer(0.3f)만큼 유지합니다.
  • 공격 모드 돌진에 사용하던 obstacleMask와 동일한 레이어를 활용하므로, 씬에서 해당 마스크에 벽 레이어를 포함시켜야 정상 동작합니다.

이제 방어 모드 돌진도 보스 돌진과 동일한 방식으로 “닿기 직전 멈춤 + 장애물 고려”를 수행합니다. 테스트에서 아군 전방에서 자연스럽게 멈추는지 확인해 주세요.

 

이건 내 실수다.

의도는 "보스가 벽을 등지고 있을때 돌진을 쓰면 관통안하고 보스 위치 직전에 멈추던것처럼 아군 위치 직전에 멈추도록 만들어라" 라는 거였는데갑자기 벽을 체크하기 시작하더니 맛탱이가 아예 갔었다.

 

일단 방어모드 지금까지 바꾼걸 바꾸기 전으로 다 돌려놔봐

 
  • 방어 모드 돌진 로직을 수정 전 상태로 되돌렸습니다. Player_Chico_Skill_Rush.cs에서 아군 목표 위치를 계산하던 CalculateDefenseDestination과 관련 필드(allyStopBuffer)를 제거하고, DefenseRush()가 단순히 ally.transform.position으로 이동하도록 복원했습니다.
  • MoveTo() 호출도 기본 거리를 사용하도록 되돌려 아군 바로 위치로 이동하며 더 이상의 커스텀 버퍼/레이캐스트가 적용되지 않습니다.

이제 방어 모드 돌진은 이전 버전과 동일하게 동작합니다.

 

그래도 한 문장 쓰면 이전버전으로 완전히 돌릴수 있어서 다행이다.

 

방어모드 돌진은 아군에게 닿기 직전에 멈춰야해

 
  • Player_Chico_Skill_Rush.cs 방어 돌진이 아군에 닿기 직전에 멈추도록 다시 구현했습니다.
    • defenseStopBuffer 직렬화 필드를 추가해 원하는 여유 거리를 인스펙터에서 조정할 수 있습니다.
    • DefenseRush()는 CalculateDefenseDestination()으로 목표 좌표를 계산한 후 MoveTo(..., stopDistance)로 이동하며, 이 계산은 아군과의 거리를 기반으로 stopDistance+buffer만큼 앞에 서도록 합니다.
    • CalculateDefenseDestination()은 장애물이 있으면 레이캐스트로 감지해 해당 벽 앞에서 멈추도록 보정합니다.

테스트는 진행하지 못했으니, 방어 모드 돌진 시 아군 앞에서 자연스럽게 멈추는지 확인해 주세요.

 

 

그 다음엔 바로 제대로 만들어주던데 솔직히 맨 처음 물어봤던 내용이랑 뭐가 다른진 모르겠다.