일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백트래킹
- DFS
- 브루트포스
- 다익스트라
- 투 포인터
- 트리
- 유니티
- VR
- 백준
- 다이나믹 프로그래밍
- 누적 합
- 시뮬레이션
- XR Interaction Toolkit
- 수학
- 재귀
- 유니온 파인드
- 그래프
- 스택
- 우선순위 큐
- Unreal Engine 5
- 정렬
- Team Fortress 2
- 문자열
- 구현
- c++
- 알고리즘
- 그리디 알고리즘
- BFS
- ue5
- 자료구조
- Today
- Total
목록유니티/C# 서버 연동 유니티 포트폴리오 (18)
1일1알
채팅은 서버에서는 크게 하는건 없다.후에 파티 시스템도 만드는데, 만약 가입한 파티가 없다면 플레이어가 속한 Room의 모든 플레이어에게 해당 채팅을 다시 전송하고, 가입한 파티가 있다면 파티원들에게 채팅을 전송해준다. 클라이언트에서는 채팅 패킷을 받으면 채팅 메세지 UI를 만들고 채팅UI에 있는 Scroll View의 Content의 자식으로 붙여준다. 그냥 추가만 해주면 스크롤바가 위로 올라가는데, 이를 방지하기 위해 추가할때마다 스크롤바의 value를 0으로 설정하여 스크롤바가 올라가지 않도록 해주었다. Enter로 채팅을 전송한 뒤 게임 화면을 클릭하지 않으면 InputField에서 포커스가 풀리지 않아서 움직이다가 채팅창이 갑자기 켜지는 현상이 있었는데, 이것을 해결하느라 삽질을 좀 많이 했다...
몬스터의 Hp가 0이되면 디스폰되고, 잠시 뒤 몬스터의 스폰 위치에 다시 스폰된다.플레이어의 Hp가 0이되면 죽는 애니메이션을 재생해주고 잠시 뒤 Hp와 Mp를 회복시키고 리스폰 장소로 리스폰시킨다.
서버로부터 이동 패킷을 받으면 클라이언트에서는 Movement 클래스에서 해당 정보를 받아서 처리한다.패킷으로 온 목표 위치 정보와 방향 정보를 저장하고 Update문에서 서서히 움직이도록 한다.목표 위치 정보를 이용해 애니메이션도 재생해준다.단순히 움직이는 상태는 Locomotion이라는 상태로 지정했고, Blend Tree를 사용해 움직이는 방향에 맞도록 애니메이션이 재생되도록 하였다. 스킬 정보는 Json으로 저장하여 관리하였다.skillTime은 스킬이 시전되는 시간, delayTime은 스킬이 시전되고 애니메이션의 공격이 적중되는 시점까지 걸리는 시간이다.연속 공격을 구현한 방법이다.기본공격은 연속공격 4까지 있고, 예를들어 공격1 도중에 일반공격 입력이 들어오면 다음 공격을 예약해주고, 클라이..
몬스터 AI몬스터는 서버에서 6개의 상태로 관리를 했고, 상태가 바뀔때마다 몬스터와 같은 Room에 있는 클라이언트들에게 상태 변화 패킷을 보내 상태에 맞는 행동을 하도록 하였다. 몬스터의 상태는 Idle, Search, Trace, Skill, GetHit, Dead 이렇게 6가지로 나눠서 관리했다. Idle은 제자리에 가만히 있는 상태이고, 일정 틱마다 주변에 플레이어가 있는지 확인하여 있으면 Target으로 지정하고 Trace상태로 넘어간다. Search는 일정 범위 내에서 움직이면서 일정 틱마다 주변에 플레이어가 있는지 확인하여 있으면 Target으로 지정하고 Trace 상태로 넘어간다.주변에 플레이어가 없다면 Idle상태와 Search상태가 주기적으로 바뀐다. Trace상태에서는 Target으로..
멀티플레이 게임에서는 모두 같은 화면을 볼 수 있어야 하기 때문에 오브젝트들의 위치를 실시간으로 맞춰주어야 한다. 동기화 작업에는 크게 두가지 경우가 있다.하나는 클라이언트에서 먼저 움직인 뒤 서버에 확인을 받는 것이고다른 방법은 서버에 허락을 받고 움직이는 것이다. 반응성이 중요한 Fps같은 게임들은 주로 첫번째 방식을 사용하고, 비교적 덜 중요한 MMORPG같은 게임들은 주로 두번째 방법을 사용한다고 한다. 나는 두번째 방법을 사용했다. 매 프레임마다 서버와 패킷을 주고받을수는 없기 때문에 위치, 방향 정보 등을 이용해 위치를 예측하고, 어긋났다면 다시 조정해주는 등의 작업이 필요하다. 처음에 패킷을 설계할때는 이동 방향, 바라보는 방향 정보만 서로 주고받도록 했더니 플레이어가 움직일수록 위치가 어긋..
실시간 멀티플레이 게임은 서로의 모습이 보이는것이 기본이다.하지만 이 기본부터가 쉽지가 않다.서버와 클라의 오브젝트 정보들을 동기화하기 위해서 서로 오브젝트들의 정보를 관리하는 클래스가 필요하고, 클라에서는 씬마다 존재하는 오브젝트들이 다르기 때문에 서버에서는 이것을 GameRoom이라는 클래스로 클라의 씬에 대응되도록 관리하였다.또 자신의 컨트롤러와 다른 플레이어의 컨트롤러를 분리하는 등 필요한 작업이 많았다. 저번에 이어서 클라에서 씬 전환 완료 패킷을 서버로 보내면 서버에서는 해당 씬에 대응하는 Room에 플레이어를 입장시키고, 입장시키면 Room에서는 클라에 본인에게 자신의 정보(Enter 패킷)를 보낸다.그리고 이미 해당 Room에 있는 플레이어들의 정보를 보내준다(Spawn패킷). 그리고 이미..