카테고리 없음

내일배움캠프 34일차 TIL 유니티 3D 팀프로젝트 - Zomvid 19(1)

joseph2518 2024. 10. 31. 21:52

20241031 / Unity_6차  8주차 목요일

 

 

이번 팀프로젝트도 3중1택이 되었다.

 

러닝액션, 퍼즐 플랫폼, 서바이벌(전부 3D로 해야 함)

 

우리 조는 의기투합하여 생존 서바이벌을 하기로 했다.

 

아무래도 강의 내용도 서바이벌이었다 보니 다들 뭔가 더 하고 싶은 욕심이 들었던 것 같다.

 

나는 맵과 맵상의 자원 및 건축에 관한 역할을 받았는데,

건축에 가장 시간을 써야할 것 같지만 지금 맵 만드는 것부터 익숙지 않다.

 

성능 생각 안하고 잔뜩 깔아 두면 있어보이게 만들 수 있다

 

terrain에서 생성할 수 있는 tree는 성능 문제로 상호작용이 불가능하다.

 

그런데 나는 이 나무들을 전부 캘 수 있게 만들고 싶었다.

 

이 생성 패턴만 가져다 쓰기 위해 terrain tree를 상호작용 가능한 오브젝트로 바꿔치는 방법을 찾았다.

 

public class TerrainScript : MonoBehaviour
{
    public Terrain terrain;               // 나무가 배치된 Terrain
    public GameObject treePrefab;         // 상호작용 가능한 나무 프리팹
    public Transform parentObject;        // 부모 오브젝트

    void Start()
    {
        ConvertTreesToGameObjects();
    }

    void ConvertTreesToGameObjects()
    {
        TerrainData terrainData = terrain.terrainData;
        TreeInstance[] trees = terrainData.treeInstances;
        
        foreach (TreeInstance tree in trees)
        {
            // Terrain 좌표를 월드 좌표로 변환
            Vector3 worldPosition = Vector3.Scale(tree.position, terrainData.size) + terrain.transform.position;

            // 나무의 크기와 회전 설정
            GameObject treeObject = Instantiate(treePrefab, worldPosition, Quaternion.identity);
            treeObject.transform.localScale = new Vector3(tree.widthScale, tree.heightScale, tree.widthScale);

            // 회전 적용
            float rotationAngle = tree.rotation * Mathf.Rad2Deg;
            treeObject.transform.Rotate(0, rotationAngle, 0);

            // 부모 적용
            treeObject.transform.parent = parentObject;
        }

        // Terrain에서 나무 제거
        terrainData.treeInstances = new TreeInstance[0];
    }
}

 

terrain tree는 정적 데이터기 때문에 위 함수를 반 번 돌리면 에디터 상에 있는 tree들까지 다 날아간다.

 

대신 인게임에서 생성된 오브젝트들을 통째로 프리팹으로 만들어 두면

이후에는 terrain tree 대신 이 오브젝트들을 쓰는 것이다.

 

10000개를 넣으려니까 렉이 좀 걸린다