
레퍼런스 게임: "Portal"과 "The Witness"
설명: 3D 퍼즐 플랫폼 게임은 플레이어가 퍼즐을 풀며 장애물을 피해 목표 지점에 도달하는 게임입니다.
우리 조는 퍼즐 게임을 레퍼런스해서 팀 과제를 진행하기로 하였다.
오늘은 구현보다는 전체적인 틀을 잡고 구상을 진행하였고
각자 맡게된 부분을 조금 진행하기로 하였다.
내가 하게된 부분은 퍼즐에서 빛의 반사를 이용한 기믹이다.

대충 이런느낌이다.
빛 기둥을 발사해서 거울과 같은 오브젝트를 통해 반사하게 되고 목표 지점에 도달하면
퍼즐 해결을 할 수 있는 느낌이다.
오늘은 우선 간단하게 빛을 생성하고 반사 되게만 만들려고 한다.
어떤 방식으로 빛 기둥을 만들어야 될까 찾아보다가 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;
}
위의 코드를 추가해서 빛 기둥 생성시 방향을 바꿔 줄수 있게 해주었다.

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