빌드하여 클라이언트 2개 실행하여 테스트해봄.

2개 색상이 다른 이유는 에디터에서는 조명이 Bake가 안되서..



문제점

1. 씬이 바뀌면 UI가 사라짐.

→ UI를 생성하는 부분이 PlayerManager의 Start() 부분에 있는데 해당 오브젝트는 DontDestroyOnLoad로 선언하여

한번 생성 후 다시 Start()가 불리는 일이 없음.

즉 씬이 바뀔때마다 UI를 새로 생성해줘야 함.


2. 유저가 나가면 더 작은 필드의 씬으로 전환되면서 바닥이 없어지는 경우가 있는데

→ 이 경우 시작점으로 돌아가야하지만 그렇지않고 바닥으로 계속 떨어짐


※ 1,2 동시해결 ※

GameManager에 있던 OnLevelWasLoaded 함수를 PlayerManager로 옮김.

1
2
3
4
if (!Physics.Raycast(transform.position, -Vector3.up, 5f))
{
    transform.position = new Vector3(0f, 5f, 0f);
}
cs

이 부분이 캐릭터의 위치에서 바닥으로 ray를 쏴서 아무것도 맞지않으면 캐릭터를 시작점 (0, 5, 0)으로 옮기겠다는건데

생각해보니 GameManager에 있을 이유가 없음. PlayerManager에 있어야될것 같아서 옮겨주니 2번 문제해결.


이후 UI 생성 부분을 복사하여 OnLevelWasLoaded 함수에 추가시켜줌.

해당 함수는 씬이 변경될때 호출됨으로 씬이 변경되면 UI가 자동으로 생성되게 됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void OnLevelWasLoaded(int level)
{
    if (!Physics.Raycast(transform.position, -Vector3.up, 5f))
    {
        transform.position = new Vector3(0f, 5f, 0f);
    }
 
    if (PlayerUiPrefab != null)
    {
        GameObject _uiGo = Instantiate(PlayerUiPrefab) as GameObject;
        _uiGo.SendMessage("SetTarget"this, SendMessageOptions.RequireReceiver);
    }
    else
    {
        Debug.LogWarning("<Color=Red><a>Missing</a></Color> PlayerUiPrefab reference on player Prefab."this);
    }
}
cs

이제 화면 밖에 있으면 시작점 (0, 5, 0)으로 이동하여 잘 떨어짐.




3. 이동과 애니메이션은 동기화되지만 레이저발사는 동기화되지않음.

→ 레이저 발사는 PlayerManager의 OnPhotonSerializeView라는 함수에서 데이터를 주고 받아서 체크하는데

디버깅 해보니까 함수에 들어오지가 않았음.

그래서 PhotonView에서 Observed해야 주고 받는걸 체크하는건가 싶어서 아래와같이 PlayerManager를 추가함.


빌드해서 체크하니 정상적으로 동작.

PhotonView에서 Observed하는 Component만 데이터를 주고받는걸 체크하는 것이었다.




4. 공격과 HP감소 안 됨. 

 PlayerManager에서 충돌체크를 Trigger로 하는데 빔에 trigger 체크를 안해서 collision으로 동작해서 안되었던것.

빔에 trigger체크하고 자신의 빔에 맞지않도록 콜라이더보다 빔을 밖으로 설정함.

(코드 상으로 자신의 빔을 안맞게 설정해도 되지만 귀찮아서 그냥 콜라이더가 겹치지 않도록함)




5. 4번을 해결하니 새로운 문제가 발생. HP감소가 맞는 클라이언트에서만 보임.

→ PlayerManager 클래스에서 trigger로 자신의 hp는 깎이지만 

깎인 hp를 다른 클라이언트들에게 보내주지 않아서 생긴 문제라고 생각.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void IPunObservable.OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
    if (stream.isWriting)
    {
        // We own this player: send the others our data
        stream.SendNext(IsFiring);
        stream.SendNext(Health);
    }
    else
    {
        // Network player, receive data
        this.IsFiring = (bool)stream.ReceiveNext();
        this.Health = (float)stream.ReceiveNext();
    }
}
cs

OnPhotonSerializeView에서 현재 Health를 추가로 보내주고 받았더니 문제가 잘 해결됨.






문제가 해결된 완성본

photon.mp4

먼저 접속하면 룸이 없으면 룸생성.

이후에 접속하면 룸에 접속하고 인원수가 2명이 되면 더 넓은 경기장으로 변함.

공격하면 맞고 체력이 0이되면 로비로 돌아감 → 인원수가 1명이되어 다시 작은 경기장으로 변경.

큰 경기장에서 유저가 나가서 작은경기장이 되면서 땅이 없는곳으로 이동되면 시작점으로 돌아감.

Posted by misty_
,