티스토리 뷰

유니티

UNET

tose33 2020. 12. 27. 12:23

* Unet은 현재 Unity에서 지원하지 않음.

따라서 직접 패키지 설치필요.

 

Window - Package Manager - 좌측상단 + 버튼 - Add Package from git URL - com.unity.multiplayer-hlapi

 

 

 

 

 

 

Network

네트워크 사용위해서는 Game Object에 Network Manager 컴포넌트 추가.

Network HUD 추가.

 

 

NetworkBehaviour 상속

using UnityEngine;
using UnityEngine.Networking;

public class Player : NetworkBehaviour {
    private const float Speed = 6f;
    private const float Rotspeed = 100f;

    void Update()
    {
        if (!isLocalPlayer) return; // 즉 Local player 아니라면 무시.

        float h = Input.GetAxis("Horizontal") * Rotspeed * Time.deltaTime;
        float v = Input.GetAxis("Vertical") * Speed * Time.deltaTime;

        transform.Rotate(0, h, 0);
        transform.Translate(0, 0, v);
    }
}

NetworkBehaviour 상속받고 if (!isLocalplayer) 즉 로칼플레이어가 아니라면 리턴해줘야 나의 오브젝트만 움직인다.

이렇게 하지 않으면 호스트, 클라이언트 즉 두개의 오브젝트가 있을때 키보드 눌렀을때 둘 다 동시에 움직임. (즉 버그)

 

키보드 누르면 자신의 개체만 움직임

 

Network Transform

Network Identity 를 가지는 오브젝트의 Transform을 동기화 시킴.

 

 

 

 

Network Object : local 에서 뿐만 아니라 모든 네트워크에서 나타나야 하는 Object.

 

A, B 컴퓨터가 있을때, B 컴퓨터에서 오브젝트를 생성시킨다고 하면, B에서 직접 생성이 아닌 서버(A컴퓨터)에게 생성해달라고 부탁하는 방식.

 

- Network Object는 네트워크 상에서 존재감을 가져야하므로

Network Identity를 component로 가져야함. 

 Network Identity의 Local Player Authority를 체크하면 이 으보젝트를 소유한 클라이언트가 오브젝트를 제어 가능.

 

- Network Object는 서버(호스트)에서 

그냥 Instantiate가 아닌 NetworkSever.Spawn 으로 오브젝트 생성.

 

- 클라이언트에 전달되어야할 명령으로서 함수는 [Command] 속성을 갖고, Cmd~~ 로 시작됨. 

[Command] 함수는 자신이 해당 함수를 직접 호출하지않고, Host에게 호출해 달라고 요청함.

 

using UnityEngine;
using UnityEngine.Networking;

public class Player : NetworkBehaviour {

    ...
    
    private void Update()
    {
        ... 
        
        if(Input.GetMouseButtonDown(0))
        {
            CmdCreateBox();
        }
    }

    [Command]
    void CmdCreateBox()
    {
        GameObject box = Instantiate(_box, transform.position, Quaternion.identity);
        box.GetComponent<Rigidbody>().velocity = transform.forward * 20f;
    }
}

 

 

모든 값의 동기화 :  모든 네트워크에서 값이 동기화되어야 할때

[SyncVar(hook = "OnChangeCount")]

int count = 0;

 

// hook : 해당 변수 변화 생기면 명시한 함수 자동 호출함.

'유니티' 카테고리의 다른 글

비활성화된 GameObject 찾기  (0) 2021.01.01
오브젝트 색상 변경  (0) 2020.12.31
키보드 입력으로 오브젝트 이동  (0) 2020.12.27
transform.position  (0) 2020.11.28
마우스 클릭한곳의 좌표, 오브젝트 생성  (0) 2020.10.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함