2024년 11월 29일 TIL

John Jean·2024년 11월 29일

Lazy Sweeper

목록 보기
4/9
post-thumbnail

애니메이션 추가

오늘은 하루종일 캐릭터 애니메이션을 다뤘는데 꽤 까다로웠다.
크래프톤 정글 프로젝트때 애니메이션 작업을 해본적이 있어서 수월하게 끝마칠 줄 알았는데 오산이었음.

현 프로젝트는 1인칭 기반 게임인 반면 내가 준비한 애니메이션은 1인칭을 고려하지 않은 애니메이션임.

따라서 게임 화면에 동작이 잘 보이도록 애니메이션을 일일히 수정했어야 함. -> 키 프레임별로 포지션 및 로테이션 조정.

대기 애니메이션과 던지기 애니메이션은 위치를 고정한 카메라를 사용하면 되는데, 줍기 애니메이션은 상체를 숙이다보니 카메라가 머리를 따라가면 좋을것 같았다.

카메라(Cinemachine)

기본 카메라는 머리쯤에 빈 오브젝트를 추가해 해당 위치를 follow하도록 설정.
Pickup virtual camera를 추가해 머리뼈를 follow하도록 설정했다.
카메라에 캐릭터의 팔이 가까워지면 짤리는 현상이 생겼는데, 검색해보니 inspector상의 clipping planes 값 중 near 값을 작게 해주면 해결이 되는 문제였다.
하지만, cinemachine을 사용하고 cmain camera에 cinemachine brain컴포넌트를 추가하니 값 변경이 되지 않음 -> 씨네머신 컴포넌트 - Lens 옵션을 열어보니 있었음( 이부분 고치느라 몇시간은 쓴듯 )

쓰레기를 생성할 구역

빈 오브젝트로 쓰레기를 생성할 구역 생성.

범위를 확인하기 위해 box collider생성후 원하는 구역에 맞게 설정한다.
구역에 캐릭터가 충돌하면 안되니 is trigger 체크하면 됨.

생성할 쓰레기들은 콜라이더 위에 x,y좌표가 랜덤으로 설정, y좌표는 고정이다.

public GameObject[] trashPrefabs; // 스폰할 쓰레기 프리팹 배열
public BoxCollider spawnArea;     // 스폰 범위로 사용할 Box Collider
public int trashCount = 15;       // 스폰할 쓰레기 개수

이런식으로 배열을 생성해 쓰레기 프리팹들을 넣어주면됨.

void SpawnTrash()
{
    for (int i = 0; i < trashCount; i++)
    {
        Vector3 randomPosition = GetRandomPositionInArea();
        GameObject randomTrash = GetRandomTrashPrefab();
        Instantiate(randomTrash, randomPosition, Quaternion.identity);
    }
}

Vector3 GetRandomPositionInArea()
{
    Vector3 center = spawnArea.bounds.center;
    Vector3 size = spawnArea.bounds.size;

    float x = Random.Range(center.x - size.x / 2, center.x + size.x / 2);
    float z = Random.Range(center.z - size.z / 2, center.z + size.z / 2);
    float y = center.y + 0.2f; // 스폰 높이를 고정

    return new Vector3(x, y, z);
}

GameObject GetRandomTrashPrefab()
{
    int randomIndex = Random.Range(0, trashPrefabs.Length);
    return trashPrefabs[randomIndex];
}

쓰레기의 위치, 랜덤으로 골라진 쓰레기, 쓰레기를 생성하는 로직.

쓰레기가 잘 생성됐다. 이제 줍기 애니메이션을 하면 쓰레기를 집어드는 로직을 짜야 한다. -> 할게 생각보다 많네?

쓰레기 줍기

일단 지금 생각해본 아이디어는 오른손바닥 위치에 Trash Position 콜라이더를 추가하고 쓰레기와 콜라이더가 닿으면 손으로 쓰레기를 이동시키는 방법이다.

줍는 모션은 허공에 손을 허우적대는 느낌인데, 허우적댔더니 손에 쓰레기가 들려있으면 너무 어색할것 같으니, 이번에 큰맘먹고 산 에셋인 Final Ik를 써볼까 한다. Ik는 Inverted Kinematics로 부모 뼈 -> 자식 뼈로 움직이는 Fk의 반대 개념으로 손이나 발을 기준으로 조작할때 좋다. 즉 손의 부모 뼈인 팔목이나 팔꿈치를 움직이는 대신 손을 움직여 팔을 조작하게 하는것이다.

이 에셋의 기능중에 인터랙티브 뭐시기를 쓰면 대상에게 정확히 손을 뻗을 수 있을것이다. 한번 해보자.


일단 너무 피곤해서 오늘은 여기까지.

마지막으로 하고있던 작업:

씬에 랜덤으로 쓰레기 배치하고 ui 만들던 중이였음.

내일 할것:

플레이어가 쓰레기 근처에 가고, 쓰레기를 조준했을 때 press e to pickup UI 표시, 이때만 줍기 애니메이션 재생하도록. 여기부터 하자. -> 지피티한테 어디까지 했냐고 물어보면 답해달라 했음. 과연 해줄까?!

profile
크래프톤 6기 정글러

0개의 댓글