# Setting Up Photon

### 1. Install photon

Search for Photon Unity Networking in the Unity Asset Store, then download and import it into your project. (Note whether you are downloading PUN1 or PUN2. This tutorial uses PUN2, as there may be some compatibility issues with PUN1. It is recommended to use PUN2).

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/tD8LGIH4z08yUDDpdK3p/image.png" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Pay attention to resolving issues related to **assemblies**.
{% endhint %}

* Open the assembly of NRSDK.

  <figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/ww5PNqqp9U301NOXfTK0/output.png" alt=""><figcaption></figcaption></figure>
* Find the "Assembly Definition References" section and click the "+" button to add a new reference. In the new reference, select the Photon assembly PhotonUnityNetworking and PhotonRealtime. Click the "Apply" button to save your changes. &#x20;

  <figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/B5svt4wYKvTktFUjfE9r/4b1b741e-4b11-4471-87be-117081d07c7b.png" alt=""><figcaption></figcaption></figure>

### 2. Set up Photon in Unity

{% tabs %}
{% tab title="Use Photon Cloud Server" %}

1. Register and create a new application on the [official website of Photon](https://dashboard.photonengine.com/publiccloud/overview), then obtain the App ID for your application.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/HSwJu5Y1xZuBKrthFF9Z/6839ac72-e8fc-4d9f-98f8-55dde33b18e8.png" alt=""><figcaption></figcaption></figure>

2. In Unity, open PhotonServerSettings (`Window > Photon Unity Networking`), and then enter your App ID.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/BS3tHcFzlU0nxwcjNQlM/output%20(1).png" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Use Self-hosted Server" %}
{% hint style="info" %}
Note that the self-hosted server is **only** compatible with **Windows** operating systems. For details, please refer to the [official document of photon](https://doc.photonengine.com/server/current/getting-started/photon-server-in-5min).
{% endhint %}

1. Download [Photon Server SDK](https://www.photonengine.com/sdks#server-sdkserverserver) and extract the server package to any place - preferably an empty folder which you prepared beforehand.
2. Get a [license](https://dashboard.photonengine.com/selfhosted), claim it and save it to **"deploy\bin\_Win64".**

   <figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/I2DzFkhMpGMECoShfydt/image.png" alt=""><figcaption></figcaption></figure>
3. Start "PhotonControl.exe" and confirm the admin rights for this application. They are needed for the option to set up Photon as a Service. Look out for the tray-bar icon (bottom right by default). Click the white/grey icon to open a menu that controls Photon.
4. Pick `LoadBalancing (MyCloud)` from the Photon Instances and "Start as Application". Now you started Photon.

   <figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/Zz8ypLIq20oGtGxTkySI/2075c194-1f32-42e2-8777-f7413ff409f1.png" alt=""><figcaption></figcaption></figure>
5. Now you can connect clients ***running on the same machine**.*
6. To connect clients from a local network, simulated device or the public internet, change the IP Address Config. The next steps are to set up the method for local network. (Use one local host as a server, and then connect other client devices to the same Wi-Fi as that server.)
7. In Unity, open PhotonServerSettings (`Window > Photon Unity Networking`, then  click `Locate PhotonServerSettings)`

&#x20;![](https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/4VNHn418FpWYfNvTY9h6/image%20\(2\).png)![](https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/xfEXq78LFeRIihurbh4R/image%20\(3\).png)

9. Modify PhotonServerSettings: unselect "**`Use Name Server`**", fill in the IP address and port number of the self-hosted server (if using UDP protocol, the default port number is **5055**).

   <figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/bVeCVNj1j0RvV0knqUCq/image%20(4).png" alt=""><figcaption></figcaption></figure>

   You can find your local server IP here:&#x20;

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/ETpQ4bll1UxpW7GB2Iir/%E6%88%AA%E5%B1%8F2023-08-14%2019.15.07.png" alt=""><figcaption></figcaption></figure>

10. Modify the **`PublicIpAddress`** field in **`GameServer.xml.config`** to the IP address of the self-hosted server (default is 127.0.0.1). You can find this file in: `deploy\LoadBalancing\GameServer\bin`

    <figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/QhdS7usmedg9nFSrn0vr/image%20(1).png" alt=""><figcaption></figcaption></figure>

{% endtab %}
{% endtabs %}

### 3. Joining a room

A crucial prerequisite for sharing an anchor among different users is that they are in the same room. Therefore, we need to set up a script to allow them to join the same room.

The `joinedRoomIndicator` is used to indicate a successful room joining. The method used here is to change the color of the join button after successfully joining.

```csharp
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.UI;

public class JoinRoomButton : MonoBehaviourPunCallbacks
{
    public Button joinedRoomIndicator;

    public void OnButtonClick()
    {
        // Connect to the Photon master server
        if (!PhotonNetwork.IsConnected)
        {
            PhotonNetwork.ConnectUsingSettings();
        }
        else
        {
            TryJoinRoom();
        }
    }

    public override void OnConnectedToMaster()
    {
        Debug.Log("Connected to Photon master server");
        TryJoinRoom();
    }

    private void TryJoinRoom()
    {
        // Try to join the room "MyRoom"
        PhotonNetwork.JoinRoom("MyRoom");
    }

    public override void OnJoinedRoom()
    {
        Debug.Log("Joined room: " + PhotonNetwork.CurrentRoom.Name);
        
        joinedRoomIndicator.image.color = Color.green;
    }

    public override void OnJoinRoomFailed(short returnCode, string message)
    {
        Debug.Log("Failed to join room");
        // If we failed to join the room, it might not exist, so let's try to create it
        PhotonNetwork.CreateRoom("MyRoom");
    }

    public override void OnCreatedRoom()
    {
        Debug.Log("Created room: " + PhotonNetwork.CurrentRoom.Name);
    }

    public override void OnCreateRoomFailed(short returnCode, string message)
    {
        Debug.Log("Failed to create room");
    }
}

```
