Posted on

Among Us Multiplayer – Photon Spawn Points (PUN 2 in Unity)

In this video on how to make our Among Us project multiplayer, I will show you how to network the spawn points of the players using Photon. This is done by creating new empty game objects to serve as transforms for the spawn points. We will then create a new script that holds these transform in an array. We will Change the Photon Player script to spawn the player’s avatar on the corresponding spawn point.

Unlock Code and Member Content

AU_GameController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AU_GameController : MonoBehaviour
{
    public static AU_GameController instance;

    public Transform[] spawnPoints;

    // Start is called before the first frame update
    void Start()
    {
        instance = this;
    }

}

MyPhotonPlayer.cs

using Photon.Pun;
using Photon.Realtime;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class MyPhotonPlayer : MonoBehaviour
{
    PhotonView myPV;
    GameObject myPlayerAvatar;

    Player[] allPlayers;
    int myNumberInRoom;

    // Start is called before the first frame update
    void Start()
    {
        myPV = GetComponent<PhotonView>();

        allPlayers = PhotonNetwork.PlayerList;
        foreach(Player p in allPlayers)
        {
            if(p!= PhotonNetwork.LocalPlayer)
            {
                myNumberInRoom++;
            }
        }


        if (myPV.IsMine)
        {
            myPlayerAvatar = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "AU_Player"), AU_GameController.instance.spawnPoints[myNumberInRoom].position, Quaternion.identity);
        }
    }


}
using Photon.Chat;
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PhotonChatManager : MonoBehaviour, IChatClientListener
{
    #region Setup

    [SerializeField] GameObject joinChatButton;
    ChatClient chatClient;
    bool isConnected;
    [SerializeField] string username;

    public void UsernameOnValueChange(string valueIn)
    {
        username = valueIn;
    }

    public void ChatConnectOnClick()
    {
        isConnected = true;
        chatClient = new ChatClient(this);
        //chatClient.ChatRegion = "US";
        chatClient.Connect(PhotonNetwork.PhotonServerSettings.AppSettings.AppIdChat, PhotonNetwork.AppVersion, new AuthenticationValues(username));
        Debug.Log("Connenting");
    }

    #endregion Setup

    #region General

    [SerializeField] GameObject chatPanel;
    string privateReceiver = "";
    string currentChat;
    [SerializeField] InputField chatField;
    [SerializeField] Text chatDisplay;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (isConnected)
        {
            chatClient.Service();
        }

        if (chatField.text != "" &amp;&amp; Input.GetKey(KeyCode.Return))
        {
            SubmitPublicChatOnClick();
            SubmitPrivateChatOnClick();
        }
    }

    #endregion General

    #region PublicChat

    public void SubmitPublicChatOnClick()
    {
        if (privateReceiver == "")
        {
            chatClient.PublishMessage("RegionChannel", currentChat);
            chatField.text = "";
            currentChat = "";
        }
    }

    public void TypeChatOnValueChange(string valueIn)
    {
        currentChat = valueIn;
    }

    #endregion PublicChat

    #region PrivateChat

    public void ReceiverOnValueChange(string valueIn)
    {
        privateReceiver = valueIn;
    }

    public void SubmitPrivateChatOnClick()
    {
        if (privateReceiver != "")
        {
            chatClient.SendPrivateMessage(privateReceiver, currentChat);
            chatField.text = "";
            currentChat = "";
        }
    }

    #endregion PrivateChat

    #region Callbacks

    public void DebugReturn(DebugLevel level, string message)
    {
        //throw new System.NotImplementedException();
    }

    public void OnChatStateChange(ChatState state)
    {
        if(state == ChatState.Uninitialized)
        {
            isConnected = false;
            joinChatButton.SetActive(true);
            chatPanel.SetActive(false);
        }
    }

    public void OnConnected()
    {
        Debug.Log("Connected");
        joinChatButton.SetActive(false);
        chatClient.Subscribe(new string[] { "RegionChannel" });
    }

    public void OnDisconnected()
    {
        isConnected = false;
        joinChatButton.SetActive(true);
        chatPanel.SetActive(false);
    }

    public void OnGetMessages(string channelName, string[] senders, object[] messages)
    {
        string msgs = "";
        for (int i = 0; i &lt; senders.Length; i++)
        {
            msgs = string.Format("{0}: {1}", senders[i], messages[i]);

            chatDisplay.text += "\n" + msgs;

            Debug.Log(msgs);
        }

    }

    public void OnPrivateMessage(string sender, object message, string channelName)
    {
        string msgs = "";

        msgs = string.Format("(Private) {0}: {1}", sender, message);

        chatDisplay.text += "\n " + msgs;

        Debug.Log(msgs);
        
    }

    public void OnStatusUpdate(string user, int status, bool gotMessage, object message)
    {
        throw new System.NotImplementedException();
    }

    public void OnSubscribed(string[] channels, bool[] results)
    {
        chatPanel.SetActive(true);
    }

    public void OnUnsubscribed(string[] channels)
    {
        throw new System.NotImplementedException();
    }

    public void OnUserSubscribed(string channel, string user)
    {
        throw new System.NotImplementedException();
    }

    public void OnUserUnsubscribed(string channel, string user)
    {
        throw new System.NotImplementedException();
    }

    #endregion Callbacks
}

Posted on 1 Comment

Among Us in Unity – Creating a Player Prefab (Lesson 1)

Welcome to the first lesson of our tutorial series on how to create the game Among Us in Unity. For this lesson, we will show you how to set up our Among Us project in Unity and How to create the Player Prefab.

To set up the Unity project we will first need to open Unity Hub. You will then need to click the create button. This will open a new window in which you will select 2D, give your project a name like Among Us, select the correct file location for your Unity project, and finally click create.

Once Unity is finished with setting up your project we will create our Among Us player prefab. To do this we will start with an empty game object. Then rename this object to AU_Player for Among Us. Change the tag to Player which is a default tag that should already exist. You will then need to add two components to this object a rigidbody and a capsule collider. For the rigidbody, you will need to disable gravity and freeze its z position and all its rotations.

We will then need to add the spites for our Player. First, download the needed sprite sheets from this post. You will then need to slice these images with a grid of cell size 128. Now, add one sprite object as a child to the empty game object and apply the first sprite to the sprite renderer component. We will then add another sprite object to this object. Apply the first part sprite to this sprite renderer and make sure this sprite is moved in front of the other sprite.

You can then resize the capsule collider to fit the size of this sprite. Finally, you can make a prefab out of this object.