분류 전체보기 297

Session_2

이전 포스트에 이어서 계속 만들어보겠습니다.이번에는 Session이 아닌 클라이언트의 Connect 요청에 집중하는 Server의 Listener를 수정해보겠습니다.기존의 Main 코드에서 수행하던 Accept를 이제 Listener에서 수행해보도록 하겠습니다.이를 통해, 클라이언트가 아닌 서버가 수행하는 구조를 만들 수 있습니다. 1) Listenerclass Listener{ Socket _listenSocket; // Action과 다르게 리턴값이 존재하는 Func, 제네릭 자료형이 곧 리턴형이다 Func _sessionFactory; // Server의 Client 소켓의 초기 상태를 설정 public void Init(IPEndPoint endPoint, Func s..

C# 2024.12.24

Session_1

이번 포스트에서는 기존의 Listener 예제에 Session을 추가하는 방식으로 멀티 네트워크를 구현하겠습니다.그리고 기존의 Listener의 역할을 조금 더 확대하여Listener에서 Accept를 수행하도록 하겠습니다.이런 방식으로 수정하는 경우, 클라이언트가 아닌 서버에서 안전하게 멀티 네트워크를 개시할 수 있습니다. 1) Session일단 현재 만들어진 세션은 서버에서만 동작할 예정입니다.세션은 크게 2가지의 역할을 수행합니다. 서버에서 클라이언트로 데이터를 전송 = Send클라이언트에서 전송된 데이터를 서버에서 받음 = Recv 따라서 위의 2가지 역할을 수행하기 위한 코드를 만들어보겠습니다.abstract class Session{ Socket _socket; // 만약, 클라이언..

C# 2024.12.24

유니티 입력 처리 심화 - (3) Action Asset 방식_01

지난 포스트에서는 임베디드 방식을 통해 입력을 처리하는 방식을 배워보았습니다.임베디드 방식의 경우, 입력 장치에서 받아온 값을 바로 C# 스크립트로 처리할 수 있어구현이 간단하고 편리하지만, 게임의 규모가 커질 수록입력을 다양한 방법으로 처리하지 못한다는 단점이 있습니다. 이번 포스트에서는 기존의 간단한 게임에서의 입력 처리 방식이 아닌규모가 있는 게임에서의 입력 처리 방식 중 하나인 Action Asset을 통한 입력 처리를 알아보겠습니다. 1) Action Asset Action Asset은 위와 같이 동작하게 됩니다.정확히 말하면, Action Asset이라는 입력을 처리하는 명세서를 만들고해당 명세서에서 입력 동작 방식 + 입력 처리 방법 + 입력 반환 값등을 규정할 수 있습니다. 2) Actio..

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (22) GameplayTag 기초

GameplayTag는 GAS 뿐만이 아닌 다른 경우에서도 매우 유용하게 사용할 수 있습니다.GameplayTag는 열거형이지만, 훨씬 더 체계화되고 정교해진 열거형이라고 생각하시면 됩니다. GAS에서 GameplayTag는GameplayTag Container안에 저장되고, GameplayTag Manager에 의해 관리됩니다. 뿐만 아니라 GameplayTag는 블루 프린트가 아닌 C++ 단계에서도 사용이 가능한데인터페이스인 IGameplayTagAssetInterface로 사용할 수 있습니다.사용가능한 메서드는 대표적으로 GetOwnedGameplayTags - 갖고 있는 GameplayTag를 가져옴HasMatchingGameplayTag - 지정한 특정 GameplayTag를 갖고 있는지 확인H..

Listener

기존의 소켓 프로그래밍 예제에는 치명적인 문제가 남아있습니다.치명적인 문제점은 바로 블로킹 즉, 동기 방식으로 서버가 클라이언트의 Connect 요청에 Accept를 수행한다는 것입니다. 동기 방식에서는 서버가 Connect 요청이 오기전그러니까 서버가 Accept를 수행하기 전까지는 다른 작업을 하지 않고 계속 기다리게 됩니다.그리고 이는 작업을 처리하는데 있어서 낭비로 이어지게 됩니다. 따라서 기존의 코드를 수정하여 논블로킹, 즉 비동기 방식으로 변경하여클라이언트로부터 Connect 요청이 오는 경우, Accept를 수행하고그렇지 않은 경우 다른 작업을 수행하는 방식으로 변경하겠습니다. 코드 작업을 하기 전,간단하게 동기와 비동기 방식을 시각적으로 표현해보았습니다. - 동기 방식(=블로킹) 서버에서 ..

C# 2024.12.18

2D RPG - (10) 스켈레톤 만들기 (마무리)

1) 경계 상태를 의미하는 SkeletonStateEngagepublic class SkeletonStateEngage : EnemyState{ // 경계 상태를 의미하는 SkeletonStateEngage SkeletonController _skeletonController; Transform _player; float _moveDir = 1; public SkeletonStateEngage(EnemyController enemyBaseController, EnemyStateMachine enemyStateMachine, string animatorBoolParamName, SkeletonController enemyController) : base(enemyB..

2D RPG - (9) 스켈레톤 만들기 (1)

이제 기존의 Enemy 3총사를 사용하여새로운 적인 Skeleton을 만들어보겠습니다. 기존의 코드에서 볼 수 있듯이 새로운 적의 타입별로 Controller가 필요하므로 이를 수행하겠습니다. 1) SkeletonControllerpublic class SkeletonController : EnemyController{ // Skeleton States public SkeletonStateIdle _idleState { get; private set; } public SkeletonStateMove _moveState { get; private set; } public SkeletonStateEngage _engageState { get; private set; } public..

2D RPG - (8) 적을 위한 세팅

이번에는 플레이어를 공격할 적을 만들어보겠습니다.그전에 플레이어와 적은 어느정도 공통적으로 사용하는 부분이 존재합니다.이를 해결하기 위해 플레이어와 적 모두 공통적으로 상속받는 클래스를 하나 만들겠습니다. 1) 플레이어와 적의 공통 부모인 BaseCharacterControllerpublic class BaseCharacterController : MonoBehaviour{ [Header("Collision Info")] [SerializeField] protected Transform _groundCheck; [SerializeField] protected float _groundCheckDistance; [SerializeField] protected Transf..