유니티 부트캠프 8기/Ch07. 최종 프로젝트 9

Dead상태에서 관전모드(다른 플레이어의 카메라 동기화)

플레이어들은 CinemachineVirtualCamera를 가지고 있어서, 이를 통해 MainCamera를 조절한다Dead상태일때 Q, E 키를 입력하면, 이전, 다음 플레이어의 카메라를 보면서 관전하는 기능을 만들어보자 CinemachineVirtualCamera의 활성화를 통해 변경가능하다 나중에 활성화한 CinemachineVirtualCamera의 Status가 자동으로 Live로 바뀐다이때 기존 Live상태였던 CinemachineVirtualCamera는 자동으로 Stanby로 바뀐다 처음 1번은 자신의 플레이어만 CinemachineVirtualCamera가 활성화되어있어서다른 플레이어의 CinemachineVirtualCamera는 비활성화된 상태에서 시작한다null일때(첫번째)는 검색,..

유니티의 parent에 대해서

child, parent는 상속 구조가 아니다하이러키 뷰에서 보여주는 오브젝트 간의 위계관계다 이를 transform.SetParent() 를 이용하면 해당 오브젝트가 하이러키뷰에서 부모를 바꾼다 문제는 collider가 팔에 달려있어야하는데팔은 model의 구조를 깊이 들어가야한다그래서 collider를 상위 오브젝트에 옮기고 싶다문제는, 옮기게 되면팔이 움직일때 collider가 함께 움직이지 않는다는 점이다 이때 이런 방법을 쓰면 좋다단순히 parent로 사용할 transform만 저장하고, 하이러키뷰에서는 바꾸지 않는 방법이다 클래스에 Transform parent를 선언하고 해당 멤버변수에 parent로 사용할 transform을 저장한다그러면 원하는 떄에 transform.SetParent()..

플레이어의 구조 개선 2. State Machine 만들기

플레이어의 입력을 받고 상태를 바꾸려고하는데입력을 어떻게 처리해야할지 아직 해결이 되지 않았다 특히 서버에 정보를 보내고, 서버로부터 정보를 받는 것을 어떻게 해야하는지 아직 해결이 되지 않았다 오래 생각했다4월 13일 일요일 저녁에 생각났고, 수정했다 기존의입력을 받으면 PlayerInputHandler에 저장하고PlayerInputSender에서 서버로 전송을 하는것은 같다 이제 NetworkInputs에 기본상태인 Idle을 넣는다그러면 입력이 없는 상태는 Idle상태로 전송이 될 것이며 입력이 있는 경우PlayerStateMachine에서 상태를 변경하고, PlayerController에서 상태를 가져와서 업데이트하고PlayerInputSender에 변경된 상태를 대입하면 되지 않을까 생각이 들었..

플레이어의 구조 개선 1. Input 구조 개선

모든 예제는 구현을 우선해서 유지 보수를 신경쓰지 않는 문제가 있다photon fusion의 예시 또한 그렇게 되어있었다 생성부터 Input을 처리하는 과정을 구분하기로 했다 입력을 네트워크까지 전달하는 과정을 단일책임원칙(SRP)를 준수하는 방향으로 기능을 나누어본다📌 현재 구조 정리StandardSpawner: runner 객체를 생성InputManager: InputAction을 관리하고, 이벤트를 발행함PlayerInputHandler: 입력 상태를 NetworkInputData로 저장 (Fusion input pipeline용)PlayerInputSender: NetworkInputData를 네트워크로 전송 기존의 Spawner에서는 생성도 하고, 입력도 처리를 하고 있었다그래서 입력부분을 따..

플레이어의 카메라 구조 개선, HasInputAuthority, HasStateAuthority

예제 분석을 했는데https://imperor0103.tistory.com/278 플레이어의 구조(1인칭, 3인칭, Cinemachine, Collider)플레이어를 만들 때 유한 상태머신(Finate State Machine)을 적용하여 유한한 개수의 상태로 구성된 패턴을 만들고상태 전환에 따라 동작하는 동작 기반 시스템을 만들기로 하였다 FSM 구조의 장점1.imperor0103.tistory.com  1인칭 카메라가 너무 비효율적으로 분리되어있었다FirstPersonCamera카메라가 팔만 보여주고 있었고MainCamera가 나머지 오브젝트들을 보여주고 있었다 굳이 팔만 보여주는 카메라가 필요하지 않아서, Main카메라가 모두 담당하기로 했다 또한 Scene에 있는 MainCamera를 프리팹에 옮..

플레이어에 Input Action 적용, 멀티플레이 가능하게 만들기

네트워크의 경우 예제를 분석하기가 어려웠다 우선 작은 것부터 하나하나 만들어나가기로 했다 플레이어 둘 이상을 만들기 위한 최소한의 것들만 남겨놓고구조 바꾸기 쉬울 때 미리 생각해둔 구조로 만들어나가기로했다 결국 생성하는 부분은 NetworkRunner.Spawn 이다 /// 플레이어 오브젝트를 생성 NetworkObject networkPlayerObject = runner.Spawn(_playerPrefab, spawnPosition, Quaternion.identity, player);다른 프로젝트를 분석할 때도 잘 찾아보자 기존의 튜토리얼에서 박스 대신에 예제에 있던 프리팹을 사용하였고Input Action을 적용했다  event는 c# 스크립트를 적용했다  ..

플레이어의 구조(1인칭, 3인칭, Cinemachine, Collider)

플레이어를 만들 때 유한 상태머신(Finate State Machine)을 적용하여 유한한 개수의 상태로 구성된 패턴을 만들고상태 전환에 따라 동작하는 동작 기반 시스템을 만들기로 하였다 FSM 구조의 장점1. 객체지향의 다향성을 활용할 수 있고(상태별로 세부 로직을 다르게 재정의) 2. 복잡한 코드를 상태와 전환 조건으로 나누어 구현하므로 코드 유지 보수가 쉽다3. 다양한 동작을 유기적으로 결합하여 원하는 동작을 구현할 수 있다  예제의 플레이어 프리팹을 분석하자보기만 해도 카메라가 많아보인다1인칭과 3인칭 mesh가 함께 붙어있다또한, 노란색이 collider인 것 같다(유니티 collider는 초록색이었던 것 같은데?) mesh를 조금 더 자세히 알아보자먼저 내가 볼때는 1인칭만 나온다  상대방이 ..

Photon Fusion 실습 2. 튜토리얼 마무리

다음 내용을 Asset/Editor 폴더에 저장하면 Tools/Run Multiplayer 에서 최대 4명까지 플레이어를 생성할 수 있다 가장 왼쪽은 Host, 오른쪽 2개는 Player이런식으로 만들어진다 창모드 설정한다 using UnityEditor;using UnityEngine;public class MultiplayerBuildAndRun{ [MenuItem("Tools/Run Multiplayer/Win64/1 Players")] static void PerformWin64Build1() { PerformWin64Build(1); } #region Window [MenuItem("Tools/Run Multiplayer/Win64/2 Players"..

Photon Fusion 실습 1. 튜토리얼 3번까지

최종 프로젝트는 좀비 FPS를 만들기로 했다심지어 멀티플레이 포폴로 최상일 것 같아서 매우 기대된다 Photon Fusion을 사용하여 서버를 만들기로 했다 우리 팀장님께서 S2P(Server To Peer), P2P (Peer To Peer) 방식을 설명해주셨고요약그림피그마(figma)에서 직접 그려서 설명해주셨다!그림을 요약하면 S2P 방식은 오른쪽의 그림이며, 처음 접속한 플레이어가 host가 되어 서버의 역할도 한다모든 연산은 서버가 한다장점: 플레이어가 2명이니까 매 프레임 8*2 = 16개의 패킷(8입력 + 8출력)만 보내면 된다단점: host가 나가면, 모든 플레이어의 연결이 끊어진다 P2P 방식은 서버가 없고, 모든 플레이어들에게 정보를 보내면, 다른 플레이어들은 받기만 한다서버가 없다. ..