본문 바로가기

Photon

Photon 여덟째 날(Password 생성, SpawnPoint 생성, 턴 형식 만들기)

목차


비밀번호 생성하기

알고리즘

포톤에는 비밀번호 기능이 따로 없어서 하나의 아이디어를 쓴다고 함!

 

=> 방장이 방 생성하는 과정에서, 방 이름을 (방 이름+비밀번호)로  해서 만든다.

=> 하지만 생성된 목록에는 (방 이름)만 뜨게 한다.

=> 방에 입장하고 싶은 사람은 그 버튼을 눌러본다

=> 하지만 입장 되지 않는다. 보이는건 방 이름 뿐이지만, (방 이름+비밀번호) 로 만들었기 때문에

=> 진짜 방이름은 (방 이름+비밀번호) 이다.

 

 

즉, 사실은 방 이름(방 이름 + 비밀번호 )으로만 입장하는거지만

방 이름과 비밀번호 까지 둘 다 쳐서 들어가야하는것 같이 느껴지는 원리 이다.

 

 

 

LobbyManager.cs ---->

inputPassword 하나 생성

hashTable 을 통해 room_name 정보와, password 를 추가

PhotonNetwork.CreateRoom 에 방 이름과 방 비밀번호를 같이 해서 입력하자

(방 이름 + 비밀번호) 가 방 이름인 방을 만들겠다는 말이다!

 

ex) 방 이름 = 들어와, 비밀번호 = 123 입력하면,

만드는 방 이름 => 들어와123

 

 

이거 하나 만들어줌. 복붙해서

방이름 InputField 복붙해서 Password InputField 하나 더 만들어 준다.

InputPassword InputFlied 클릭해서,

ContentType 에 integerNumber 를 선택해서 숫자만 나오게 하자

Assign 까지 하자!

LobbyManager.cs 에 드래그 앤 드랍 하자


방 이름에 room_name 만 나오게 하기

 

근데 이렇게 하게 되면, 그냥 당연히

방 목록에 방 이름에 (방 이름 +방 비번)까지 보이게 됨

이렇게 만들었었기 때문에.

 

RoomItem.cs 에서

이렇게 첫 매개변수를, 커스텀 (room_name) 으로 바꾸자.

정보를 설정 할 때, 방 이름을 (room_name + password) 이 아닌 room_name 으로만 할거니까!

 

근데 이렇게 하고 실행 하면, 이름이 안나오네,,?

설정을 해줘야 하는게 있음

 

LobbyManager.cs --->

CreateRoom() ->

 키 값을 추가 해준다.

위처럼 추가한 키값을 여기에 넣어줘야 함

 

그리고 LobbyManager.cs 에

JoinRoom 할 때도 RoomName 과 inputPassword 와 같이 합쳐져서 들어가게 한다.


이제 이렇게 하면,

 

방 이름 : 들어와

방 비번: 123 

 

이렇게 하면

 

방 이름 (들어와) 으로만 방이 생성된다.

하지만, 이제 누군가가 생성된 방에 들어 갈 때 방이름만 넣고 들어가게되면

들어가지 못하게 된다.

 

방 비번까지 넣고 들어가야 하기 때문에


소환하는 위치 다양하게 만들기

 

소환 될 때, 여기 위치에 소환되게.

 

 

처음에 들어간 PhotonView 의 View ID 는 1000번 째임

1001번이 만든 총알은 1002번이 됨

 

두번째에 들어간 애는 2000번째

이렇게 해버리면 자동으로 View ID 가 잡힘

 

모든 피씨가 방장이 GameManager 를 Instantiate 한거로 인식함


(참고) 누가 방에 입장했을 때, 누가 왔는지 뜨게 하는 방법

GameManager.cs------>

에서 MonoBehaviourPunCallbacks 로 바꾸고,

 

이런 것도 있음

   // 방에 플레이어가 참여 했을 때 호출해주는 함수
    public override void OnPlayerEnteredRoom(Player newPlayer)
    {
        base.OnPlayerEnteredRoom(newPlayer);
        print(newPlayer.NickName + "님이 방에 들어왔습니다.");
    }

 


미션

인원수만큼 360 도에서 나눈 후, 5만큼 떨어진

그 지점을 구하기

 

 

GameManager.cs ---->

 

게임매니져 Start 부분에서, 

위처럼 작성하면, 피자 같이 만들 수 있다.

 

위에서 spawnPos = new Vector3[4] 라고 해둔건, 플레이할 때 예시로 만든건데

원래는 maxPlayer 로 해두면 됨.

 

 


턴 제 만들기

 

게임에 들어가서, MaxPlayer 가 다 들어오면 총 쏘게 하는것도 많음 게임중에.

 

이번에 턴제로 하는 룰을 만들어 보자

내 턴이 아니면, return 되게

 

PlayerFire.cs ---->

내 턴인지 확인 하는 bool 형 코드를 작성

 

 

GamaManager 에 PhotonView 추가 하자.

 

GameManager.cs----> 

 

player 가 들어오면 들어온 player의 photonView 를 담는다.

 

GameManager 를 Singleton 으로 만들자

방장이 직접 중앙에서 관리하는 GameManager 가 되는거임

싱글톤으로 만들기
PlayerMove.cs

PlayerMove 에서 photonView 를 GameManager 한테 주는거임.

중앙에서 관리하려고

턴 돌아가는건 방장 PC 에서만 하고 그걸 그냥 다 알려주는거임

GamaManager 에서 일 처리되는건 A의 PC 에서만 되는거임.

다른 PC인 B, C 에서는 방장인 A가 처리해서 알려주는 것뿐 

 

방장이 없다면?

방장은 없을 수가 없음, 방장이 나가면 방장이 넘겨지기 때문

 

 GameManager.cs 로 와서

GameManager.cs

방장이 아니면 함수를 나가게 한다.

 

방장이면,

이전 차례였던 애는 총을 쏘지 못하게 한다.

 

그 후, 아까 players 리스트에 넣어놓았던 player 를 부른다.

그리고, 리스트 수만큼 turnIdx 가 다 차고 나면

그 다음 리스트는 없으니까 % 값으로 해서

다시 1번부터 되게 해놓은거임!

 

 

저기 RPC 에 " " 된 곳은  SetMyTurn 을 넣을거임

 

아까 PlayerFire 에서 만든 함수.

bool isMyTurn 을 키고 끄는 함수임

 

참고로, PlayerFire.cs 에 isMyTurn 이 false 이면 Update() 에서 return 되게 시켜놨음

PlayerFIre.cs

이거 PunRPC 해주기

 

PlayerFire.cs

이것도 PunRPC 해주기

 

왼쪽 컨트롤키 누르면, 방장한테만 Change 되게 해준거임!

 

 

방장 => 그 다음 들어온 사람 =>  그 다음 들어온 사람 => ... => 마지막 인원

 

이 순으로, 한 발씩 발사하면 Change() 함수가 불리게 되는데,

이 함수는 불리게 되면 다음 사람이 쏠 수 있게 해주는거다.

 

근데 저길 보면 RpcTarget.MasterClient 한테만 가게 되어있다.

 

턴을 각자가 돌리면 엄청 힘들기 때문에

하지만, 한명이 돌리게 한거임