Plane 사용, Player Renderer 및 Animation 적용, 오브젝트 먹었을 때 카운트 로직

유승아·2024년 6월 4일

내일배움캠프

목록 보기
54/69

💫Troubleshooting

Ground 범위 밖으로 이동하는 현상

1) 문제 현상

맵이 큐브로 이루어져 있어서 큐브 레이어를 Ground로 설정하면 모든 면이 클릭되어
위와 같은 현상이 일어나는 것으로 보인다.

2) 문제 해결

  1. Ground 레이어 Default로 변경
  2. GroundPlane 생성
    • Layer: Ground
    • Materials: GroundPlaneMaterial
  3. GroundPlaneMaterial 생성
    • Rendering Mode: Fade
    • Albedo A: 0

Ray가 인식할 수 없게 Ground 레이어를 다시 Default로 변경하고,
Plane을 생성한 뒤 큐브 특정 면에 배치, 레이어 설정, 투명도 조절을 하니까
Player가 더이상 큐브를 탈출할 수 없게 되었다. 😏


Player Renderer 및 Animation 적용

1. 기존 Player

우리 Player는 태초에 캡슐 형태였다.
좀 더 캐릭터스럽게 바꿔보자...

2. Renderer 및 Animation 적용

에셋에 있는 렌더러와 애니메이션을 적용했다.

이동 시 애니메이션은 정상적으로 작동하는데 캐릭터가 '앞'만 보고 달린다.

1) 현재 이동 방향 바라보기

PlayerMovementController.cs

// 캐릭터 회전 설정
Vector3 direction = (targetPosition - transform.position).normalized;
Quaternion targetRotation = Quaternion.LookRotation(direction);

// 새로운 목표 위치로 이동 및 회전
moveTween = DOTween.Sequence()
    .Append(transform.DORotateQuaternion(targetRotation, rotationSpeed))
    .Join(transform.DOMove(targetPosition, moveDuration).SetEase(moveEase))
    .OnStart(() =>
    {
        if (anim != null)
        {
            anim.SetBool("isRun", true);
        }
    })
    .OnComplete(() =>
    {
        moveTween = null;
        if (anim != null)
        {
            anim.SetBool("isRun", false);
        }
    });

현재 이동 방향을 바라보게 했더니 Player 안에 카메라가 있어서 같이 회전해버린다.

2) Player 모델만 회전시키기

PlayerMovementController.cs

[Header("References")]
public Transform playerModel; // Player 모델의 Transform

// 생략

// 캐릭터 회전 설정
Vector3 direction = (targetPosition - transform.position).normalized;
Quaternion targetRotation = Quaternion.LookRotation(direction);

// 새로운 목표 위치로 이동 및 회전
moveTween = DOTween.Sequence()
    .Append(playerModel.DORotateQuaternion(targetRotation, rotationSpeed))
    .Join(transform.DOMove(targetPosition, moveDuration).SetEase(moveEase))
    .OnStart(() =>
    {
        if (anim != null)
        {
            anim.SetBool("isRun", true);
        }
    })
    .OnComplete(() =>
    {
        moveTween = null;
        if (anim != null)
        {
            anim.SetBool("isRun", false);
        }
    });

Player 모델의 Transform를 받아와서 이것만 이동 방향으로 회전시켜주면!!

카메라는 그대로, Player만 회전하는 것을 확인할 수 있다. 👍


오브젝트 먹었을 때 카운트 로직

스크립트나 오브젝트 이름 짓기 너무 어렵다!
팀원분들이 딱 봤을 때 어떤 기능을 하는 것인지 알 수 있었으면 좋겠다.

아래 스크립트는 특정 Phase에서만 쓰일 거라... 음, 좀 막 지었나? 😓

PlayerObjectCount.cs

public int count = 0;

private void OnTriggerEnter(Collider other)
{
    if (other.TryGetComponent<WhiteBallObject>(out WhiteBallObject wbo))
    {
        count = Mathf.Clamp(count + 1, 0, 8);
        Destroy(other.gameObject);
    }
    else if(other.TryGetComponent<BlackBallObject>(out BlackBallObject bbo))
    {
        count = Mathf.Clamp(count - 1, 0, 8);
        Destroy(other.gameObject);
    }
}
  1. other.TryGetComponent<WhiteBallObject>(out WhiteBallObject wbo)
  2. other.TryGetComponent(out WhiteBallObject wbo)

✔️ 두 코드의 차이점
1. 명시적으로 WhiteBallObject 형식의 컴포넌트를 찾으려고 한다.
2. 형식을 명시하지 않고 컴포넌트를 찾으려고 한다.
→ 기능적으로는 두 코드가 동일한 작업을 수행하지만, 가독성을 고려할 때 1번 코드가 낫다.

Mathf.Clamp

Mathf.Clamp(value, min, max)

  • valuemin보다 작으면 min 값 반환
  • valuemax보다 크면 max 값 반환
  • 그 외의 경우에는 value 값 그대로 반환

Count가 제대로 올라가고 내려가는지 확인하고 싶다면 아래 링크에서 확인!

👉 영상 크게 보기

0개의 댓글