TIL(2024,07,29)최종 프로젝트 1차구현 하나씩 만들기

김보근·2024년 7월 29일

Unity

목록 보기
54/113
post-thumbnail

TIL (Today I Learned)

클래스 개요

WorldTree 클래스는 Unity 프로젝트에서 게임 오브젝트를 관리하며, 레벨에 따라 나무 프리팹의 외형을 변경하고 카메라 시야를 조정하는 역할을 합니다.

주요 변경 사항
프리팹 변경 로직 추가

특정 레벨에 도달하면 나무 프리팹이 변경되도록 수정하였습니다.
7개의 프리팹이 순차적으로 사용되며, 레벨이 일정 수준에 도달할 때마다 새로운 프리팹으로 변경됩니다.
스케일 변경 로직 추가

각 프리팹은 레벨에 따라 일정한 규칙으로 스케일이 변경됩니다.
첫 번째 프리팹은 레벨 0에서 시작하여 90레벨까지 10레벨마다 스케일이 0.2씩 증가합니다.
두 번째 프리팹은 레벨 100에서 시작하여 140레벨까지 10레벨마다 스케일이 0.1씩 증가합니다.
세 번째 프리팹은 레벨 150에서 시작하여 190레벨까지 10레벨마다 스케일이 0.1씩 증가합니다.
네 번째 프리팹은 레벨 200에서 시작하여 280레벨까지 10레벨마다 스케일이 0.1씩 증가합니다.
다섯 번째 프리팹은 레벨 300에서 시작하여 380레벨까지 10레벨마다 스케일이 0.1씩 증가합니다.
여섯 번째 프리팹은 레벨 400에서 시작하여 480레벨까지 10레벨마다 스케일이 0.1씩 증가합니다.
일곱 번째 프리팹은 레벨 500에서 시작하여 스케일이 2로 고정됩니다.

using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class WorldTree : MonoBehaviour
{
    public GameObject outsideTreeObject; // 3D 오브젝트
    public TextMeshProUGUI upgradeRequirementText;
    public MeshFilter groundMeshFilter; // 3D 오브젝트
    public GameObject[] treePrefabs; // 3D 모델 배열

    private GameObject currentTreeInstance; // 현재 인스턴스화된 트리 프리팹
    public Camera mainCamera;
    public CameraTransition cameraTransition;

    public float initialFOV = 60f; // 초기 FOV 값
    public float FOVIncrement = 2f; // 나무의 외형이 바뀔 때마다 증가할 FOV 값
    public float maxFOV = 120f; // 최대 FOV 값    
    public float positionIncrement = 0.3f;

    private Vector3 positionOffset = Vector3.zero;
    private float fovOffset = 0f;

    private void Start()
    {
        UpdateTreeMeshes(0);
    }

    public void UpdateTreeMeshes(int currentLevel)
    {
        int currentIndex = GetTreePrefabIndex(currentLevel);

        if (currentTreeInstance == null || currentTreeInstance.name != treePrefabs[currentIndex].name)
        {
            // 현재 트리 프리팹이 존재하면 제거
            if (currentTreeInstance != null)
            {
                Destroy(currentTreeInstance);
            }

            // 새로운 트리 프리팹 인스턴스화
            currentTreeInstance = Instantiate(treePrefabs[currentIndex], outsideTreeObject.transform.position, Quaternion.identity);
            currentTreeInstance.transform.SetParent(outsideTreeObject.transform);
            currentTreeInstance.name = treePrefabs[currentIndex].name; // 이름 설정
        }

        UpdateTreeScale(currentLevel);

        if (currentLevel % 5 == 0 && currentLevel != 0)
        {
            IncrementCameraFOV();
            MoveCameraBackwards();
        }
    }

    private int GetTreePrefabIndex(int currentLevel)
    {
        if (currentLevel >= 500) return 6;
        if (currentLevel >= 400) return 5;
        if (currentLevel >= 300) return 4;
        if (currentLevel >= 200) return 3;
        if (currentLevel >= 150) return 2;
        if (currentLevel >= 100) return 1;
        return 0;
    }

    private void UpdateTreeScale(int currentLevel)
    {
        Vector3 newScale = Vector3.one;

        if (currentLevel < 100)
        {
            newScale = Vector3.one + Vector3.one * (currentLevel / 10) * 0.2f;
        }
        else if (currentLevel < 150)
        {
            newScale = Vector3.one * 0.3f + Vector3.one * ((currentLevel - 100) / 10) * 0.1f;
        }
        else if (currentLevel < 200)
        {
            newScale = Vector3.one * 0.8f + Vector3.one * ((currentLevel - 150) / 10) * 0.1f;
        }
        else if (currentLevel < 220)
        {
            newScale = Vector3.one * 0.9f;
        }
        else if (currentLevel < 240)
        {
            newScale = Vector3.one * 0.9f + Vector3.one * ((currentLevel - 220) / 10) * 0.1f;
        }
        else if (currentLevel < 280)
        {
            newScale = Vector3.one * 1.1f + Vector3.one * ((currentLevel - 240) / 10) * 0.1f;
        }
        else if (currentLevel < 300)
        {
            newScale = Vector3.one * 1.4f;
        }
        else if (currentLevel < 380)
        {
            newScale = Vector3.one * 1.4f + Vector3.one * ((currentLevel - 300) / 10) * 0.1f;
        }
        else if (currentLevel < 400)
        {
            newScale = Vector3.one * 1.5f;
        }
        else if (currentLevel < 480)
        {
            newScale = Vector3.one * 1.5f + Vector3.one * ((currentLevel - 400) / 10) * 0.1f;
        }
        else if (currentLevel < 500)
        {
            newScale = Vector3.one * 2f;
        }
        else if (currentLevel >= 500)
        {
            newScale = Vector3.one * 2f;
        }

        currentTreeInstance.transform.localScale = newScale;
    }

    private void IncrementCameraFOV()
    {
        if (mainCamera != null)
        {
            float newFOV = mainCamera.fieldOfView + FOVIncrement;
            mainCamera.fieldOfView = Mathf.Min(newFOV, maxFOV); // 최대 FOV를 넘지 않도록 제한
            fovOffset += FOVIncrement;
            UpdateCameraTransition();
        }
    }

    private void MoveCameraBackwards()
    {
        if (mainCamera != null)
        {
            Vector3 newPosition = mainCamera.transform.position - mainCamera.transform.forward * positionIncrement;
            mainCamera.transform.position = newPosition;
            positionOffset -= mainCamera.transform.forward * positionIncrement;
            UpdateCameraTransition();
        }
    }

    private void UpdateCameraTransition()
    {
        if (cameraTransition != null)
        {
            cameraTransition.UpdateCameraState(mainCamera.fieldOfView, mainCamera.transform.position);
        }
    }

    public Vector3 GetPositionOffset()
    {
        return positionOffset;
    }

    public float GetFovOffset()
    {
        return fovOffset;
    }
}

결론

WorldTree 클래스는 각 레벨에 따라 나무 프리팹과 스케일을 다음과 같이 변경합니다:

첫 번째 프리팹:

레벨 0: 스케일 1, 1, 1
레벨 10~90: 10레벨마다 0.2씩 증가하여 레벨 90에서 스케일 2, 2, 2
두 번째 프리팹:

레벨 100: 스케일 0.3, 0.3, 0.3
레벨 110~140: 10레벨마다 0.1씩 증가하여 레벨 140에서 스케일 0.7, 0.7, 0.7
세 번째 프리팹:

레벨 150: 스케일 0.8, 0.8, 0.8
레벨 160~190: 10레벨마다 0.1씩 증가하여 레벨 190에서 스케일 1.2, 1.2, 1.2
네 번째 프리팹:

레벨 200: 스케일 0.9, 0.9, 0.9
레벨 220~280: 10레벨마다 0.1씩 증가하여 레벨 280에서 스케일 1.6, 1.6, 1.6
다섯 번째 프리팹:

레벨 300: 스케일 1.4, 1.4, 1.4
레벨 310~380: 10레벨마다 0.1씩 증가하여 레벨 380에서 스케일 2.2, 2.2, 2.2
여섯 번째 프리팹:

레벨 400: 스케일 1.5, 1.5, 1.5
레벨 410~480: 10레벨마다 0.1씩 증가하여 레벨 480에서 스케일 2.3, 2.3, 2.3
일곱 번째 프리팹:

레벨 500: 스케일 2.0, 2.0, 2.0 (고정)

profile
게임개발자꿈나무

0개의 댓글