TIL

25.03.11 TIL

gaon99 2025. 3. 11. 20:49

1. 오늘 학습 키워드

 

개인 과제 및 직렬화


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

 

우선 개인 과제에서는 무빙 패드? 플레이어가 밟을 시에, 해당 랠리 포인트까지 움직이는 그런 패드를 제작 했고,

 

버섯을 먹을시에 이동속도 증가는 되었지만, 감소가 되지 않았는데, 코루틴에서 딜레이를 매개 변수로 받아,

아래의 코드처럼 작성하였는데, 인 게임에서 시간을 설정을 안해서 그런지, 아이템 효과가 무한으로 지속 되었다.

 

그래서 WaitForSecondsRealtime()을 활용해서 현실 시간에 딜레이를 걸어주었다.

private IEnumerator SpeedBoost(float amount, float duration)
{
    currentSpeed += amount;
    yield return new WaitForSeconds(duration);
    currentSpeed -= amount;
}

 

그리고 무빙 패드 같은 경우에는 Unity에서 Empty Object로 좌표를 지정하고, point A - point B로 이동하도록 작성하였고,

void Start()
{
    targetPosition = transform.position; 
}

void Update()
{
    if (isActivated && !isMoving)
    {
        StartCoroutine(MovePlatform());
    }
}

private IEnumerator MovePlatform()
{
    isMoving = true;

    while (Vector3.Distance(transform.position, targetPosition) > 0.1f)
    {
        transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
        yield return null;
    }

    yield return new WaitForSeconds(waitTime);
    targetPosition = (targetPosition == pointA.position) ? pointB.position : pointA.position;
    isMoving = false;
}

 

플레이어를 패드를 부모로 삼아서, 움직일때 떨어지지 않도록 고정하였다.

고정을 하지 않으니, 큐브의 움직임도 많이 버벅였고, 그,, 큐브 크기가 좀 작기에 큐브 따라서 움직이기가 너무 힘들었다.

 

그리고 IsTrigger를 사용해서, OnTriggerEnter를 사용했는데, 이를 사용하게 되면 Collider가 통과하기도 하고,

하나를 더 설치하였더니, 큐브를 플레이어가 뚫어버리길래, OnCollisionEnter로 변경하여,

충돌시에 코드가 작동되도록 하였다.

private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Player"))
    {
        collision.gameObject.transform.SetParent(transform);
        isActivated = true;
    }
}

private void OnCollisionExit(Collision collision)
{
    if (collision.gameObject.CompareTag("Player"))
    {
        collision.gameObject.transform.SetParent(null);
        isActivated = false;
        StartCoroutine(ReturnToStart());
    }
}

그리고 IsActivated를 사용해서, 사용중이 아니라면 초기 위치로 되돌아가도록 했다.

private IEnumerator ReturnToStart()
{
    isReturning = true;
    targetPosition = pointA.position; 
    
    while (Vector3.Distance(transform.position, pointA.position) > 0.1f)
    {
        transform.position = Vector3.MoveTowards(transform.position, pointA.position, speed * Time.deltaTime);
        yield return null;
    }
    isReturning = false; // 원래 위치로 돌아온 후 초기화
}

 

이런식으로 오늘의 할 일을 끝내었고.

 

특강과 레벨업 특강 모두 직렬화에 대해서 배웠다.

 

직렬화를 활용할 수 있는 방법이 5가지 정도 있다.

 

우선 Player.Prefs는 Set과 Get을 통해 간단히 데이터를 저장 및 가져올 수 있기에,

데이터 값 변동이 쉬워, 해상도나, 이런 설정 값을 사용할 때 좋다.

 

Xml은 Excel에서 작성한 테이블표를 코드로 가져올 수 있는데

Resources를 통해 파일을 불러오고, xml은 칸마다 "," 와 "\n" 으로 구별 되어 있기에 Split을 사용하여 값을 관리할 수 있다.

xmlSerializer를 사용하면 줄을 많이 요약하여 사용 가능하다.

 

Json은 개발을 하면서 제일 많이 쓰게 될 거라고 하셨고,

그 중에서도 jsonUtility 라고 하셨다.
성능이 제일 좋긴 하다만, 제약이 많기에 테이블표를 보고 잘 변경해야하고,
[System.Serializable]을 통해 데이터들을 한번에 관리 할 수 있다.

 

 Application.PersistentDataPath를 사용하면, Unity에서 파일 경로를 생성해주고,

윈도우나 맥의 개발 환경에 따라 파일을 알아서 생성해준다.

 

이를 통해 파일을 저장하고, 해당 파일을 역직렬화하면

파일을 사용할 수 있게 되는 것이다.

 

그리고 빌드를 하고, 해당 값을 바꾸어 치트? 모드? 같은 그런 크랙을 사용할 수 있기에

암호화 및 복호화가 필수가 된다.


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

 

발판 만들때, 플레이어가 발판 위에 올라가도 작동을 안했고, 또 발판을 뚫고,, 마지막으로 발판이 안돌아오는 이슈가 있었다.


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

새 팀 프로젝트가 시작 될텐데, 업무 분담을 잘 하여, 잘 해나가야겠다.

 

'TIL' 카테고리의 다른 글

25.03.20 TIL  (0) 2025.03.20
25.03.13 TIL  (0) 2025.03.13
25.03.10 TIL  (0) 2025.03.10
25.03.06 TIL  (0) 2025.03.06
25.03.04 TIL  (0) 2025.03.04