LocalTime and ServerTime 서버와 클라이언트, 클라이언트끼리는 커뮤니케이션이 동시에 이뤄질 수 없습니다! (RPC와 NetworkVariable이 즉각적으로 다른 컴퓨터에 반영되지 않는 이유) NetworkTime은 이러한 Transmission Delay를 고려해줍니다! LocalTime은 클라이언트가 서버보다 앞서있습니다! 클라이언트 권한이 있는 개체에 사용됩니다 ServerTime은 서버가 클라이언트보다 앞서있습니다! 서버 권한이 있는 개체에 사용됩니다 Examples 맵의 오브젝트들은 NetworkTransform 컴포넌트 없이 움직임을 동기화할 수 있습니다! using Unity.Netcode; using UnityEngine; public class MovingPlatform..
using UnityEngine; [RequireComponent(typeof(Rigidbody))] public class Movement : MonoBehaviour { private Rigidbody _rigidbody; [SerializeField] private float _moveSpeed = 2f; [SerializeField] private float _jump = 2f; //rotation private float _targetRotation = 0.0f; private float _rotationVelocity; public float RotationSmoothTime = 0.12f; private GameObject _mainCamera; private void Awake() { if..
NetworkObject Visibility이란?Object (NetworkObject) visibility는 Netcode에서 사용하는 용어로써, 하나 이상의 클라이언트들에게 보여지고 있는지 사용됩니다 Visibility사용하기Visibility을 사용하는 한 가지 방법은 NetworkObject.CheckObjectVisibility callback을 등록하는 것입니다. 아래의 예시를 보면 콜백이 NetworkObject가 클라이언트에게 보이는지를 결정하기 위해 사용되는 파라미터로서 클라이언트 식별값(ClientID)을 포함하고 있는 것을 볼 수 있습니다. 보여지고 있는지 확인하는 방법으로는 NetworkObject.CheckObjectVisibility에 Callback을 등록하는 것입니다!Netw..
NetworkVariable 이란? NetworkVariable 는 RPC나 Custom Message 사용 없이 서버와 클라이언트간에 값을 동기화해주는 방법입니다! NetworkVariable 는 제너릭 형태로 값을 저장합니다! NetworkVariable.Value가 동기화 되는 상황 뒤 늦게 참여하는 클라이언트 : 자동으로 NetworkVarialbe 값이 동기화 됩니다 연결 된 클라이언트 : Network.OnvalueChanged event를 구독중인 클라이언트는 변화됨을 알림을 받습니다. Network.OnvalueChanged를 구독중인 callback 함수는 2개의 파라미터를 전달 받습니다 First Parameter(Previous) : 변화되기 전의 값 Second Parameter(C..
NetworkBehaviour NetworkBehaviour은 네트워크를 거쳐 메세지를 보내거나 상태 동기화를 위해 NetworkVariable과 RPC를 사용할 수 있습니다 2023.03.15 - [Unity - GamingService/Netcode for GameObjects] - 유니티 Netcode for GameObject, NetworkObject NetworkBehaviour 컴포넌트가 붙어 있는 게임오브젝트가(혹은 부모오브젝트가) Network Ojbect컴포넌트를 가지고 있지 않다면 게임오브젝트에 자동으로 NetworkObject컴포넌트를 추가합니다! NetworkBehaviour 는 MonoBehaviour로부터 파생된 추상 클래스입니다 MonoBehaviour Updates Netw..
Netcode를 사용하는 모든 게임 오브젝트는 아래 두 가지 컴포넌트를 가지고 있어야합니다! 1. NetworkObject 2. NetworkBehaviour NetworkObject Netcode 게임오브젝트는 반드시 NetworkObject 컴포넌트를 가지고 있어야 하며 적어도 NetworkBehaviour 컴포넌트를 하나 가지고 있어야 합니다 NetworkObject가 스폰될 때, 최초로 NetworkObjct.GlobalObjectIdHash 값이 정해집니다! NetworkBehaviours NetworkObject와 관련된 그들만의 커스튬 Netcode 로직을 만들기 위한 틀이라고 생각하시면 됩니다 Ownership NGO는 서버권위적이므로, 서버가 Network Object의 Spawn & D..
HandShake는 클라이언트의 NetworkConfig가 서버의 NetworkConfig에 일치됨을 보장합니다 NetworkManager 또는 NetworkManager.NetworkConfig.ConnectionApproval를 true로 코드 세팅함으로써 ConnectoinApproval를 가능하게 할 수 있습니다Connection Approval는 연결별로 연결을 허락할지 말지 결정할 수 있게 해줍니다 Connection approval는 기본적인 NetworkManager에 플레이어마다 기본적으로 등록한 Player Prefab에 override를 허락해줌으로써, 특정한 Player Prefab을 만드는 것 또한 가능하게 해줍니다NetworkManager의 ConnectionApproval의 속..
이 그림은 미드저니를 이용하여 만든 사진입니다 뭐가 문제지? 라고 생각하실 수 있겠지만! 코가 2개입니다!!!!!!!! 이렇게....AI를 맹신하면 안됩니다.... 최근에 바둑AI가 인간 바둑 기사에게 망신 당한 사실을 다들 아시나요? 출처 : https://www.youtube.com/watch?v=Kv23z_9X3_M / 유튜버 : 김성룡 바둑랩 요즘 ChatGPT니 빙AI 등... AI가 진짜 완벽하고 엄청 정확한거 같지만 아직까진 완벽하지 않습니다! 실제로 AI를 만든 회사에서도 맹신하지말고 참고하는 용도로만 사용하라고 했습니다! 다들 AI때문에 일자리 잃는걸 두려워 하시기 보다는 AI를 도구로 활용해서 일의 효율성을 늘리는 Mind를 가지시는게 어떨까요?
# Dictionary란? var dictionary = new Dictionary(); dictionary.Add("Name", "KinJinwoo"); var name = dictionary["Name"]; Debug.Log(name); Dictionary 구조로 되어 있습니다 도서관을 예시로 들면, 컴퓨터로 책 제목을 치면 위치를 얻을 수 있습니다 즉, Key와 Value를 사용하여 자료를 저장합니다 중복 를 허용하지 않습니다 위 코드를 예시로, dictionary에 Name이라는 Key값을 저장했으므로, 또 다시 Name이라는 Key값을 Add할 수 없습니다! 제네릭으로 TKey와 TValue의 타입을 미리 정할 수 있어 박싱과 언박싱이 발생하지 않습니다 위 코드에는 TKey와 TValue 타입이..
Lifetime Overview VContainer 코드를 살펴보면 Register(Lifetime. ~) 이런 구문을 본적이 있을 것입니다! 이때 Lifetime에는 총 3가지의 옵션이 있는데 첫 번째, Singleton 두 번째, Transient 세 번째, Scoped 이렇게 있습니다 차례대로 살펴보겠습니다! Singleton은 모든 컨테이너에 단 하나의 인스턴스입니다! 똑같은 Type은 같은 컨테이너에 등록될 수 없습니다! Transient 은 Resolving당 하나의 인스턴스입니다 Scope는 LifetimeScope당 하나의 인스턴스 입니다 LifetimeScope가 하나만 존재한다면, 싱글톤과 비슷합니다 만약 LifetimeScope 자식을 만든다면, 그 인스턴스는 각 자식마다 달라집니다 ..
Register를 사용하기 위해서는 다양한 방법이 존재합니다 class ServiceA : IServiceA, IInputPort, IDisposable { /* ... */ } Register Concrete Type builder.Register(Lifetime.Singleton); 위 코드는 다음처럼 풀어낼 수 있습니다 class ClassA { public ClassA(ServiceA serviceA) { /* ... */ } } Register as Interface builder.Register(); 위 코드는 다음처럼 풀어낼 수 있습니다 class ClassA { public ClassA(IServiceA serviceA) { /* ... */ } } Register as multiple..
IObjectResolver를 통해 직접적으로 DI Container에 접근할 수 있습니다! VContainer는 자동으로 IObjectResolver를 등록하고 필요한 곳 어디든지 Inject합니다! 그래서, 다른 dependency에서 얻는 것처럼 IObjectResolver을 얻을 수 있습니다! class ClassA { public ClassA(IObjectResolver container) { // Get (or create) whatever is registered as ServiceA. // This might be a subclass if you registered the // subclass as a ServiceA. var serviceA = container.Resolve(); // ..
MonoBehaviours는 생성자를 지원하지 않으므로, Method Injection을 사용해서 의존성을 inject해야합니다 모노비헤이비어의 함수에 [Inject] 속성을 달아둔다고 해서, 자동으로 호출되는 것은 아닙니다!!! 다음 3가지 방법을 통해 수동적으로 의존성을 Inject할 수 있습니다 #1. 특정 모노비헤이비어를 Inject를 하기 원하면 LifeTimeScope의 인스펙터에 지정하면 된다! 모든 지정된 게임오브젝트의 모노비헤이비어는 자동으로 LifeTimeScope가 초기화될 때 Inject될 것이다! #2. RegisterComponent의 함수 중 하나를 사용하여 컨테이너에 Monobehavior의 인스턴스를 등록해라. - 이 경우, 등록된 모노비헤이비어는 다른 클래스들에 Injec..
종속성은 프로퍼티나 필드 또한 Injection할 수 있다! Injection하기 위해서는 [Inject]를 달아주면 된다!class ClassA { [Inject] IServiceA serviceA { get; set; } [Inject] IServiceB serviceB; public ClassA() { } }프로퍼티와 필드에 Injection하는 것은 Method Injection을 대안하는 방법으로 사용할 수 있다! 2023.03.10 - [Unity/VContainer] - 유니티를 위한 DI 프레임워크 VContainer, Method Injection
만약 생성자에 Injection을 하지 못하는 경우라면, 함수에다가 대신 Injection을 사용하는 것을 고려해보면 된다! 주로 모노비헤이비어에서 유용하게 많이 쓰인다! public class SomeBehaviour : MonoBehaviour { float speed; [Inject] public void Construct(GameSettings settings) { speed = settings.speed; } } 생성자가 아닌 Construct 함수에서 Injection되는 것을 볼 수 있다! [Inject]가 달린 함수는 어떠한 이름이나 어떠한 접근 레벨도 가질 수 있다!
일반적으로, 종속성은 처음에 Resovle 될 때 구성되고 주입됩니다 종속성이 필요한 클래스가 등록될 때, 생성자를 제공합니다(매개인자를 받음으로) class ClassA { readonly IServiceA serviceA; readonly IServiceB serviceB; readonly SomeUnityComponent component; public ClassA( IServiceA serviceA, IServiceB serviceB, SomeUnityComponent component) { this.serviceA = serviceA; this.serviceB = serviceB; this.component = component; } } 위 코드처럼, ClassA라는 생성자에 serviceA, ..
[VContainer이란?] VContainer는 Unity를 위한 가볍고 빠른 DI(Dependency Injection) 프레임워크로, 종속성 및 개체 생성을 쉽게 관리할 수 있도록 도와줍니다. DI는 종속성의 생성 및 관리를 분리하는 프로그래밍 디자인 패턴입니다. VContainer의 주요 기능 중 하나는 성능입니다. 다른 종속성 주입 프레임워크와 달리 VContainer는 런타임이 아닌 컴파일 타임에 코드를 생성합니다. 전반적으로 VContainer는 Unity 프로젝트의 아키텍처를 단순화하고 개선하는 데 도움이 되는 강력하고 가벼운 DI 프레임워크입니다. 유니티(Unity) 인터페이스(Interface) 완전 쉽게 설명 먼저 인터페이스가 무엇인지 알고 시작해야합니다 인터페이스를 구글링하면 뭐 U..
Async 란? 비동기 방식을 사용할 때 사용하는 "키워드"입니다. 비동기란? "비동기"는 대기하거나 특정 주문에 묶이지 않고 작업을 수행하는 것을 의미합니다. 친구와 카톡을 하고 있다고 가정하고 할 수 있는 작업이 2가지 있다고 상상해 보겠습니다. 카톡을 하는데 친구가 말을 마칠 때까지 기다려야 한다. 친구가 카톡 입력을 마칠 때까지 기다리지 않고 바로 카톡을 답장한다. 첫 번째 작업에서는 조치를 취하기 전에 어떤 일이 발생하기를 기다리기 때문에 "동기적으로" 작업을 수행합니다. 두 번째 작업에서는 상대방이 완료할 때까지 기다리지 않고 바로 응답할 수 있기 때문에 "비동기적으로" 작업을 수행하고 있습니다. 특정 상황에 얽매이지 않고 그동안 멀티태스킹이나 다른 일을 할 수 있습니다. 컴퓨팅 또는 프로그래..