미로게임4 (22.6.7)
맵을 확장하고 트리거를 새로 심기로 하겠다. 제목이 미로게임인데 나름 미로같이 생기긴 해야겠으니 미로처럼 길을 내거나 하겠다.
근데 생각해보니까 이게 게임이려면 시작과 끝이 있어야한다. 목적은 이제부터 생각하면 된다. 맵 바깥에 탈출구를 마련하기 보다 그냥 가운데에 도달하면 깨지도록 하겠다.


만들었다. 뭔가 좀 어색해보이지만... 뭐.. 괜찮겠지. 이제 트리거를 심도록 한다. 트리거를 심는 기준은 막다른 곳, 갈림길이 있는 곳이다. 생각을 안하고 맵을 만들어서 오히려 적게 심을수도 있다.
원래 있던 트리거는 지우고 새로 해준다. 생각해보니까 그냥 트리거 설정했으면 되는게 아닐까..

All Trigger를 복사해서 디폴트로 하나 만들었다.
생각해보니까 그 때는 9개만 만들었는데 지금 보니까 오른쪽 방향으로 가야하는게 있다. 이게 무슨 말이냐 하면 만들어야했던 트리거가 많았으니 차라리 디폴트 트리거 하나를 만들어서 체크하는게 나았을것같기도...
방금 배치해봤는데 확실히 방향 표시되있는걸로 배치하는게 편하긴 하다. 디폴트를 UDRL 트리거로 분리해 4개를 더 만들었다.

배치하는 동안 트리거 배치가 애매한 부분은 실시간으로 수정당했다.
모두 배치하고 실행시켰는데 유니티가 멈췄다. 이것이 무슨 말이냐 하면 다시 처음부터 배치해야한다는 것이다...

전부 배치했는데 이거 실행하면 또 멈춘다. 혹시 갯수의 문제인가 싶어서 세개만 놓고 돌렸는데도 멈춘다.
갯수가 문제가 아니면 대체 뭐가 문제인걸까.. 검색해보니 while 무한반복문을 쓰면 버그가 생긴다고 한다. 게임이 다운되지는 않지만 스택 오버플로가 일어난다. 특이하게도 플레이어가 아닌 트리거쪽이 오버플로가 일어난다고 하는데..
public void RandomDir(bool rotateUp, bool rotateRight, bool rotateDown, bool rotateLeft)
{
//bool returnRand;
//int randir;
//while (true)
{
bool returnRand = true;//다시 섞어야함
int randir = Random.Range(0, 360);
if (randir < 90)//up
{
if (rotateUp)
{
returnRand = false;
nextDir = (int)dir.Up;
}
}
else if (randir < 180)//right
{
if (rotateRight)
{
returnRand = false;
nextDir = (int)dir.Right;
}
}
else if (randir < 270)//down
{
if (rotateDown)
{
returnRand = false;
nextDir = (int)dir.Down;
}
}
else//left
{
if (rotateLeft)
{
returnRand = false;
nextDir = (int)dir.Left;
}
}
if (!NewDir() || returnRand == true)
{
Debug.Log("재선택");
//방향이 정 반대거나 유효하지 않은 방향일 때 다시 돌린다.
RandomDir(rotateUp, rotateRight, rotateDown, rotateLeft);
}
else if (NewDir() && !returnRand)
{
//break;
}
}
switch (nextDir)
{
case (int)dir.Up:
Debug.Log("선택된 방향 : 위");
break;
case (int)dir.Right:
Debug.Log("선택된 방향 : 오른쪽");
break;
case (int)dir.Down:
Debug.Log("선택된 방향 : 아래");
break;
case (int)dir.Left:
Debug.Log("선택된 방향 : 왼쪽");
break;
}
ChangeDir();
}
}
해결했다.
자꾸 한 방향으로 가는 것이 오류가 나서 생각해보니 바로 전 단계에 이전 방향을 방지했기 때문에 일어난 오류였다.
//한 방향으로 이동
public void DirectDir(bool rotateUp, bool rotateRight, bool rotateDown, bool rotateLeft)
{
Debug.Log("한 방향");
if(rotateUp)
{
nextDir = (int)dir.Up;
}
else if (rotateRight)
{
nextDir = (int)dir.Right;
}
else if (rotateDown)
{
nextDir = (int)dir.Down;
}
else if (rotateLeft)
{
nextDir = (int)dir.Left;
}
//방향 갱신.
prevDir = curDir;
curDir = nextDir;
ChangeDir();
}
PlayerBehaviour에 한 방향으로 이동할 때를 대비한 함수를 심어줬다. 이전 방향을 체크할 필요가 없으므로 바로 방향 갱신을 넣었다. 이것을 판별하는 것은 트리거의 OnTriggerEnter에서 하기로 했다.
//방향 선택
public bool rotateUp;
public bool rotateDown;
public bool rotateRight;
public bool rotateLeft;
int direcrtRotate = 0;
// Start is called before the first frame update
void Start()
{
if (rotateUp)
{
direcrtRotate += 1;
}
if (rotateRight)
{
direcrtRotate += 1;
}
if (rotateDown)
{
direcrtRotate += 1;
}
if (rotateLeft)
{
direcrtRotate += 1;
}
}
private void OnTriggerEnter(Collider other)
{
PlayerBehaviour pb = other.gameObject.GetComponent<PlayerBehaviour>();
if (pb)
{
if(direcrtRotate == 1)
{
pb.DirectDir(rotateUp, rotateRight, rotateDown, rotateLeft);
}
else
pb.RandomDir(rotateUp, rotateRight, rotateDown, rotateLeft);
}
}
Start 함수에 현재 로테이션을 체크하고 한 방향인지 체크하기 위해 int형에 1을 더해줬다. 여기서 한 방향이면 결과가 1이 나올 것이다. 나온 값으로 판별해 한 방향이면 direct, 아니면 randomdir로 보낸다.
다음은 가운데에 들어가면 게임이 끝나도록 만들것이다. 게임 목적은... 얼마나 빠르게 들어가나?