본문 바로가기
제출용/TIL

내일배움캠프 38일차 TIL + 거울 포탈 (인 척)

by 유린테 2024. 6. 10.

팀프로젝트에서 퍼즐 게임을 주제로 방탈출 느낌의 게임을 만들고 있는데

선택 구현에 포탈구현이 있길래 비슷하게 한번 도전해봤다.

 

약간의 미스테리 컨셉을 주고 싶었는데 

마침 내가 맡은 방 에셋으로 거울이 있길래 거울을 이용해서 포탈을 만들어 보기로 했다.

 

일단 방 구조를 바꿔주었다!

딱 들어왔을 때 조금은 괴기스러운? 분위기를 주고 싶어서 넓은 방에 아무것도 없이 거울과 그림만 있게 수정해주었다.

 

진행 방식은 거울을 누르면 포탈을 타지는 것 처럼 이동이 되게 하고,

진짜 거울이 아닌 다른 거울을 누르면 계속해서 거울방을 빙빙 돌게 만들었다.

진짜 거울 밑에는 안빤양말뭉치(..) 가 놓여있어 양말뭉치를 따라가면 이 방의 최종 목적인 컴퓨터에 도달할 수 있다.

<왼> 바꾸기 전 / <오> 바꾼 후

 

 

거울을 눌렀을 때 한 플레이어 위치를 순간이동 시키는게 아니라,

플레이어를 방마다 두고 거울을 누르면 해당 플레이어로 전환되게 작업하였다!

>> 이 방법이 좀 더 깔끔하고, 유지보수가 간단했다

 

PlayerSwitcher 라는 스크립트를 작성해주었다.

public class PlayerSwitcher : MonoBehaviour
{
    public GameObject[] players;  // 플레이어 오브젝트 배열
    public Transform[] spawnLocations;  // 각 플레이어의 스폰 위치 배열

    private int currentPlayerIndex = 0;

    private Vector3[] initialPositions; // 각 플레이어의 초기 위치 배열

    void Start()
    {
        // 초기 위치 저장
        initialPositions = new Vector3[players.Length];
        for (int i = 0; i < players.Length; i++)
        {
            initialPositions[i] = players[i].transform.position;
            players[i].SetActive(i == currentPlayerIndex);  // 초기에는 첫 번째 플레이어만 활성화
        }
    }

    public void SwitchPlayer(int playerIndex)
    {
        // 현재 활성화된 플레이어 비활성화
        players[currentPlayerIndex].SetActive(false);

        // 새로운 플레이어 인덱스로 전환
        currentPlayerIndex = playerIndex;

        // 새로운 플레이어를 초기 스폰 위치로 이동시키고 활성화
        players[currentPlayerIndex].transform.position = spawnLocations[currentPlayerIndex].position;
        players[currentPlayerIndex].SetActive(true);

        // Player_Modify를 제외한 나머지 플레이어의 위치 초기화
        for (int i = 1; i < players.Length; i++) // Player_Modify는 0번째 인덱스
        {
            if (i != currentPlayerIndex)
            {
                players[i].transform.position = initialPositions[i];
            }
        }
    }
}

 

플레이어를 전환시키기 위해 PlayerSwticher 를 빈 오브젝트로 만들어주고,

거기에 PlayerSwitcher 스크립트를 이어준다.

이렇게 하면 플레이어를 인덱스 처리해서 0,1,2,3,... 이런식으로 지정해놓고 쓸 수 있다.

 

PlayerSwitcher 스크립트에서 이렇게 사용할 플레이어와 각각의 위치값을 넣어주면 된다.

>> Element 옆에 있는 숫자가 이동할 인덱스가 된다.

 

거울에 아이템 오브젝트 등등을 넣어줘서 커서를 가까이 가져다대면 거울이라는 정보가 뜨게 했고,

포탈에 사용된 스크립트는 Mirror 이다

 

public class Mirror : MonoBehaviour
{
    public PlayerSwitcher playerSwitcher;
    public int playerIndex;  // 전환할 플레이어 인덱스

    void OnMouseDown()
    {
        playerSwitcher.SwitchPlayer(playerIndex);
    }
}

 

거울을 클릭했을 때, 플레이어가 내가 지정해놓은 인덱스의 플레이어로 전환되게 만들었다.

 

 

Mirror 스크립트를 각 거울 오브젝트에 붙여주면 각 거울 오브젝트마다 플레이어 인덱스를 선택할 수 있는데,

그 거울을 누르면 어떤 플레이어로 이동할 것인지를 정해주는 것이다.

 

>> 이렇게 해주면 거울을 누르면 해당 플레이어로 전환되며 포탈처럼 사용할 수 있다!

 

 

헤헤 그래도 꽤나 거울미로 같은 느낌이죠?

유사 포탈 만들기 . 재밌었다