TIL 25.03.14 - 팀 과제 3일차

강진규·2025년 3월 14일

Today I Learned

목록 보기
31/34
post-thumbnail

오늘은 오류 수정과 만들었던 기능을 조금 변형해주었다.


[ 아웃라인 오류 수정 ]

기존에는 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를 반환 받았을때만 반사된 각도로 빛 기둥이 생성될 수 있게 만들어주었다.


[ 기본적인 맵 구성 ]

각자 만든 기믹이 있는데 서로 그 기믹에 대한 튜토리얼 느낌의 맵을 구성하기로 했다.
시연영상이 길어지면 안되기 때문에 간단하게 맵을 구성해보았다.

대충 이런 느낌으로 맵을 구성하였고 간단하게 빛 반사와 목표 지점에 대한 튜토리얼 느낌으로
구성하였다.


주말 쉬고 오면 사실상 월,화 이틀남았는데 구현하려던 기능까지는 구현이 다 되었기때문에
추가적인 기믹을 구현하거나 필수 기능 중 부족한 부분을 더 확실하게 해야겠다.

0개의 댓글