TIL

2024 12 02 TIL

noc777 2024. 12. 2. 10:06

이번에 이미션 효과를 사용하여 조각상이 점멸하는 것을 표현하고 싶어

찾아 사용하였던 Mathf 프로퍼티에 관해서 정리해둔다.

float Mathf.LinearToGammaSpace(float value);
//괄호안의 값을 선형에서 감마 색상 공간으로 값을 변형

float Mathf.PingPong(float time,float length);
//0과 length(최대값) 사이에서 최소값과 최대값을 왕복함
//time에 들어가는 값은 Time.time 과 같은 지속적으로 증가하는 값이 들어가야함

 

Mathf.LinearToGammaSpace

 

일단 사용하는 이유에 대해서 먼저 이야기하면 유저가 보기에 자연스러운 색을 나타내기 위해서 사용한다.

 

유니티에서 색을 표현하는 방식이 Linear Space 와 Gamma Space로 나누는데

 

Linear Space는 디폴트 값이며 사실적인 색 표현을 위해 사용된다면

Gamma Space는 사람이 보기에 자연스러운 색 표현을 위해 사용되는 방식이다.

 

따라서 그래픽 품질을 높인다고 생각하였을 때 먼저 리니어방식에서 연산을 처리하고 

이후 감마방식으로 변형하여 사용하는 것이라 해석하였다.

 

 

Mathf.PingPong

 

이건 사실 이전에 써봤던 키워드같은 느낌이다. 

 

단순히 0에서부터 최대 길이 만큼의 비율을 두고 최소값과 최대값을 반복하는 방식의 구현을 원할 때 쓰인다.

여기서 쓰인 것은 석상이 계속해서 점멸하듯 빛나는 것을 표현해주고 싶어서 이 키워드를 사용하였다.

 

 

IEnumerator LightFlicker()
{
    while(true)
    {
        float emissionColor = Mathf.PingPong(Time.time, 1.0f); //0부터 1까지 비율로 조절
        _material.SetColor(emissionColorID, new Color(0.5f, 0.5f, 0.5f) * Mathf.LinearToGammaSpace(emissionColor));
        //위의 코드에서 계산하는 연산을 감마스페이스로 변환해서 new Color에 적용시켜준다.

        yield return null;
    }
}

 

 

 

퍼즐 코드가 너무 단조로워보여서 약간 수정하여 라운드 별로 상호작용을 해야하는 수가 늘어나도록 변경하였다. 

퍼즐같은 경우 내가 어떻게 구현을 할지 전부 머리속에서 구상을 하고 코드를 작성하기가 어려웠다.

 

기획단계에서 일정부분 어떤 퍼즐을 작성할지 정해두었지만 나머지 퍼즐들에 대해선 아직 기획을 해야하는 단계이다.

그래서 그 이전에 먼저 정형화된 틀을 만들어두는 게 좋아보였다.  

 

나는 아직 추상클래스와 인터페이스를 잘 다루지 못한다. 그래서 더더욱 스스로 많이 써보고 피드백을 받아봐야한다고 생각한다.   

public interface PostGuarduateActivate //대학원생쪽에서 활성화가 필요한 오브젝트 인터페이스
{
    public void Activated();
    public void DeActivated();
}

public interface ProfessorObservation //교수쪽에서 관찰하는 오브젝트의 인터페이스
{
    public void Observed();
    public void Disappeared();
} 

public abstract class Puzzle : MonoBehaviour
{
    public int curRound { get; protected set; } = 0;  //현재 라운드 상태

    public List<PostGuarduateActivate> postGuarduateActivates = new List<PostGuarduateActivate>(); //대학원생이 이번 라운드에서 활성화해야하는 대상들
    public PostGuarduateActivate curPostGuarduateActivate { get; protected set; } = null; //대학원생이 현재 활성화해야하는 대상

    public List<ProfessorObservation> professorObservations = new List<ProfessorObservation>(); //교수쪽에서 이번라운드에서 관측하고 정보를 전달해야하는 대상들

    //모든 퍼즐들은 켜고 끔으로서 사용되는 것을 기반으로 한다.
    protected abstract void OnEnable(); 
    protected abstract void OnDisable();

    public abstract void MatchPuzzle(); //상호작용이 성공적으로 수행되었을 때 메서드
    public abstract void ResetPuzzle();//잘못된 상호작용으로 인해 퍼즐이 리셋될 때 메서드

    protected abstract void ClearPuzzle(); //라운드 내 모든 상호작용이 성공하였을 때 메서드
    protected abstract void ClearAllPuzzle();//모든 라운드가 완료되었을 때 메서드
}

 

일단은 모든 퍼즐들에 상속시킬 Puzzle이란 추상클래스를 만들어보았다.   

퍼즐이란게 전부 다 같은 로직으로 돌아가는 개념이 아니다보니 만들고나서도 이렇게 나누는 게 맞을까 고민이 많이 된다.

이번에 만들 퍼즐들은 퍼즐마다 어느정도 단계를 두고 점차 어려워지는 것을 만들고 싶어서 라운드라는 개념을 넣어봤다.

 

아까 메인퍼즐을 수정하였다고 했을 때도 1단계에선 1개 2단계에선 2개 .... 총 5단계 5개 까지 라운드마다 상호작용이 필요하도록 해봤다.

 

그래서 이 라운드라는 개념을 공통부분으로 삼아서 메서드를 추려왔다.   

아무리 그래도 퍼즐마다 작동원리는 다를 것이기에 abstract 메서드를 많이 만든 것 같다. 

abstract는 상속시킬 때마다 직접구현을 시키긴 해야하지만  키워드를 쥐어주고 시작하는 것이기에 좀 더 낫지 않을까 생각했다.

 

그리고 추상클래스 위의 인터페이스는 각각 대학원생 플레이어와 교수 플레이어가 상호작용할 오브젝트에 상속시키는 인터페이스다.

 

그리고 이 인터페이스를 상속시킨 변수들을 활용하여 상속받는 클래스에서

공통적으로 사용할 수 있도록 해볼 것 같다. 

 

'TIL' 카테고리의 다른 글

2024 12 04 TIL  (2) 2024.12.04
2024 12 03 TIL  (1) 2024.12.03
2024 12 01 TIL  (0) 2024.12.01
2024 11 29 TIL  (0) 2024.11.29
2024 11 28 TIL  (0) 2024.11.28