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


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

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

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

이동 시 애니메이션은 정상적으로 작동하는데 캐릭터가 '앞'만 보고 달린다.
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 안에 카메라가 있어서 같이 회전해버린다.
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);
}
}
- other.TryGetComponent
<WhiteBallObject>(out WhiteBallObject wbo)- other.TryGetComponent(out WhiteBallObject wbo)
✔️ 두 코드의 차이점
1. 명시적으로WhiteBallObject형식의 컴포넌트를 찾으려고 한다.
2. 형식을 명시하지 않고 컴포넌트를 찾으려고 한다.
→ 기능적으로는 두 코드가 동일한 작업을 수행하지만, 가독성을 고려할 때 1번 코드가 낫다.
Mathf.Clamp(value, min, max)
value가 min보다 작으면 min 값 반환value가 max보다 크면 max 값 반환value 값 그대로 반환
Count가 제대로 올라가고 내려가는지 확인하고 싶다면 아래 링크에서 확인!
👉 영상 크게 보기