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 대신 이 오브젝트들을 쓰는 것이다.