티스토리 뷰

Unity Network Tutorial

유니티로 네트워크 게임을 만드려고 한다. 한 명의 유저가 Host Server가 되고, 다른 유저가 Client가 되는
P2P 게임을 만들 것이다.
유니티는 Network Component 중 Network Manager를 제공한다

Create Empty GameObject하고, Network Manager와 Network Manager HUD Component를 Add했다
Player Prefab을 만들고, Network Manager에서 설정해주었다
Network Manager HUD: 네트워크 매니저를 컨트롤하기 위한 개발용 GUI

Player Prefab은 위와 같이 생성하였다 (Cannon)

로컬게임에서는 키보드 WASD 입력에 따라 Transform.Translate() 함수만 사용하면 됐었다
거기에서 Network Manager만 추가한 후, 게임을 실행해보면
자신의 화면에는 자신의 움직임만 보이고, 상대방의 움직임은 보이지않는다

즉, 서로의 움직임이 상대방에게도 보이도록 하려면 별도의 설정이 필요하다

위는 Cannon Prefab의 Inspector에서 확인할 수 있는 Component들이다
Networm Transform: 내 player object의 transform을 상대방에게도 sync하기 위한 컴포넌트
Network Identity: Network Transform을 사용하기 위하여 필요

부드러운 움직임을 위하여 Network Send Rate를 높여주고
Player object은 Server가 아닌 각 유저의 소유이므로 Local Player Authority에 체크해주었다

추가적으로 키보드 입력에 따라 player object를 움직이는 Player Controller라는 스크립트를 
별도로 구현하여 Add하였다
그 코드는 다음과 같다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
 
public class PlayerController : NetworkBehaviour
{
    //public const int MAP_SIZE = 50;
 
    [SerializeField]
    int SPEED; // 움직임 속도
    [SerializeField]
    GameObject personalCam; // 1인칭 카메라
 
    void Start ()
    {
        if (!isLocalPlayer)
            return;
 
        //transform.position = new Vector3(Random.Range(-MAP_SIZE, MAP_SIZE), 1.8f, Random.Range(-MAP_SIZE, MAP_SIZE));
 
        // 1인칭 카메라 생성
        if (personalCam)
            Instantiate<GameObject>(personalCam, transform, false);
    }
    
    void Update ()
    {
        // if not local player, then return
        if (!isLocalPlayer)
            return;
 
        // get input
        float v = Input.GetAxis("Vertical");
        float h = Input.GetAxis("Horizontal");
 
        // Keyboard: W, S
        transform.Translate(Vector3.forward * v * SPEED * Time.deltaTime);
        // Keyboard: A, D
        transform.Translate(Vector3.right * h * SPEED * Time.deltaTime);
    }
}
 
cs

로컬게임과 달리 Monobehaviour가 아닌, UnityEngine.Networking.NetworkBehaviour를 상속받는다
그리고 isLocalPlayer일 때만 코드가 실행되게 하였다
isLocalPlayer를 사용하지 않으면? 키보드를 눌렀을 때 내 플레이어가 움직이는 게 아니라
모든 플레이어가 움직인다

이유는? 키보드를 눌렀을 때, 내 player object와 상대방 player object 둘다 동일하게 반응하기 때문이다
내 player object만 반응하도록 isLocalPlayer를 체크해야한다

이제 게임을 실행해보면 우리가 원하는대로 캐릭터가 움직이는 것을 확인할 수 있다


다음 포스팅은 네트워크 게임에서 총을 발사하는 방법에 대한 내용이다
Transform과 마찬가지로, Shoot()을 콜했을 때 자신의 화면에서만 동작한다
Shoot()의 동작은 다음과 같다
Shoot() -> Instantiate(bulletPrefab)

이것을 해결하기 위한 솔루션은, Server(Host 유저)에게 Instantiate(bulletPrefab) command를 보내는 것이다
자세한 내용은 다음 포스팅에서 다루도록 하겠다

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함