Unity๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์์ ๊ฐ๋ฐํ ํ ์ค์ ๋ก ์คํ ๊ฐ๋ฅํ ํ์ผ, ์ฆ "๋น๋"๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํ์ต
'File' > 'Build Setting'๋ก ์ด๋
'Platform' ๋ชฉ๋ก์์ 'Windows'๋ฅผ ์ ํํ๊ณ , 'Switch Platform'์ ํด๋ฆญ
์ํ๋ ์ฌ์ 'Scenes in Build' ๋ชฉ๋ก์ ์ถ๊ฐ
'Player Settings'์์ ๊ฒ์์ ์ค์ ์ ๋ณ๊ฒฝํ ์ ์๋ค. (์ : ํ์ฌ ์ด๋ฆ, ๊ฒ์ ์์ด์ฝ ๋ฑ)
'Build' ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋น๋๋ฅผ ์์ํ๋ค.
Windows๋น๋๋ Windows ์ด์์ฒด์ ์์๋ง ์คํ๋๋ค.
๋น๋ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ค, ์๋ฅผ ๋ค๋ฉด ํ๋ฌ๊ทธ์ธ ํธํ์ฑ ์ด์ ๋ฑ์ ํ์ธํด์ผ ํ๋ค.
'File' > 'Build Settings'๋ก ์ด๋
'Platform'๋ชฉ๋ก์์ 'Android'๋ฅผ ์ ํํ๊ณ , 'Switch Platform'์ ํด๋ฆญ
์ํ๋ ์ฌ์ 'Scenes in Build'๋ชฉ๋ก์ ์ถ๊ฐ
'Player Settings'์์ ๊ฒ์์ ์ค์ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ (์ : ํ์ฌ ์ด๋ฆ, ๊ฒ์ ์์ด์ฝ, ๋ฒ๋ค ์๋ณ์ ๋ฑ)
'Minimum API Level'๊ณผ 'Target API Level'์ ์ ์ ํ๊ฒ ์ค์ ํ๋ค.
'Build'๋ฒํผ์ ํด๋ฆญํ์ฌ ๋น๋๋ฅผ ์์ํ๋ค.
Android ๋น๋๋ฅผ ์ํด์๋ JDK์ Android SDK๊ฐ ํ์ํ๋ค.
๋น๋ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ค, ์๋ฅผ ๋ค๋ฉด ํ๋ฌ๊ทธ์ธ ํธํ์ฑ ์ด์, API๋ ๋ฒจ ๋ฌธ์ ๋ฑ์ ํ์ธํด์ผ ํ๋ค.
Android๋ ๋ค์ํ ํด์๋์ ๊ธฐ๊ธฐ๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๊ณ ๋ คํ UI / UX ๋์์ธ์ด ํ์ํ๋ค.
์๋๋ก์ด๋์ ๋ค์ํ OS๋ฒ์ ๊ณผ ํธํ์ฑ์ ํ๋ณดํด์ผ ํ๋ค.
Company Name : ํ์ฌ ์ด๋ฆ์ ์ ๋ ฅ. ์ด ์ ๋ณด๋ ๊ฒ์์ ๋ฉํ ๋ฐ์ดํฐ์ ์ ์ฅ๋๋ค.
Product Name : ๊ฒ์์ ์ด๋ฆ์ ์ ๋ ฅ
Version : ๊ฒ์์ ๋ฒ์ ์ ์ ๋ ฅ
Default Icon : ๊ฒ์์ ์์ด์ฝ์ ์ค์ . ํด๋น ์์ด์ฝ์ ๊ฒ์ ์คํ ํ์ผ์ ์ฌ์ฉ๋๋ค.
Default Screen Width, Default Screen Height : ๊ฒ์์ด ์ฒ์ ์คํ๋ ๋์ ๊ธฐ๋ณธ ํ๋ฉด ๋๋น์ ๋์ด๋ฅผ ์ค์
FullScreen Mode : ๊ฒ์์ด ์ ์ฒดํ๋ฉด์ผ๋ก ์คํ๋ ์ง, ์ฐฝ๋ชจ๋๋ก ์คํ๋ ์ง๋ฅผ ๊ฒฐ์
Visible in Background : ์ด ์ต์ ์ ์ฐฝ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ ๋, ๊ฒ์์ด ๋ณด์ผ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ .
Company Name, Product Name, Version : ์์ Windows ์ค์ ๊ณผ ๋์ผํ๋ค.
Bundle Identifier : ์ฑ์ ๊ณ ์ ์๋ณ์์ด๋ค. ๋ณดํต "com.CompanyName.GameName" ํ์์ผ๋ก ์์ฑ๋๋ค.
Default Icon : ๊ฒ์์ ์์ด์ฝ์ ์ค์ ํ๋ค. ํด๋น ์์ด์ฝ์ ์๋๋ก์ด๋ ์ฑ ์์ด์ฝ์ผ๋ก ์ฌ์ฉ๋๋ค.
Adaptive Icons : Android 8.0 ์ด์์์ ์ฌ์ฉ๋๋ ์ ์ํ ์์ด์ฝ์ ์ค์ ํ ์ ์๋ค.
Default Orientaion : ๊ฒ์์ด ์์๋ ๋์ ํ๋ฉด ๋ฐฉํฅ์ ์ค์ ํ๋ค.
Auto Rotation : ํ๋ฉด์ด ์๋์ผ๋ก ํ์ ํ๋์ง ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ค.
Minimum API Level : ์ฑ์ด ์ง์ํ๋ ์ต์ ์๋๋ก์ด๋ ๋ฒ์ ์ ์ค์ ํ๋ค.
Target API Level : ์ฑ์ด ๋์์ผ๋ก ํ๋ ์๋๋ก์ด๋ ๋ฒ์ ์ ์ค์ ํ๋ค. ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
[๋ ์ง์คํธ๋ฆฌํธ์ง๊ธฐ] ๊ฒ์ ํ
HKCU\Software\[ํ์ฌ๋ช ]\[์ ํ๋ช ]
์ค์ ๋ ํด์๋ ๊ฐ ์์ ๋๋ ์ญ์
ํฌํค(Photon)์ Exit Games์์ ๊ฐ๋ฐํ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์ ๊ฐ๋ฐ์ ์ํ ๋คํธ์ํฌ ์์ง์ด๋ค. Unity์ ๊ฐ์ ๊ฒ์ ์์ง๊ณผ ์ฌ์ฉ๋์ด ๋ฉํฐํ๋ ์ด์ด ๊ธฐ๋ฅ์ ๊ฒ์์ ์ถ๊ฐํ ์ ์๊ฒ ํ๋ค.
Cross-Platform : ํฌํค์ ๋ค์ํ ํ๋ซํผ ๊ฐ์ ํต์ ์ ์ง์ํ๋ค. ์ด๋ PC, ๋ชจ๋ฐ์ผ, ์ฝ์ ๊ฒ์์์ ๋ฉํฐํ๋ ์ด์ด๋ฅผ ์ง์ํ๊ฒ ํด์ค๋ค.
Real-Time, Multiplayer : ํฌํค์ ์ค์๊ฐ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์ ๊ฐ๋ฐ์ ์ด์ ์ ๋ง์ถ๊ณ ์๋ค.
Scalability : ํฌํค์ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์์ ํ๋ ์ด์ด ์์ ๋ฐ๋ผ ์๋์ผ๋ก ํ์ฅ๋๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Reliability : ํฌํค์ ๋ฐ์ดํฐ ์ ์ก์ ๋ํ ๋์ ์ ๋ขฐ์ฑ์ ์ ๊ณตํ๋ค.
ํฌํค์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ช ๊ฐ์ง ์ค์ํ ๋ฉ์๋์ ํด๋์ค
PhotonNetworkํด๋์ค๋ ํฌํค ๋คํธ์ํฌ์ ์ฃผ์ ๊ธฐ๋ฅ์ ์๊ฒ์ค ํ๋ ์ค์ฌ์ ์ธ ํด๋์ค์ด๋ค.
PhotonNetwork.ConnectUsingSettings();
์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ์ฑ์ด ํฌํค ํด๋ผ์ฐ๋์ ์ฐ๊ฒฐ๋๋ค. ์ฐ๊ฒฐ์ํ๋ PhtonNetwork.IsConnected
๋ก ํ์ธํ ์ ์๋ค.
PhotonNetwork.CreateRoom("RoomName");
PhotonNetwork.JoinRoom("RoomName");
CreateRoom ๋ฉ์๋๋ ์๋ก์ด ๋ฐฉ์ ๋ง๋ค๊ณ , Join ๋ฉ์๋๋ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฐฉ์ ์ฐธ๊ฐํ๋ค.
PhotonNetwork.Instantiate("PrefabName", position, rotation);
ํฌํค ๋คํธ์ํฌ๋ฅผ ํตํด ์๋ก์ด ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค. ์ด ๋ฉ์๋๋ Unity์ Instantiate ๋ฉ์๋์ ์ ์ฌํ๋, ๋คํธ์ํฌ๋ฅผ ํตํด ๋๊ธฐํ๋๋ค.
MonoBehaviourPunCallbacksํด๋์ค๋ ํฌํค์ ์ฃผ์ ์ด๋ฒคํธ์ ๋ํ ์ฝ๋ฐฑ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
public override void OnConnectedToMaster() { ... }
๊ฒ์์ด ํฌํค ๋ง์คํฐ ์๋ฒ์ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ฉด ํธ์ถ๋๋ค.
public override void OnJoinedRoom() { ... }
๋ก์ปฌ ํ๋ ์ด์ด๊ฐ ๋ฐฉ์ ์ ์ฅํ๋ฉด ํธ์ถ๋๋ค.
public override void OnPlayerEnteredRoom(Player newPlayer) { ... }
๋ค๋ฅธ ํ๋ ์ด์ด๊ฐ ๋ฐฉ์ ์ ์ฅํ๋ฉด ํธ์ถ๋๋ค.
ํฌํค์์ ์ฃผ์ํ๊ฒ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ ๋ช ๊ฐ์ง
PhotinView
PhotonView๋ ํฌํค ๋คํธ์ํฌ์์ ๋คํธ์ํฌ ์ํ๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด ์ปดํฌ๋ํธ
๋ฅผ ํตํด PhotonNetwork.Instantiate๋ฅผ ์ฌ์ฉํด ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ๋๊ธฐํ๋๋ค.
PhotonView๋ ์ฃผ๋ก Transform์ปดํฌ๋ํธ๋ ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ์ ๊ฐ์ด ๋๊ธฐํํ๊ณ ์ ํ๋
์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐํ๋ค.
PhotonTransformView
PhotonTransformView๋ ์์น, ํ์ , ๋ฐ ํฌ๊ธฐ๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์ด๋ค.
PhotonView์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋ฉฐ, ์ด ์ปดํฌ๋ํธ๋ฅผ ํตํด ๊ฒ์ ์ค๋ธ์ ํธ์ ์์ง์๊ณผ ๋คํธ์ํฌ
๋ฅผ ํตํด ๋๊ธฐํ๋๋ค.
PhotonAnimatorView
PhotonAnimatorView๋ Animator์ปดํฌ๋ํธ๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด ์ปดํฌ๋ํธ๋
PhotonView์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ์ ๋๋ฉ์ด์
์ํ์ ๋ณ์๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
PhotonRigidbodyView
PhotonRigidbodyView๋ Rigidbody ๋๋ Rigidbody2D ์ปดํฌ๋ํธ๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ด ์ปดํฌ๋ํธ๋ ์์ง์๊ณผ ํ์ ์ ๋๊ธฐํํ์ฌ ๋ฌผ๋ฆฌ์ ํจ๊ณผ๋ฅผ ๋คํธ์ํฌ๋ฅผ ํตํด ๋๊ธฐํํ ์ ์๋ค.
TCP (Transmission Control Protocol) : ์ ๋ขฐ์ฑ์ด ํ์ํ ๋ฐ์ดํฐ ์ ์ก์ ์ฌ์ฉ๋๋ค. ๋ฐ์ดํฐ ์ ์ก ํ์ธ์ ์ํ ์ ์ฐจ๋ฅผ ๊ฑฐ์น์ง ๋๋ฌธ์ UDP๋ณด๋ค ๋๋ฆด ์ ์๋ค.
UDP (User Datagram Protocol) : ์๋๊ฐ ์ค์ํ ๋ฐ์ดํฐ ์ ์ก์ ์ฌ์ฉ๋๋ค. ๋ฐ์ํฐ์ ๋์ฐฉ์ ํ์ธํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด์ง๋ง, ์ ๋ขฐ์ฑ์ TCP๋ณด๋ค ๋ฎ๋ค.
๊ธฐ์กด์ Pong ํ๋ก์ ํธ๋ฅผ ๋ณต์ฌํ์ฌ ์ค๋น
ํฌํค ์ฌ์ดํธ ๊ฐ์
PUN ์ดํ๋ฆฌ์ผ์ด์ ์์ฑ
๋์ฌ๋ณด๋ - ์ดํ๋ฆฌ์ด์ ID ๋ณต์ฌ
Pun Wizard ์ค์
''' ์๋ต
public void OnStartGameButtonClicked()
{
PhotonNetwork.CurrentRoom.IsOpen = false;
PhotonNetwork.CurrentRoom.IsVisible = false;
// ์ ๋ํฐ ๊ธฐ๋ฅ์ธ ์ฌ๋งค๋์ง๋จผํธ๋ก ์ฌ์ ๋ก๋ํ๊ฒ ๋๋ฉด "๋๋ง" ๋์ด๊ฐ๊ฒ ๋๋ค.
// ํ์ง๋ง ์ฌ๊ธฐ์ ์ฐ๋ฆฌ ๋ฐฉ์์๋ ์ฌ๋๋ค์ด ๋์ด๊ฐ์ผํ๊ธฐ ๋๋ฌธ์, PhotonNetwork.LoadLevel();
// ๋ฅผ ํตํด์ ์งํํด์ผํ๋ค.
PhotonNetwork.LoadLevel("SampleScene");
}
Paddle๋ก ์ด๋ฆ๋ณ๊ฒฝ
Player ์ปดํฌ๋ํธ ์ญ์
Net Paddle ์คํฌ๋ฆฝํธ ์์ฑํ ์ฐ๊ฒฐ
Photon View ์ถ๊ฐ
Photon Transform View, Position ์ถ๊ฐ ํ ์ฒดํฌ
์์์ ์์ ๋ ๋ ์ค๋ธ์ ํธ Resources ํด๋๋ก ์ด๋ ํ๋ฆฌํนํ
์ ์ ์กด์ฌํ๋ ํ๋ ์ด์ด์ ๋ณผ ์ญ์
public class NetPaddle : MonoBehaviourPun // photonView๋ฅผ ์๋์ผ๋ก ๊ฐ์ ธ์จ๋ค.
{
public float speed = 10f;
void Update()
{
// ์ค๋ธ์ ํธ๊ฐ ๋ด๊ฒ์ด๋? ์ฌ๊ธฐ์ ๋ด๊ฒ์ด๋ผ๋ ๊ฒ์ ๋ด๊ฐ๋ง๋ ์ค๋ธ์ ํธ๋? ๋ผ๋ ๊ฒ
// ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ค์ด์ ธ์๊ณ ์ด๊ฒ์ด ํธ์คํธ ๊ฒ์ธ์ง? ์๋๋ฉด ๋ด๊ฐ ์ด ํ๋ ์ด๋ฅผ
// ์งํํ๋ฉด์ ๋ด ๊ฒ์ ์ํด ๋ด๊ฐ ๋ง๋ ๊ฒ์ธ์ง.
if(photonView.IsMine)
{
float move = Input.GetAxis("Vertical") * speed * Time.deltaTime;
transform.Translate(0, move, 0);
}
}
}
public class Ball : MonoBehaviourPun, IPunObservable
{
public float speed;
public Rigidbody2D rigidbody;
private void Awake()
{
rigidbody = GetComponent<Rigidbody2D>();
}
void Start()
{
// ํธ์คํธ๊ฐ ์๋ ์ฌ๋๋ค์ ํธ์คํธ๊ฐ ์์ง์ด๋ ๊ณต์ ์์น๋ฅผ ๋๊ธฐํ๋ง ํ๋ฉด ๋๊ธฐ๋๋ฌธ์,
// ๋ฐ์ ์ฝ๋๊ฐ ์คํ๋ ํ์๊ฐ ์๋ค.
if(!photonView.AmOwner) // ํธ์คํธ๊ฐ ์๋๊ฒฝ์ฐ.
{
return;
}
Launch();
}
private void Launch()
{
if (!photonView.AmOwner)
{
return;
}
float x = Random.Range(0, 2) == 0 ? -1 : 1;
float y = Random.Range(0, 2) == 0 ? -1 : 1;
rigidbody.velocity = new Vector2(x* speed, y* speed);
}
public void Reset()
{
rigidbody.velocity = Vector2.zero;
transform.position = Vector2.zero;
Invoke("Launch", 1);
// Launch();
}
// IPunObservable ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ๋ ๋ฉ์๋.
// ์ฐ๋ฆฌ๋ง์ ๋๊ธฐํ ์ฝ๋๋ฅผ ์งํํ ์ ์๊ฒ ํด์ค๋ค.
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
// ํธ์คํธ์ฌ์ ์ ๋ณด๋ฅผ ์ฐ๋(Write) ๊ฒฝ์ฐ๋ ๊ณ์ ์ ๋ณด๋ฅผ ์ฃผ๊ธฐ๋ง ํ๋ค.
if (stream.IsWriting)
{
stream.SendNext(rigidbody.position);
stream.SendNext(rigidbody.velocity);
}
else // ๋ฐ๋๊ฒฝ์ฐ, ํธ์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ๋ณด๋ฅผ ๋ฐ๊ธฐ๋ง ํ๋ค.
{
// ์์์ ์ฃผ๋ ์์๋๋ก ๋ฐ์์ผํ๋ค.
// ReceiveNext() ๋ objectํ์, ๋ชจ๋ ์ ๋ค์ ์ต์์ ํด๋์ค์ด๊ธฐ์
// Vector2๋ก ๋ณํํ์ฌ ์ฌ์ฉํ๋ค.
rigidbody.position = (Vector2)stream.ReceiveNext();
rigidbody.velocity = (Vector2)stream.ReceiveNext();
}
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.name.Contains("Ball"))
{
if(isPlayer1Goal)
'''์๋ต
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviourPunCallbacks
{
[Header("Ball")]
public Ball ball;
[Header("Player 1")]
public Paddle player1Paddle;
public Goal player1Goal;
[Header("Player 2")]
public Paddle player2Paddle;
public Goal player2Goal;
[Header("UI")]
public TextMeshProUGUI player1Text;
public TextMeshProUGUI player2Text;
private int player1Score;
private int player2Score;
private void Start()
{
SpawnPaddle(); // ๋ชจ๋ ํจ๋ค ์์ฑ
if(photonView.AmOwner) // ์ค๋์ธ(๋ฐฉ์ฃผ์ธ) ๊ฒฝ์ฐ๋ง ๋ณผ ์์ฑ
SpawnBall();
}
private void SpawnPaddle()
{
int idx = PhotonNetwork.LocalPlayer.ActorNumber; // ActorNumber : ๋ฒํธ
GameObject prefab = Resources.Load<GameObject>("Paddle");
if(idx == 1)
{
// Instantiate์์ PhotonNetwork๋ฅผ ๋ถ์ฌ์ค์ผ ๋๋ง ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ.
// ๊ฒ์ ์์ฒด์ ์์ฑํ์ฌ ๋ค๋ฅธ ์ ์ ๋ค๋ ์ฌ์ฉ์ด ๊ฐ๋ฅ.
PhotonNetwork.Instantiate(prefab.name, new Vector3(-12, 0, 0), Quaternion.identity);
}
else
{
PhotonNetwork.Instantiate(prefab.name, new Vector3(12, 0, 0), Quaternion.identity);
}
}
private void SpawnBall()
{
GameObject prefab = Resources.Load<GameObject>("Ball");
GameObject go = PhotonNetwork.Instantiate(prefab.name, Vector3.zero, Quaternion.identity);
ball = go.GetComponent<Ball>();
}
public void Player1Scored()
{
if (photonView.AmOwner)
{
player1Score++;
ResetPosition();
// (๋ฉ์๋ ์ด๋ฆ, ๋๊ตฌ ์๊ฒ?, ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ก ๋ณด๋ผ ๋งค๊ฐ๋ณ์)
photonView.RPC("UpdateScore", RpcTarget.All, player1Score, player2Score);
}
}
public void Player2Scored()
{
if (photonView.AmOwner)
{
player2Score++;
ResetPosition();
photonView.RPC("UpdateScore", RpcTarget.All, player1Score, player2Score);
}
}
[PunRPC] // ์ฃผ๊ธฐ๊ฐ ๊ธด, ์์ฃผ ์ฌ์ฉ๋์ง ์๋
public void UpdateScore(int score1, int score2)
{
player1Text.text = score1.ToString();
player2Text.text = score2.ToString();
if (score1 > 5 || score2 > 5)
PhotonNetwork.LeaveRoom();
}
private void ResetPosition()
{
ball.Reset();
}
public override void OnLeftRoom()
{
// ๋๊ฐ๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ์์์ ๋๊ฐ๋ ๊ฒ์ด๊ฐ ๋๋ฌธ์,
// PhotonNetwork ์ด ์๋ SceneManager์ฌ์ฉ.
SceneManager.LoadScene("LobbyScene");
}
}
''' ์๋ต
private void Start()
{
if (PhotonNetwork.NetworkClientState == ClientState.Joined) // ์ด๋ฏธ ์ ์ํ ์ํ๋ผ๋ฉด
this.SetActivePanel(SelectionPanel.name);
}