2024. 7. 4. 22:10ㆍ나의 개발자 기록/본 캠프 개발 일지

2024년 7월 04일 목요일
What I did today : 원거리 공격, 투사체 공격 로직 구현
오늘도 늘 똑같이 10시부터 팀원분들과 인사를 한 후, 각자 맡은 역할을 구현하였습니다. 저는 어제 하던 작업에 이어서 오전에는 공격 범위에 대한 방향을 조절하기 위해서 캐릭터 클래스에 Vector2Int[] 배열을 필드로 선언해 놓고, CharacterSO에 있는 데이터를 받아와서 초기화를 해놨습니다.
private Vector2Int[] RotateAttackRange(Vector2Int[] range, float angle)
{
Vector2Int[] newRange = new Vector2Int[range.Length];
float radian = angle * Mathf.Deg2Rad;
for (int i = 0; i < range.Length; i++)
{
float x = range[i].x * Mathf.Cos(radian) - range[i].y * Mathf.Sin(radian);
float y = range[i].x * Mathf.Sin(radian) + range[i].y * Mathf.Cos(radian);
newRange[i] = new Vector2Int(Mathf.RoundToInt(x), Mathf.RoundToInt(y));
}
return newRange;
}
그다음에는 Vector2Int[] 배열을 반환값으로 가지고 공격 범위의 회전 각도를 조절할 수 있는 함수를 만들어서 놓고,
public void ChangeDirection(string direction)
{
switch (direction)
{
case "up":
SetAnimationLayer(0);
Data.attackRangeTiles = RotateAttackRange(defaultAttackRangeTiles, 0);
break;
case "down":
SetAnimationLayer(1);
Data.attackRangeTiles = RotateAttackRange(defaultAttackRangeTiles, 180);
break;
case "left":
SetAnimationLayer(2);
Data.attackRangeTiles = RotateAttackRange(defaultAttackRangeTiles, 90);
break;
case "right":
SetAnimationLayer(3);
Data.attackRangeTiles = RotateAttackRange(defaultAttackRangeTiles, -90);
break;
}
}
만든 함수를 이용해서 방향에 대한 정보를 받아오면 각 방향에 맞는 각도로 조정될 수 있게 만들었습니다.

코루틴으로 만들었던 함수를 테스트해본 결과 정상적으로 잘 작동했고, 저희 게임이 명일방주처럼 캐릭터를 설치할 때 방향이 바뀌어야 하기 때문에 이 함수는 방향이 바뀔 때 호출할 수 있도록 팀원들에게 이 내용을 전달했습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Projectile : MonoBehaviour
{
private Monster target;
private float speed = 10f;
private UnitSO damageData;
private Vector3 spawnPosition;
public void SetTarget(Monster target, UnitSO damageData)
{
this.target = target;
this.damageData = damageData;
spawnPosition = transform.position;
}
private void Update()
{
if (target == null)
if (target == null || target.HealthSystem.currentHealth <= 0)
{
GameManager.Instance.ObjectPool.ReleaseObject(gameObject);
ResetProjectile();
return;
}
Vector3 direction = (target.transform.position - transform.position).normalized;
transform.position += direction * speed * Time.deltaTime;
if (Vector3.Distance(transform.position, target.transform.position) < 0.5f)
{
target.TakeDamage(damageData);
GameManager.Instance.ObjectPool.ReleaseObject(gameObject);
ResetProjectile();
}
}
private void ResetProjectile()
{
transform.position = spawnPosition;
GameManager.Instance.ObjectPool.ReleaseObject(gameObject);
}
}
오후에는 원거리 공격 시스템을 만들기 위해서 일단 먼저 투사체 관련 스크립트를 작성했습니다. 다른 팀원분이 ObjectPool을 만드셨기 때문에 임시로 게임 매니저에 오브젝트 풀을 추가했고, 간단한 투사체 프리팹을 만들어서 적용시켰습니다.

그리고 기존에 몬스터 로직을 찾는 함수는 RangeState에서도 사용할 수 있게 MeleeState에서 AttackState로 옮겼습니다.
public override void Update()
{
base.Update();
if (Time.time >= lastAttackTime + attackCooldown)
{
Monster target = FindTargetInTileRange();
if (target != null)
{
LaunchProjectile(target);
lastAttackTime = Time.time;
}
}
}
private void LaunchProjectile(Monster target)
{
GameObject projectileObj = GameManager.Instance.ObjectPool.GetObject("TestProjectile");
if (projectileObj != null)
{
Projectile projectile = projectileObj.GetComponent<Projectile>();
projectile.SetTarget(target, stateMachine.Character.Data);
}
}
그 다음에는 RangeState에 투사체 로직을 만들어서 Update에 적용하고 테스트를 해봤습니다만... 오브젝트가 발사되고 대미지가 들어가긴 하는데, 오브젝트 풀로 인한 투사체가 사라지지 않는 버그가 있었습니다. 팀원분이랑 버그의 원인을 찾아봤는데, 알고 보니까 오브젝트 풀이 기존 방식이 아닌 새로운 방식으로 만들었기 때문에 약간 오차가 있었던 것 같습니다. 팀원분이랑 상담해서 오브젝트 풀을 기존 방식으로 바꾸는 것으로 해결하게 됐습니다.

다음 작업으로는 SO 데이터에 원거리 공격 가능 여부를 추가하여 자동 공격 상태 전환을 하게 끔 만들었습니다. 그리고나서 몬스터가 죽는 것까지 테스트를 하기 위해 DeadStateBehavior를 사용하여 애니메이션이 끝난 시점에 오브젝트가 파괴되도록 만들었고, 원거리 공격에 대한 오류 수정 등 작업을 해서 저녁 먹기 전에 캐릭터 공격 로직을 완성했습니다.

저녁을 먹은 뒤에는 지금까지 했던 캐릭터 로직을 몬스터에도 적용시키는 작업을 했습니다. 비슷한 코드의 내용이 많았기 때문에 금방 작업을 완료했고, Projectile의 경우에는 ITargetable을 사용하여 몬스터와 캐릭터 모두 사용할 수 있게 만들었습니다. 그다음에는 팀원분들이랑 작업한 내용을 공유했고, 여러 가지 이야기를 하면서 오늘 하루를 마무리했습니다.
'나의 개발자 기록 > 본 캠프 개발 일지' 카테고리의 다른 글
| 2024년 7월 08일 월요일 개발일지 / NevMeshAgent 충돌 무시하는 방법 (0) | 2024.07.08 |
|---|---|
| 2024년 7월 05일 금요일 개발일지 / 스프레드시트 역직렬화 (0) | 2024.07.05 |
| 2024년 7월 03일 수요일 개발일지 / 체력 시스템과 근접 공격 (0) | 2024.07.03 |
| 2024년 7월 02일 화요일 개발일지 / 최종 프로젝트 개발 시작 (0) | 2024.07.02 |
| 2024년 7월 01일 월요일 개발일지 / 와이어 프레임과 UML (0) | 2024.07.01 |