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.
I created many of the basic game mechanics of the game Among us in less than 24 hours with Unity. This is the first video of our tutorial series on how to create the viral video game Among Us. We will show you how to create your own version of Among Us. We will go through the game mechanics and create Among us from the ground up.
This series on how to create Among us in Unity will be one of the complete and extensive game series we have done so far. We will teach you how to create the game, the chat system, and multiplayer gameplay with Photon PUN 2.
For this lesson on how to make StackColors in Unity, we will show you how to create the color wall prefab. This prefab will change the color of your player object as the player object passes through. This will add an additional level of mechanics to our game.
We will be creating the prefab in Unity. Then we will code the interaction between the player and the color wall. Finally, we will add some additional code to the interaction between the player and the pickup objects.
Unlock Code and Member Content
ColorWall.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColorWall : MonoBehaviour
{
[SerializeField] Color newColor;
// Start is called before the first frame update
void Start()
{
Color tempColor = newColor;
tempColor.a = .5f;
Renderer rend = transform.GetChild(0).GetComponent<Renderer>();
rend.material.SetColor("_Color", tempColor);
}
public Color GetColor()
{
return newColor;
}
}
PlayerControllerStackColor.cs
using System;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControllerStackColor : MonoBehaviour
{
[SerializeField] Color myColor;
[SerializeField] Renderer[] myRends;
[SerializeField] bool isPlaying;
[SerializeField] float forwardSpeed;
Rigidbody myRB;
[SerializeField] float lerpSpeed;
Transform parentPickup;
[SerializeField] Transform stackPosition;
// Start is called before the first frame update
void Start()
{
SetColor(myColor);
myRB = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
if(isPlaying)
{
MoveForward();
}
if (Input.GetMouseButton(0))
{
if(isPlaying == false)
{
isPlaying = true;
}
MoveSideways();
}
}
void SetColor(Color colorIn)
{
myColor = colorIn;
for(int i = 0; i <myRends.Length; i++)
{
myRends[i].material.SetColor("_Color", myColor);
}
}
void MoveForward()
{
myRB.velocity = Vector3.forward * forwardSpeed;
}
void MoveSideways()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 100))
{
transform.position = Vector3.Lerp(transform.position, new Vector3(hit.point.x, transform.position.y, transform.position.z), lerpSpeed *Time.deltaTime);
}
}
private void OnTriggerExit(Collider other)
{
if (other.tag == "ColorWall")
{
SetColor(other.GetComponent<ColorWall>().GetColor());
}
}
private void OnTriggerEnter(Collider other)
{
Debug.Log(other.tag);
if(other.tag == "Pickup")
{
Transform otherTransform = other.transform.parent;
if (myColor == otherTransform.GetComponent<PickupStackColor>().GetColor())
{
GameControllerStackColor.instance.UpdateScore(otherTransform.GetComponent<PickupStackColor>().value);
}
else
{
GameControllerStackColor.instance.UpdateScore(otherTransform.GetComponent<PickupStackColor>().value * -1);
Destroy(other.gameObject);
if(parentPickup != null)
{
if(parentPickup.childCount > 1)
{
parentPickup.position -= Vector3.up * parentPickup.GetChild(parentPickup.childCount - 1).localScale.y;
Destroy(parentPickup.GetChild(parentPickup.childCount - 1).gameObject);
}
else
{
Destroy(parentPickup.gameObject);
}
}
return;
}
Rigidbody otherRB = otherTransform.GetComponent<Rigidbody>();
otherRB.isKinematic = true;
other.enabled = false;
if(parentPickup == null)
{
parentPickup = otherTransform;
parentPickup.position = stackPosition.position;
parentPickup.parent = stackPosition;
}
else
{
parentPickup.position += Vector3.up * (otherTransform.localScale.y);
otherTransform.position = stackPosition.position;
otherTransform.parent = parentPickup;
}
}
}
}
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 != "" && 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 < 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
}