프로젝트 진행중 3x3무한맵 제작에 들어갔다
아래는 맵제작에 작성한 코드이다.
public class MapController : MonoBehaviour
{
public GameObject MapPrefab;
private List<GameObject> currentMaps = new List<GameObject>();
private List<Vector3> currentMapPos;
public Action ChangeMap;
public Vector3 playerMapPosition = Vector3.zero;
private void Init()
{
// 초반 맵 생성
currentMapPos = new List<Vector3>()
{
playerMapPosition,
playerMapPosition + Vector3.forward*16f,
playerMapPosition + Vector3.back*16f,
playerMapPosition + Vector3.right*16f,
playerMapPosition + Vector3.left*16f,
playerMapPosition + new Vector3(1,0,1)*16f,
playerMapPosition + new Vector3(-1,0,1)*16f,
playerMapPosition + new Vector3(1,0,-1)*16f,
playerMapPosition + new Vector3(-1,0,-1)*16f
};
foreach (var map in currentMapPos)
{
currentMaps.Add(Instantiate(MapPrefab, map, Quaternion.identity));
}
//액션에 추가
ChangeMap += ChangeMaps;
}
private void Start()
{
Init();
}
private void ChangeMaps()
{
// 바뀌고 난 후 맵위치
currentMapPos = new List<Vector3>()
{
playerMapPosition,
playerMapPosition + Vector3.forward*16f,
playerMapPosition + Vector3.back*16f,
playerMapPosition + Vector3.right*16f,
playerMapPosition + Vector3.left*16f,
playerMapPosition + new Vector3(1,0,1)*16f,
playerMapPosition + new Vector3(-1,0,1)*16f,
playerMapPosition + new Vector3(1,0,-1)*16f,
playerMapPosition + new Vector3(-1,0,-1)*16f
};
// 현재 저장된 위치와 생성된 맵 위치가 다른 vector3들을 리스트에 넣음
List<Vector3> changePos = currentMapPos.Except(currentMaps.Select(x => x.transform.position)).ToList();
// 생성된 맵의 오브젝트의 위치와 현재위치 Vector와 다른 오브젝트들을 리스트에 넣음
List<GameObject> changeMap = currentMaps.Where(obj => !currentMapPos.Contains(obj.transform.position)).ToList();
// 생성된 맵의 위치 이동
for (int i = 0; i < changeMap.Count; i++)
{
if(changeMap.Count > i)
changeMap[i].transform.position = changePos[i];
}
}
}
Except로 두개의 차집합 즉 겹치지 않는 것들을 뽑아냄
Contains로 포함된 것들을 뽑아내고 !로 아닌것들을 가져옴 즉 포함되지 않은것들을 가져옴
public class MapInfo : MonoBehaviour
{
public MapController controller;
public LayerMask playerLayer;
private void Awake()
{
controller = FindObjectOfType<MapController>();
}
private void OnCollisionEnter(Collision collision)
{
Debug.Log("충돌");
if (collision.gameObject.CompareTag("Player"))
{
controller.playerMapPosition = this.transform.position;
controller.ChangeMap?.Invoke();
}
}
}
코드는 이렇게 되고 어떻게 돌아가냐면 플레이어가 다른 맵에 충돌이 나면 그맵의 위치를 MapController에 위치정보를 전달하고 changeMap액션 실행한다.
ChangeMap이 실행되면 그안에 있는 changeMaps의 메서드를 실행해서 플레이어 위치에 맞게 맵을 이동시켜준다.
위와 같이 생성되고 플레이어가 이동시에 멀어진 맵이 이동해서 계속해서 이동할 수 있게 된다.
FSM을 기반으로 몬스터의 상태에 따른 이동을 구현하려고 한다. 여러 블로그나 글을 참고해서 작성을 하고 있고
위와같이 스크립트를 작성했다.
그리고 여러 블로그의 글의 코드들을 분석중 타입 T에 대해 나왔는데 좀 찾아보니
1. 제네릭 타입 T는 클래스, 인터페이스, 메서드 등을 정의할 때 사용되는 타입 매개변수
2. 코드 작성 시점에 구체적인 타입을 지정하지 않고, 사용시점에 타입을 결정
3. 코드 재사용성, 타입의 안정성, 성능 향상
제네릭 타입 T를 사용하면 코드의 유연성과 재사용성을 높이고, 타입 안정성을 보장하면서도 다양한 데이터 타입을 효율적으로 다룰 수 있다.
이것을 이용해서 몬스터 이동을 구현해볼까 한다.
'개발 TIL' 카테고리의 다른 글
내일배움캠프TIL 48일차 트러블 슈팅 (0) | 2025.04.01 |
---|---|
내일배움캠프TIL 47일차 트러블 슈팅 (0) | 2025.03.31 |
내일배움캠프TIL 45일차 프로젝트 세팅 (0) | 2025.03.27 |
내일배움캠프TIL 44일차 배운내용 (0) | 2025.03.26 |
내일배움캠프 43일차 TIL 배운내용 정리 (0) | 2025.03.25 |