뱀파이어 서바이벌 류에서 몬스터가 벽주변에서 생성되는 것을 보고 어떻게 저렇게 했을까? 생각하며 코드를 구현해 보았다

코드 상에는 왼쪽벽을 기준으로만 위치를 잡고 생성되게 해놨다.
만약 상하좌우 모두 고려하고싶다면 Random을 통해 선택한 후, 영역에따라 코드를 다르게 지정해야한다.
public class CalcPosition : MonoBehaviour
{
//LT,RT,LB,RB를 가진 부모오브젝트와 생성할 오브젝트 설정
[SerializeField] GameObject positionParent;
[SerializeField] GameObject _ballPrefab;
[SerializeField] float distance = 1.0f;
//좌표 저장용
List<GameObject> posList = new List<GameObject>();
float[] posInfo = new float[4];
private void Awake()
{
SetChildrunInfo();
SetPosition();
}
private void Start()
{
InstantBallForLeft();
}
private void SetChildrunInfo()
{
//자식을 posList에 넣음
for (int i = 0; i < positionParent.transform.childCount; i++)
{
posList.Add(positionParent.transform.GetChild(i).gameObject);
}
}
private void SetPosition()
{
//min max x,z값 계산
float minX = posList[0].transform.position.x;
float maxX = posList[0].transform.position.x;
float minZ = posList[0].transform.position.z;
float maxZ = posList[0].transform.position.z;
//좌표 저장
for (int i = 0; i < posList.Count; i++)
{
if (minX > posList[i].transform.position.x) minX = posList[i].transform.position.x;
if (maxX < posList[i].transform.position.x) maxX = posList[i].transform.position.x;
if (minZ > posList[i].transform.position.x) minZ = posList[i].transform.position.z;
if (maxZ < posList[i].transform.position.x) maxZ = posList[i].transform.position.z;
}
//좌표로 저장
posInfo[0] = minX;
posInfo[1] = minZ;
posInfo[2] = maxX;
posInfo[3] = maxZ;
}
private void InstantBallForLeft()
{
//왼쪽방향에서 공이 선택된다고 가정
float x = posInfo[0] + distance;
float z = Random.Range(posInfo[1], posInfo[3] + 1);
Vector3 vec = new Vector3(x, 0, z);
Instantiate(_ballPrefab, vec, _ballPrefab.transform.rotation);
}
}
좌표(SpawnPosition)의 자식설정 | Hierarchy 구조 |
|---|