# Tutorial

<https://fish-networking.gitbook.io/docs/tutorials/getting-started>

#### 연결 생성

* `NetwrokManager` 아래에 있는 `NetworkHudCanvas`에서 Auto Start Type을 Host로 변경

#### 플레이어 생성

* 게임 오브젝트 하나 만들고 `NetworkObject` 컴포넌트 추가한 뒤 프리팹화
* `NetworkManager` 오브젝트 > `PlayerSpawner` > Player Prefab에 할당
* 빈 게임 오브젝트를 위치 지정 후 Spawns에 할당
* 플레이하면 1개만 스폰되는게 정상. 빌드 만들어서 켜면 자동으로 연결돼서 2개 스폰됨.

#### 클라 검증 이동

* 플레이어에 `NetworkBehaviour` 상속받은 클래스 스크립트 붙여서 움직이게 한다
* 네트워크 오브젝트의 크기, 회전, 위치, 부모 정보를 동기화시키는 `NetworkTransform` 컴포넌트를 플레이어에 추가
* Client Authoritative랑 Synchronize Position enabled 돼있어야 함

#### 개체 스폰/디스폰

* FishNet은 모든 network object 프리팹을 `Spawnable Prefabs`라는 배열에 저장함. NetworkManager에 있음.
* 큐브 만들어서 `NetworkObject` 컴포넌트 붙인 다음 프리팹화
* `NetwrokBehaviour` 상속받은 스크립트를 플레이어에 붙여서 큐브 생성 로직 추가
  * `NetworkObject`가 fishnet의 `ServerManager`에게 이 물체 스폰하라는 뜻. 서버가 연결된 모든 클라와 나중에 연결된 클라에게 이 오브젝트 복사본을 생성하라고 지시한다.
* Rigidbody 추가하면 완벽하게 큐브 위치 sync되진 않음. `Spawn()` 때 FishNet이 자동으로 sync해준 이후로 sync하지 않았기 때문.
* `OnStartServer` 메서드에 코루틴 호출해서 시간 지나면 오브젝트 없어지게 함. `OnStartServer`는 오브젝트가 네트워크에 초기화될 때 서버에서 호출됨. Despawn()은 서버에서 호출해야 함.

#### SyncVar로 색깔 싱크

* `public readonly SyncVar<Color>` 변수 선언. readonly지만 get set 가능.
* syncVar color의 `OnChange`에 색깔 바꾸는 메서드 구독.
* 큐브 만든 후에 Spanw() 전에 syncVar color 바꾸면 연결된 클라에도 색깔 바뀐다

#### 카메라 세팅

멀티 플레이에서 카메라 설정은 복잡해보이지만, 실은 로컬 플레이어 하나 당 카메라 한 개만 있으면 된다.

1. 로컬 카메라 생성
   * 메인 카메라를 프리팹화한다
   * 플레이어 프리팹에 카메라 위치용 빈 게임 오브젝트 생성
   * `OnStartClient`에서 isOwner라면 Instatiate하는 스크립트 추가
   * OnStartClient : 이 오브젝트가 생성될 때 클라에서 한 번 실행됨
2. 씬 카메라 이용
   * 메인 카메라에 MainCamera 태그 확인
   * 플레이어 프리팹에 카메라 위치용 빈 게임 오브젝트 생성
   * `OnOwnershipClient`에서 IsOwner라면 Camera.main을 설정하는 스크립트 추가
   * OnOwnershipClient : ownership 얻거나 잃을 때 호출됨
3. 시네머신 기본 설정법
   * 메인 카메라에 시네머신 브레인 추가
   * 플레이어 프리팹에 카메라 위치용 빈 게임 오브젝트 생성하고 Cinemachine Camera 컴포넌트 추가
   * `OnStartClient`에서 cinemachineCamera.enabled = IsOwner;하는 스크립트 추가

#### 원격 기기 접속

1. 서버의 IP 주소 확인
   * Local Network (LAN) : 서버와 클라가 동일한 로컬 네트워크에 있다면, 서버 기기의 로컬 IP를 알아야 함. 운영체제의 네트워크 세팅 보면 알 수 있다. (ipconfig로 활성화된 네트워크 어댑터의 IPv4 주소를 봐라.)
   * Public Network (Internet) : 클라들이 인터넷에 연결돼있으면 서버의 public IP 주소를 알아야 한다. 주로 서버가 연결돼있는 라우터의 IP 주소이다. 서버 라우터에 port forwarding을 해서 게임 서버 포트에 들어오는 연결을 허용해야 한다
2. 클라 연결 설정
   1. NetworkManager에서 Transport 컴포넌트를 찾는다. (기본은 Tugboat이다. 없으면 추가.)
   2. Transport 컴포넌트의 `Client Address` 필드를 찾아서 remote server의 주소를 적어라.
   3. 기본 포트 말고 다른 포트 쓸거면 Port 필드 변경해라.
3. 빌드 후 연결 테스트
   1. 빌드한 후에 에디터, 로컬 빌드, 서버 빌드 아무데서나 기기를 하나 실행하고 서버로서 작동하게 한다. 데디케이티드 서버 빌드라면 FishNet server가 자동으로 실행될거고, 아니라면 NetworkHudCanvas Server 버튼이나 Autostart 옵션, 또는 코드에서 직접 시작해야 한다.
   2. auto-start를 비활성화했다면, Start Client 버튼을 눌러라.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lazyartisan.gitbook.io/note/main-page/r-and-d/fishnet/tutorial.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
