TIL

25.04.10 TIL

gaon99 2025. 4. 10. 21:36

최종 프로젝트 5일차

 

1. 오늘 학습 키워드

Live2D, Raw Image, 카드 플립


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

 

우선 어제 만들어주신 마리아와 엘리오스, 그리고 보스까지 Live2D 적용을 마쳤다.

 

이 Live2D 이미지를 어떻게 UI로 적용 시킬까 고민을 많이했다.

 

처음에는 프리팹을 월드 스페이스에서 생성 시키는 방법이였는데, 이 부분은 탐탁치가 않아서 반려했고,

다음 방법은 서브 카메라를 통해 생성되어있는 오브젝트를 보여주는 방식으로 구현했으나,

 

오브젝트를 비 활성화하면 애니메이션이 오류가 나는 치명적인 오류가 생겼다.

 

그래서 다음 방법을 찾아보다 Raw Image를 통해 서브 카메라가 찍는 모습을 UI로 보여주는 것이였고,

 

서브 카메라의 뷰포트 안에 Live2D 프리팹을 넣었으나 서브 카메라에 보이질 않았다.

무엇이 문제인지 찾고 싶었으나, 진짜 아무리 해도 카메라가 프리팹을 찍지를 않았던 것이다.

 

레이어도 확인했고, 오소그래픽, 모든 세팅이 다 되어있는데 찍질 않았기에, 정말 2시간 동안 새로 텍스쳐를 제작하고 그랬으나

여전히 되질 않았다.

그러다 설마 하고 Z축이 원인인가? 싶어서 확인해보니, 범인은 프리팹의 트랜스폼의 Z축이 카메라와 겹쳐있어서 못찍은것 같다.

 

프리팹의 Z를 3으로 설정해주니, 그제서야 카메라가 일을 하기 시작했고, 이미지를 설정할 수 있었다.

 

그 이후 프리팹의 등장 애니메이션을 원하셔서 이렇게 선택한 오브젝트와 밸류값을 매개변수로 받아,

목표 지점까지 움직이는 코루틴을 제작했다.

public IEnumerator MoveObj(GameObject obj, float value) // Live2D 프리팹 움직임
{
    obj.SetActive(true);
    Vector3 startPos = obj.transform.position;
    Vector3 endPos = new (value,startPos.y,startPos.z);
    float duration = 0.35f;
    float elapsed = 0f;

    while (elapsed < duration)
    {
        elapsed += Time.deltaTime;
        obj.transform.position = Vector3.Lerp(startPos, endPos, elapsed / duration);
        yield return null;
    }
    obj.transform.position = endPos;
}

 

이후 리턴 버튼을 누를시에, 해당 프리팹이 초기화가 되어있어야 다시 이 코루틴을 작동시킬 수 있기에

초기값을 이런식으로 작성해주었다.

public void InitObj() // 카드 세팅 초기화도 추후 추가
{ 
    mariaPrefab.SetActive(false);
    eliosPrefab.SetActive(false);

    eliosPrefab.transform.position = new Vector3(-4f, -0.84f, 3);
    mariaPrefab.transform.position = new Vector3(4f, -1.2f, 3);
}

 

그 이후 설명 카드가 뒤집어지는 효과도 원하셔서,

하단의 코드처럼 작성은 했으나, 일단 구현이 목적인 코드라 수정은 내일 할 예정이다.

public IEnumerator FlipCard(Transform location, CampCard selectedCard, CampCard unselectedCard)
    {
        isFlip = true;
        unselectedCard.SetActive(false);
        
        float time = 0.5f;
        float elapsed = 0f;
        
        Quaternion startRot = location.rotation;
        Quaternion endRot = startRot * Quaternion.Euler(0f,180f,0f);
        if(selectedCard.front) selectedCard.front.SetActive(false); 
        if(selectedCard.back) selectedCard.back.SetActive(true);
        bool half = false;
        while (elapsed < time)
        {
            elapsed += Time.deltaTime;
            float t = Mathf.SmoothStep(0f,1f,elapsed / time);

            if (!half && t >= 0.5f)
            {
                if(selectedCard.back != null) selectedCard.back.SetActive(false);
                if(selectedCard.front != null) selectedCard.front.SetActive(true);
                half = true;
            }
            // 선택된 카드의 front 회전을 변화시킴. (회전 기준은 location)
            if(selectedCard.front != null)
            {
                selectedCard.front.transform.rotation = Quaternion.Slerp(startRot, endRot, t);
            }
            yield return null;
        }
        if(selectedCard.front != null)
        {
            selectedCard.front.transform.rotation = endRot;
        }
    
        isFlip = false;
    }

3. 학습하며 겪었던 문제점 & 에러

카메라 트랜스폼...


4. 내일 학습 할 것은 무엇인지

카드 뒤집기가 현재 캐릭터가 움직이는 것 보다 살짝 느리게 반응을 하여서, 이 부분을 좀 수정하고

코드가 만족스럽진 않아서, 조금 손 볼 것 같다.

'TIL' 카테고리의 다른 글

25.04.14 TIL  (0) 2025.04.14
25.04.11 TIL  (0) 2025.04.11
25.04.09 TIL  (0) 2025.04.09
25.04.08 TIL  (0) 2025.04.08
25.04.07 TIL  (0) 2025.04.07