
오늘은 오류 수정과 만들었던 기능을 조금 변형해주었다.
기존에는 MaterialPropertyBlock를 사용해서 메테리얼의 색상을 변경해주었다.
그런데 이것이 충돌이 일어나서 아웃라인이 제대로 적용되지 않았던 것이었다.
// 기존 머티리얼을 복사하여 새 머티리얼을 생성 (개별 오브젝트 적용)
mirrorRenderer.material = new Material(mirrorRenderer.sharedMaterial);
mirrorRenderer.material.SetColor("_Color", mirrorColor);
그래서 기존 것을 복사해서 사용하는 방식으로 변경해주었고 제대로 동작하게 되었다.
기존에는 목표 달성 시 빛 기둥이 그대로 남아있었는데, 이렇게 되었을때
나중에 오브젝트가 많아지면 성능 저하가 생길 것 같아서 목표를 달성하게 되면
서서히 사라지게 하는 효과를 만들었다.
IEnumerator FadeOutAndDestroy(GameObject beam)
{
Renderer beamRenderer = beam.GetComponent<Renderer>();
if (beamRenderer == null) yield break;
Material material = beamRenderer.material;
Color startColor = material.color;
Color startEmission = material.GetColor("_EmissionColor"); // 초기 Emission 색상 저장
Vector3 startScale = beam.transform.localScale; // 초기 크기 저장
float duration = 1.5f; // 서서히 사라지는 시간 (초)
float elapsed = 0f;
while (elapsed < duration)
{
elapsed += Time.deltaTime;
float fadeAmount = Mathf.Lerp(1f, 0f, elapsed / duration); // 1 → 0으로 점점 감소
// 색상 투명도 적용
material.color = new Color(startColor.r, startColor.g, startColor.b, fadeAmount);
// Emission 강도 감소
Color newEmission = startEmission * fadeAmount;
material.SetColor("_EmissionColor", newEmission);
beam.transform.localScale = new Vector3(
startScale.x * fadeAmount, // 가로 크기 줄이기
startScale.y, // 높이(Y)는 그대로 유지
startScale.z * fadeAmount // 세로 크기 줄이기
);
yield return null;
}
Destroy(beam); // 완전히 사라진 후 오브젝트 삭제
}
코루틴을 사용하여 설정한 시간에 맞게 빛 기둥의 투명도와 emission의 강도를 낮춰주고
크기로 줄어들게 만들어 보았다. 다 실행이 되었다면 오브젝트를 삭제시켜줬다.

기존에는 거울의 뒷면에도 빛이 반사가 되었는데 이게 좀 그래서 수정을 해보았다.
// 반사각 계산
public bool Reflect(Vector3 incomingDirection, Vector3 normal, out Vector3 reflectedDirection)
{
Vector3 mirrorForward = -transform.forward;
// 뒤로 빛이 들어왔으면 반사 x
if (Vector3.Dot(incomingDirection, mirrorForward) > 0)
{
reflectedDirection = Vector3.zero;
return false;
}
// 반사각 계산
reflectedDirection = Vector3.Reflect(incomingDirection, normal);
return true;
}
-----------------------------------------------------------------------
if (mirror.Reflect(direction, hit.normal, out newDirection))
{
direction = newDirection;
startPosition = hit.point;
}
else
{
break;
}
기존 반사각을 계산해서 반환하는 코드를 bool 값을 반환하게 변경했고,
거울의 방향이 앞쪽이 아니면 false, 맞으면 true를 반환하게 해주었다.
true를 반환 받았을때만 반사된 각도로 빛 기둥이 생성될 수 있게 만들어주었다.
각자 만든 기믹이 있는데 서로 그 기믹에 대한 튜토리얼 느낌의 맵을 구성하기로 했다.
시연영상이 길어지면 안되기 때문에 간단하게 맵을 구성해보았다.

대충 이런 느낌으로 맵을 구성하였고 간단하게 빛 반사와 목표 지점에 대한 튜토리얼 느낌으로
구성하였다.
주말 쉬고 오면 사실상 월,화 이틀남았는데 구현하려던 기능까지는 구현이 다 되었기때문에
추가적인 기믹을 구현하거나 필수 기능 중 부족한 부분을 더 확실하게 해야겠다.