유니티 기초 강좌: 플레이어 동기화 및 캐릭터 간의 공격

현대 게임 개발에서 멀티플레이어 게임의 중요성이 커짐에 따라 플레이어 간의 동기화와 공격 시스템은 필수적입니다. 본 강좌에서는 유니티를 사용하여 멀티플레이어 게임에서 플레이어 캐릭터 간의 동기화 및 공격을 구현하는 방법에 대해 자세히 설명하겠습니다.

1. 유니티 및 멀티플레이어 게임 개발 개요

유니티는 크로스 플랫폼 개발을 지원하는 강력한 게임 엔진으로, 2D 및 3D 게임을 만들 수 있습니다. 유니티의 멀티플레이어 기능은 Photon, Unity Multiplayer 등 다양한 옵션을 제공합니다. 본 강좌에서는 Photon Unity Networking (PUN)을 사용하여 동기화 및 공격 시스템을 구현합니다.

2. Photon Unity Networking (PUN) 설정하기

PUN을 사용하기 위해서는 먼저 Unity Asset Store에서 Photon PUN 2 패키지를 다운로드하고 설치해야 합니다. 또는 공식 Photon 웹사이트에서 PUN SDK를 다운로드할 수 있습니다.

2.1 PUN 설치하기

  1. Unity 에디터를 열고 새로운 프로젝트를 생성합니다.
  2. Asset Store에 접속하여 ‘Photon PUN 2’를 검색하고 다운로드합니다.
  3. 프로젝트에 PUN 패키지를 임포트합니다.
  4. Photon 설정 마법사를 실행하여 앱 ID를 입력하고 설정을 완료합니다.

2.2 기본 씬 설정하기

Photon을 설치한 후, 기본 씬을 설정합니다. 인스턴스를 만들고 PhotonView 컴포넌트를 추가하여 각 플레이어의 동기화를 관리할 수 있습니다.

3. 플레이어 캐릭터 및 애니메이션 설정

플레이어 캐릭터를 설정하기 위해 모델을 임포트하고 애니메이션을 추가합니다. 우리는 Rigidbody 및 Capsule Collider를 사용할 것입니다.

3.1 캐릭터 모델 임포트하기

먼저, 자신의 캐릭터 모델을 Unity 프로젝트에 임포트합니다. 임포트 후에는 기본 프리팹으로 변환해야 합니다.

3.2 플레이어 프리팹 만들기

  1. 캐릭터 모델을 씬에 배치합니다.
  2. Rigidbody와 Capsule Collider를 추가합니다.
  3. PhotonView를 추가하고 Observable 속성을 설정합니다.
  4. 필요한 경우 애니메이션 컨트롤러를 설정하여 캐릭터 애니메이션을 관리합니다.

4. 플레이어 움직임 및 동기화 구현

플레이어의 움직임을 제어하는 스크립트를 작성하여, 각 플레이어의 위치 및 방향을 동기화합니다. 다음은 PlayerController 스크립트 예제입니다.


using UnityEngine;
using Photon.Pun;

public class PlayerController : MonoBehaviourPunCallbacks
{
    float speed = 5.0f;
    void Update()
    {
        if (!photonView.IsMine) return;

        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        transform.position += movement * speed * Time.deltaTime;
        
        // 이동 방향에 따라 캐릭터 회전
        if (movement != Vector3.zero)
        {
            transform.rotation = Quaternion.LookRotation(movement);
        }
    }
}

4.1 동기화 및 보간 처리

위의 코드에 플레이어 캐릭터 간의 동기화를 추가하려면 PhotonTransformView를 추가하여 각 플레이어의 위치 및 회전 데이터를 자동으로 동기화할 수 있습니다.

5. 공격 시스템 구현

플레이어 간의 공격을 처리하기 위해 레이캐스트를 사용하여 적중 여부를 판단하고, 공격 처리를 위한 메커니즘을 만들겠습니다.

5.1 공격 애니메이션 설정하기

캐릭터의 공격 애니메이션을 Unity 애니메이션 시스템을 통해 설정합니다. 공격할 때 애니메이션이 재생되고 적과의 충돌을 감지할 수 있어야 합니다.

5.2 공격 로직 구현하기


using UnityEngine;
using Photon.Pun;

public class Attack : MonoBehaviourPunCallbacks
{
    public float attackRange = 1.0f;
    public LayerMask enemyLayer;

    void Update()
    {
        if (!photonView.IsMine) return;
        
        if (Input.GetKeyDown(KeyCode.Space))
        {
            AttackEnemy();
        }
    }

    void AttackEnemy()
    {
        RaycastHit hit;
        if (Physics.Raycast(transform.position, transform.forward, out hit, attackRange, enemyLayer))
        {
            // 적중 처리
            Debug.Log("Enemy hit: " + hit.collider.name);
        }
    }
}

6. 멀티플레이어 및 동기화 처리

각각의 플레이어가 공격을 수행할 때, 그 결과를 네트워크로 동기화해야 합니다. 이를 위해 RPC(Remote Procedure Call)를 사용하여 특정 메서드를 모든 플레이어에게 호출합니다.

6.1 RPC를 통한 공격 동기화


[PunRPC]
public void PerformAttack()
{
    // 공격 애니메이션 재생
    // 적중 여부 처리
}

6.2 RPC 호출하기


void AttackEnemy()
{
    // 적중 로직
    photonView.RPC("PerformAttack", RpcTarget.All);
}

7. 게임 종료 및 결과 처리

모든 플레이어의 생명 및 게임 오버 상태를 자동으로 동기화하려면, 각 플레이어의 상태를 관리하는 스크립트를 작성해야 합니다. 이 단계에서는 승리 또는 패배 조건을 설정하고 결과를 네트워크로 송신합니다.

7.1 생명 관리 및 게임 종료 처리


public class GameManager : MonoBehaviourPunCallbacks
{
    public int playerLives = 3;

    public void PlayerDied()
    {
        playerLives--;
        if (playerLives <= 0)
        {
            photonView.RPC("GameOver", RpcTarget.All);
        }
    }

    [PunRPC]
    public void GameOver()
    {
        Debug.Log("Game Over");
        // 게임 결과 처리 코드
    }
}

8. 결론

본 강좌를 통해 유니티에서 멀티플레이어 게임의 플레이어 동기화 및 공격 시스템을 구현하는 방법을 배웠습니다. 각 단계는 네트워크 프로그래밍과 게임 로직 처리의 이해를 높이는 데 도움이 됩니다. 유니티의 기능을 활용하여 더욱 고도화된 게임을 개발할 수 있습니다. 이제 사용자 정의 캐릭터와 공격 메커니즘으로 멀티플레이어 프로젝트를 더욱 발전시킬 수 있습니다.

이 강좌가 유니티를 통한 멀티플레이어 게임 개발에 도움이 되길 바랍니다. 추가적인 질문이나 더 깊이 있는 내용을 원하신다면 댓글을 남겨주세요. 여러분의 게임 개발 여정에 많은 성공이 있기를 기원합니다!