TIL 25.03.12 - 팀 과제 1일차

강진규·2025년 3월 12일

Today I Learned

목록 보기
29/34
post-thumbnail

[ 3D 퍼즐 플랫폼 게임 ]

레퍼런스 게임: "Portal""The Witness"

설명: 3D 퍼즐 플랫폼 게임은 플레이어가 퍼즐을 풀며 장애물을 피해 목표 지점에 도달하는 게임입니다.

우리 조는 퍼즐 게임을 레퍼런스해서 팀 과제를 진행하기로 하였다.


[ 필수 구현 사항 ]

  1. 퍼즐 디자인
  2. 플레이어 캐릭터 및 컨트롤
  3. 퍼즐 해결 시스템
  4. 장애물 및 트랩
  5. 목표 지점
  6. 게임 진행 상태 및 저장
  7. 사운드 및 음악

오늘은 구현보다는 전체적인 틀을 잡고 구상을 진행하였고
각자 맡게된 부분을 조금 진행하기로 하였다.

내가 하게된 부분은 퍼즐에서 빛의 반사를 이용한 기믹이다.

대충 이런느낌이다.
빛 기둥을 발사해서 거울과 같은 오브젝트를 통해 반사하게 되고 목표 지점에 도달하면
퍼즐 해결을 할 수 있는 느낌이다.

오늘은 우선 간단하게 빛을 생성하고 반사 되게만 만들려고 한다.


[ 빛 생성 ]

어떤 방식으로 빛 기둥을 만들어야 될까 찾아보다가 LineRenderer라는 녀석을 찾았다.
라인 렌더러(Line Renderer)는 3D 공간에서 두 개 이상 지점의
배열을 사용하고 각각을 연결하는 직선을 그려준다.

List<Vector3> lightPath = new List<Vector3>();
Vector3 direction = transform.forward;
Vector3 startPosition = transform.position;
lightPath.Add(startPosition);

----------------------------------------------------------------------

RaycastHit hit;

if (Physics.Raycast(startPosition, direction, out hit, maxDistance - currentLightDistance, reflectableLayer | blockLayer))
{
    lightPath.Add(hit.point);
    currentLightDistance += Vector3.Distance(startPosition, hit.point);  
    
    
----------------------------------------------------------------------

lineRenderer.positionCount = lightPath.Count;
lineRenderer.SetPositions(lightPath.ToArray());

해당 방식을 통해 raycast를 사용하여 빛 기둥을 생성하는 기능을 구현했다.
raycast로 나온 ray를 따라 빛 기둥을 생성한다고 생각하면 쉽다.


[ 빛 반사 ]

거울 같은 오브젝트와 접촉하면 방향을 반환해줘서 반사되는 느낌을 주게 만들었다.
Vector3.Reflect를 사용하여 해당 기능을 구현했다.

public Vector3 Reflect(Vector3 incomingDirection, Vector3 normal)
{
    return Vector3.Reflect(incomingDirection, normal);
}

Reflect를 사용하니까 알아서 반사된 방향을 계산해줘서 편하게 만들 수 있었다.
해당 방향으로 다시 빛 기둥을 생성해주었다.

// 거울을 맞았으면 반사
Mirror mirror = hit.collider.GetComponent<Mirror>();
if (mirror != null)
{
    direction = mirror.Reflect(direction, hit.normal);
    startPosition = hit.point;
}
else
{
    // 벽이나 장애물에 부딪히면 멈춤
    break;
}

위의 코드를 추가해서 빛 기둥 생성시 방향을 바꿔 줄수 있게 해주었다.


구글링을 해보다가 굉장히 좋은 예제를 찾아서 기본적인 기능을 어느정도 구현 할 수 있었다.
내일은 자세한 기능 구현에 들어가야겠다.

0개의 댓글