TIL 25.03.13 - 팀 과제 2일차

강진규·2025년 3월 13일

Today I Learned

목록 보기
30/34
post-thumbnail

어제 구현 부분부터 자세한 기능 구현에 들어갔다.

우선 다른 팀원이 구현해준 플레이어를 연결해주었다.
그리고 빛 생성 방법을 변경해주었다.


[ 빛 생성 변경 ]

기존에 라인렌더러를 사용하여 빛을 생성하였는데 이게 2d처럼 보여서
방식을 변경해보았다.

실린더를 하나 만들어서 프리팹화 시켜서 사용하였다.

 void CreateLightBeam(Vector3 start, Vector3 end, Color beamColor)
 {
     GameObject beam = Instantiate(lightBeamPrefab);
     lightBeams.Add(beam);

     // 위치 설정
     beam.transform.position = (start + end) / 2;

     // 빛의 방향 설정
     Quaternion rotation = Quaternion.LookRotation(end - start);
     beam.transform.rotation = rotation * Quaternion.Euler(90, 0, 0);

     // 크기 조정
     beam.transform.localScale = new Vector3(
         lightBeamPrefab.transform.localScale.x,   // 프리팹의 X 크기 유지
         (end - start).magnitude / 2,              // 길이 조정
         lightBeamPrefab.transform.localScale.z    // 프리팹의 Z 크기 유지
     );
}

라인렌더러 부분만 실린더 프리팹을 생성해주는 것으로 바꾼거라 뭐 별거 없었다.


[ 색상 변경 거울 ]

거울에 빛에 비춰지면 색상이 빛의 색상이 변경되게 만들어 보았다.
하는 김에 거울 스크립트를 만들어서 반사 계산 부분을 이동시켰다.

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

public Color GetMirrorColor()
{
    return mirrorColor;
}

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

Mirror mirror = hit.collider.GetComponent<Mirror>();
beamColor = mirror.GetMirrorColor();

GetMirrorColor를 통해 거울의 색상을 가져와서 빛 기둥
생성 시 적용할 색상에 설정하게 해주었다.


[ 2개의 빛 색상 혼합 ]

거울이 여러 번 반사될 때 2개의 색상을 혼합할 수 있게 만들어봤다.
예를 들어 빨강 파랑이 섞이면 보라색 빛 색상으로 나오게 된다.

public Color MixColor(Color incomingColor)
{
    Color mix = new Color(
        Mathf.Lerp(incomingColor.r, mirrorColor.r, 0.5f),
        Mathf.Lerp(incomingColor.g, mirrorColor.g, 0.5f),
        Mathf.Lerp(incomingColor.b, mirrorColor.b, 0.5f)
    );

    return mix;
}

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

beamColor = mirror.MixColor(beamColor);

Renderer beamRenderer = beam.GetComponent<Renderer>();
if (beamRenderer != null)
{
    beamRenderer.material.color = beamColor;
    beamRenderer.material.SetColor("_EmissionColor", beamColor * 2f);
}

해당 메서드를 통해 두 색상의 중간색을 계산해서 반환해준다.
Lerp를 사용해서 중간 값을 반환할 수 있게 해봤다.
그렇게 결정된 색상을 빛 기둥 생성 시 적용시켜주었다.
EmissionColor도 변경해서 색상에 맞게 빛날 수 있게 했다.


[ 목표 지점 설정 ]

반사를 통해 결정된 빛의 색상이 목표지점에 색상과 일치하면 기믹이 성공하게 만들었다.

// 목표지점 히트 시 호출
public void OnLightHit(Color beamColor)
{
    if (!isClear)
    {
        // 색상 일치 시 오브젝트 움직임
        if (CheckColorMatch(beamColor))
        {
            isClear = true;
            Debug.Log("목표 색상과 일치! 퍼즐 성공!");
            MoveObject();  
        }
        else
        {
            Debug.Log("색상이 다릅니다. 다시 반사하세요!");
        }
    }
}

public bool CheckColorMatch(Color beamColor, float tolerance = 0.1f)
{
    float rDiff = Mathf.Abs(targetColor.r - beamColor.r);
    float gDiff = Mathf.Abs(targetColor.g - beamColor.g);
    float bDiff = Mathf.Abs(targetColor.b - beamColor.b);

    return (rDiff < tolerance && gDiff < tolerance && bDiff < tolerance);
}

CheckColorMatch를 통해 빛의 색상과 목표 지점의 색상을 0.1의 오차범위 내로
일치한지 체크해주고 True이면 MoveObject를 통해 문을 열어주는 형식으로 만들었다.


오늘도 꽤 많이 진행 한것 같아서 나름 만족스러웠다.
다른 팀원분의 작업물을 병합을 했는데 아웃라인 쪽에서 문제가 발생을 했다.

내일은 우선 이 부분을 수정하고 시작해야겠다.

0개의 댓글