소개
이번 강좌에서는 Unity 엔진을 사용하여 2D 게임에 간단한 멀티플레이어 기능을 추가하는 방법에 대해 알아보겠습니다.
멀티플레이어 기능은 게임의 재미를 크게 증가시키며, 친구들과 함께 즐길 수 있는 기회를 제공합니다.
또한, 멀티플레이어를 구현하는 과정에서 네트워킹, 데이터 동기화 등의 개념을 이해할 수 있습니다.
1. 게임 준비하기
먼저 여러분이 만들 게임을 구상해 봅시다. 간단한 2D 플랫폼 게임을 예로 들겠습니다.
플레이어는 서로 경쟁하여 점수를 얻거나, 목표를 달성하는 형태로 만들 수 있습니다.
1.1 Unity 프로젝트 생성
유니티를 실행한 후 새로운 2D 프로젝트를 생성합니다.
프로젝트의 이름은 ‘Multiplayer2DGame’으로 하고, 기본 템플릿을 선택합니다.
2. Photon Unity Networking(PUN) 설정
멀티플레이어 기능을 구현하기 위해 Photon Unity Networking(PUN)이라는 라이브러리를 사용할 것입니다.
PUN은 유니티의 멀티플레이어 게임 개발을 쉽게 만들어주는 툴입니다.
2.1 PUN 설치하기
-
Photon PUN 2 (무료)를 유니티 에셋 스토어에서 다운로드하고
설치합니다. -
Assets 폴더 아래의
Photon
폴더 내에서PhotonServerSettings
파일을 열고,
App ID를 입력합니다. (Photon 웹사이트에서 생성 가능합니다)
3. 기본 플레이어 구현하기
이제 기본 플레이어 캐릭터를 만들어 보겠습니다. 플레이어는 다른 사용자와 상호작용할 수 있도록 해야 합니다.
플레이어 프리팹을 생성하고 PUN을 사용하여 네트워크 동기화를 설정해야 합니다.
3.1 플레이어 프리팹 생성
- 2D 스프라이트를 사용해 플레이어 캐릭터를 만듭니다. 예를 들어, 원형 스프라이트를 만들어보겠습니다.
- 새로운 Empty GameObject를 만들고 ‘Player’라는 이름을 붙입니다.
- Player GameObject에 Circle Collider 2D 및 Rigidbody 2D 컴포넌트를 추가합니다.
- 이제 Player를 Prefab으로 만들어 Assets 폴더에 저장합니다.
3.2 PUN과 연동
플레이어 스크립트를 만들어 PUN의 기능을 연동합니다. 아래 코드를 사용해 플레이어 스크립트를 작성해 보겠습니다.
using UnityEngine;
using Photon.Pun;
public class PlayerController : MonoBehaviourPunCallbacks
{
public float moveSpeed = 5f;
void Update()
{
if (photonView.IsMine)
{
Move();
}
}
void Move()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 moveDirection = new Vector3(horizontal, vertical, 0).normalized;
transform.position += moveDirection * moveSpeed * Time.deltaTime;
}
}
3.3 플레이어 스폰
다음으로, 게임이 시작될 때 플레이어를 스폰하는 기능을 추가해야 합니다.
아래 코드를 GameManager라는 새로운 스크립트에 추가합니다.
using UnityEngine;
using Photon.Pun;
public class GameManager : MonoBehaviourPunCallbacks
{
void Start()
{
PhotonNetwork.ConnectUsingSettings();
}
public override void OnConnectedToMaster()
{
PhotonNetwork.JoinLobby();
}
public override void OnJoinedLobby()
{
PhotonNetwork.LoadLevel("GameScene");
}
public override void OnJoinedRoom()
{
PhotonNetwork.Instantiate("Player", Vector3.zero, Quaternion.identity, 0);
}
}
4. 게임 로비 구현하기
멀티플레이어 게임에는 로비가 필요합니다. 로비에서는 플레이어가 대기하고 게임을 시작할 수 있습니다.
다음 단계로 로비 UI를 만들어봅시다.
4.1 UI 구성
UI를 만들기 위해 Unity의 UI 시스템을 사용합니다.
Canvas를 만들고 버튼 및 텍스트 UI 요소를 추가합니다.
버튼은 ‘방 만들기’, ‘방 입장하기’ 같은 기능을 수행할 수 있습니다.
4.2 방 만들기 및 입장 코드 추가
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.UI;
public class LobbyManager : MonoBehaviourPunCallbacks
{
public InputField roomNameInputField;
public void CreateRoom()
{
string roomName = roomNameInputField.text;
RoomOptions roomOptions = new RoomOptions() { MaxPlayers = 4 };
PhotonNetwork.CreateRoom(roomName, roomOptions);
}
public void JoinRoom()
{
string roomName = roomNameInputField.text;
PhotonNetwork.JoinRoom(roomName);
}
public override void OnCreatedRoom()
{
Debug.Log("방이 생성되었습니다.");
}
public override void OnJoinedRoom()
{
Debug.Log("방에 입장했습니다.");
}
}
5. 네트워크 동기화
이제 여러 플레이어가 게임에 접속하고 서로 상호작용할 수 있도록 네트워크 동기화를 구현합니다.
Photon을 이용하여 플레이어 행동을 동기화할 것입니다.
5.1 RPC 사용하기
플레이어의 행동(예: 점프, 공격 등)을 동기화하기 위해 RPC(Remote Procedure Call)를 사용합니다.
아래는 플레이어가 점프할 때 사용될 코드입니다.
using Photon.Pun;
[PunRPC]
public void Jump()
{
if (IsGrounded())
{
GetComponent().AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
}
}
6. 점수 시스템 구현하기
여러 플레이어가 서로 경쟁하는 경우 점수 시스템이 필요합니다.
이 시스템은 플레이어의 점수를 저장하고 표시하는 역할을 합니다.
6.1 점수 데이터베이스 클래스 만들기
using UnityEngine;
[System.Serializable]
public class PlayerScore
{
public string playerName;
public int score;
}
public class ScoreManager : MonoBehaviour
{
public List scores = new List();
}
6.2 점수 표시하기
UI에 점수를 표시하기 위해 Text UI 요소를 생성하고, 각 플레이어의 점수를 업데이트하는 스크립트를 만들어봅니다.
using UnityEngine;
using UnityEngine.UI;
public class ScoreDisplay : MonoBehaviour
{
public Text scoreText;
public void UpdateScore(PlayerScore playerScore)
{
scoreText.text = playerScore.playerName + ": " + playerScore.score;
}
}
7. 테스트 및 배포
모든 기능을 구현한 후에는 테스트를 진행합니다. PUN의 Premier Servers를 사용하여 여러 클라이언트를 실행하고
진행 상황과 버그를 점검합니다.
테스트가 끝난 후에는 게임을 빌드하여 사용자에게 배포할 수 있습니다.
결론
이번 강좌에서는 유니티에서 2D 게임에 멀티플레이어 기능을 추가하는 방법을 알아보았습니다.
Photon Unity Networking(PUN)을 활용하여 플레이어 간의 상호작용 및 데이터 동기화를 할 수 있었습니다.
멀티플레이어 게임을 개발하는 과정은 쉽지 않지만, 매우 흥미롭고 보람 있는 작업입니다.
다양한 기능을 덧붙이고, 개인의 스타일로 나만의 게임을 만들기를 바랍니다.
앞으로도 다양한 유니티 관련 강좌를 기대해 주세요!