원본 글 : https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/player-instantiation



Player 인스턴스 생성하기

GameManager의 Start()에서 player를 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void Start()
{
    Instance = this;
 
    if(playerPrefab == null)
    {
        Debug.LogError("<Color=Red><a>Missing</a></Color> playerPrefab Reference. Please set it up in GameObject 'Game Manager'"this);
    }
    else
    {
        if (PlayerManager.LocalPlayerInstance == null)
        {
            Debug.Log("We are Instantiating LocalPlayer from " + SceneManager.GetActiveScene().name);
            PhotonNetwork.Instantiate(this.playerPrefab.name, new Vector3(0f, 5f, 0f), Quaternion.identity, 0);
        }
        else
        {
            Debug.Log("Ignoring scene load for " + SceneManager.GetActiveScene().name);
        }
    }
}
cs

PhotonNetwork.Instantiate를 이용하여 네트워크 객체를 스폰함.

(https://doc.photonengine.com/ko-kr/pun/current/gameplay/instantiation)




플레이어 인스턴스 파악

PlayerManager에 Instance를 만들어 플레이어가 생성되면 Instance를 설정해준다.

1
2
3
4
5
6
7
8
9
10
11
12
public static GameObject LocalPlayerInstance;
 
private void Awake()
{
    if(photonView.isMine)
    {
        PlayerManager.LocalPlayerInstance = this.gameObject;
    }
    DontDestroyOnLoad(this.gameObject);
 
   ...
}
cs

그리고 위와 같이 인스턴스를 체크하여(위의 생성코드 11번째줄 - if (PlayerManager.LocalPlayerInstance == null))

없을 경우에만 생성해주도록 한다.




경기장 밖에 있을때 플레이어 위치 관리

만약 플레이어가 나가서 경기장이 줄어들었다면 내 캐릭터가 없어진 바닥위에 있을수도 있을것이다.

이것을 방지하기 위해서 아래와 같이 바닥이 없으면 시작점으로 이동하게 한다.

1
2
3
4
5
6
7
private void OnLevelWasLoaded(int level)
{
    if(!Physics.Raycast(transform.position, -Vector3.up, 5f))
    {
        transform.position = new Vector3(0f, 5f, 0f);
    }
}
cs


Posted by misty_
,