✅ 오늘의 백로그
1. 무당 방울 멀티 연동
2. 버그 수정
- 가이드북 열리지 않는 현상
- 이상현상이 스폰포인트에 중복으로 생성되는 현상
- 천우인이 벽이 아닌 공중에 스폰되는 현상
- 꽃신 로직
1. 무당 방울 로직 고민
우선 무당방울부터 어째서 왜 멀티가 되는 건지,
이걸 정말 믿을 수 있는 건지 확인해보아야 겠다.
근데 아무리봐도 왜 모든 클라이언트가 방울 소리를 들었는지 정말 모르겠다...
지금 내 환경에서 또 테스트 해보니까 안 들리는데 뭐지??...ㅠㅠ
하.. 아무튼 멀티때 잘 작동 되었다고 한들 이걸 너무 신뢰하지말고 동기화 작업을 해주어야겠다..
public class InventoryManager : NetworkBehaviour
{
// 생략..
[Networked] public int MudangBellRingCount { get; set; }
private int _prevMudangBellRingCount; // 새로운 입력인지 확인용
// 생략..
public override void Render()
{
// 생략
if (_prevMudangBellRingCount != MudangBellRingCount)
{
_prevMudangBellRingCount = MudangBellRingCount;
ApplyMudangBell();
}
}
public void OnUseItem(InputValue value)
{
// 생략..
if (data.itemName == "Lamp" && viewModel.TryGetComponent<IUsable>(out var usableItem))
{
usableItem.Use();
}
else if (data.itemName == "MudangBell")
{
RPC_RequestRingMudangBell();
}
else if (data.isInstallable && data.installPrefab != null)
{
itemPlacer.AttemptInstall(currentSlot.ItemID, currentSlot.UseCount);
}
else
{
RPC_UseItem(CurrentSlotIndex);
}
}
// 무당방울 로직
[Rpc(RpcSources.InputAuthority, RpcTargets.StateAuthority)]
public void RPC_RequestRingMudangBell()
{
var slot = SyncedSlots[CurrentSlotIndex];
var data = ItemDatabase.GetItemDataFromID(slot.ItemID);
if (data == null || data.itemName != "MudangBell")
return;
// 같은 값으로는 이벤트 감지가 안되니까 카운터 증가 방식 사용
MudangBellRingCount++;
}
private void ApplyMudangBell()
{
var viewModel = _viewModelInstances[CurrentSlotIndex];
var thirdPersonModel = _thirdPersonInstances[CurrentSlotIndex];
// 3인칭: 모든 클라이언트에서 보이는 무당방울
if (thirdPersonModel != null && thirdPersonModel.TryGetComponent<MudangBell>(out var bell3P))
{
bell3P.PlayBell();
}
// 1인칭: 아이템 소유자에게만 보이는 뷰모델
if (HasInputAuthority && viewModel != null && viewModel.TryGetComponent<MudangBell>(out var bellVM))
{
bellVM.PlayBell();
}
}
}
결국 기존에 다른 분이 Lamp를 구현하신 것 처럼 하드코딩하는 수 밖에 없는 거 같다.
나중에 확장성 고려하여 리팩토링될 염려가 있다 생각해서
Lamp 구현하신 것과 최대한 비슷하게 작성했다.
InventoryManager 내부를 내가 좀 뜯어고치고 싶었지만
괜히 그랬다가 잘 되던 다른 아이템들이 안될 수도 있고 당장 내일모레 발표니까 기능 구현에 목표를 두어야할 것 같다 😓
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
2. 버그 수정
1. 가이드북
멀티 환경에서 가이드북이 펼쳐지는게 작동되지 않아서 이부분을 해결해 주어야 한다.
내 생각엔 지금 ItemObject가 NetworkBehaviour를 상속받으면서
기존에 로컬로 구현된 부분이 작동되지 않는것 같다 생각한다.
도 맞는데
가장 중요한 문제점은 우선 씬에 Canvas가 없어서 그랬었다 캔버스부터 넣어주었고
마우스 휠을 돌리면 InventoryManager에서 손에 들고 있는 아이템이 바뀌는 로직이 있는데
책을 펼쳤을 땐 이부분은 막아놨는데 이제 멀티로 바뀌면서 연동이 안되고 있다.
public void Use()
{
var book = ResolveUIBook();
if (!book)
return;
// 책이 열려있으면 닫고, 닫혀있으면 열도록
_isOpen = !book.gameObject.activeSelf;
book.gameObject.SetActive(_isOpen);
if (_isOpen)
{
// 0페이지 부터 시작
book.currentPage = 0;
book.UpdateSprites();
}
// 인벤토리 휠 입력 정지/해제
InventoryManager targetInv = null;
var invs = FindObjectsByType<InventoryManager>(FindObjectsSortMode.None);
foreach (var inv in invs)
{
if (inv != null && inv.HasInputAuthority)
{
targetInv = inv;
break;
}
}
if (targetInv != null)
{
targetInv.SetScrollPaused(_isOpen);
// Debug.Log($"[GuideBook] 책 펼쳐짐 여부 {_isOpen}");
}
}
스크롤 입력은 HasInputAuthority == true인 플레이어의 InventoryManager에서만 처리되므로
가이드북에서 로컬 플레이어의 InvnetoryManager을 불러올 수 있도록 해주었다.
이렇게 수정해주니
Player 1이 책을 열면 > Player 1 인벤토리만 휠 제어가 true / false 되고 다른 플레이어 인벤토리는 건들지 않는다!
그런데 하나 더 발생한 문제는
책을 펼친 상태에서 드랍했을 때 책(캔버스)이 계속 펼쳐져있고 E버튼을 눌러도 책이 닫히지 않는다는 것!
// 아이템이 드랍되면 UI 정리
void OnDisable()
{
ForceClose();
}
// 가이드 북이 드랍되었을 때
void ForceClose()
{
var book = ResolveUIBook();
if (!book)
return;
// UI 끄기 + 페이지 0으로 초기화
if (book.gameObject.activeSelf || book.currentPage != 0)
{
book.currentPage = 0;
book.UpdateSprites();
book.gameObject.SetActive(false);
}
_isOpen = false;
// 열었을 때 휠 잠가둔 상태 복구 (로컬 인벤토리만)
var invs = FindObjectsByType<InventoryManager>(FindObjectsSortMode.None);
foreach (var inv in invs)
{
if (inv != null && inv.HasInputAuthority)
{
inv.SetScrollPaused(false);
break;
}
}
}
그래서 Disable될 때 자동으로 UI가 비활성화 되고 페이지도 0으로 돌아가도록 해주었다.
그런데 또 이렇게 해주니 생긴 문제가
여러번 주웠다 펼쳤다 버렸다를 반복 해보니까

이렇게 책 페이지가 0페이지에 잘 있지만
이전에 펼쳤던 페이지의 메쉬/클리핑 상태가 그대로 남아있어서 애니메이션 중간 상태가 보이는 현상이 있었다.
일단 이 부분은 기존 에셋 로직을 좀 뜯어고쳐야 하는 상황이라
팀원분들께 테스트할 때 가이드북 휠 넘기는 도중에 G를 누르지 말라 말씀드려야겠다...
나중에 책 애니메이션이 실행되는 중일땐 G키가 지연돼서 눌리도록 하는 로직을 추가해야겠다.
2. 이상현상 스폰 포인트 중복 문제

흑기가 공중에 떠있는 이상현상이기 때문에
해당 스폰 지점에 누군가 있는지 체크하는 부분에서 '없다' 판정이 나서
똑같은 스폰 포인트에 2개의 이상현상이 스폰되는 문제가 있었다.
이부분은 우선 흑기 콜라이더를 수정해보려고 한다.

읭 콜라이더는 이쁘게 잘 만들어져있는데 왜 자꾸 겹쳐서 스폰되는 걸까?

확인해보니 Is Trigger가 체크되어 있어서
스폰매니저가 계속 아무것도 없으니 스폰해야지! 라는 구조가 되어버렸던 것 ㅠ
그래서 is Trigger 체크 해제해주어서 해결되나 싶었으나

ㅜㅜ 어둑시니에도 콜라이더가 없었다는 점을 발견...
그리고 어둑시니는 플레이에 따라 크기가 달라지기에 콜라이더를 만들기가 참 애매한... 그런 상황이다.

마지막으로 천우인은 벽에 생성되는 거라 콜라이더 체크가 의미 없는...
그냥 여태 운이 좋았어서 따로따로 생성되었던 거지 콜라이더의 문제가 아니었다..
여태 흑기가 공중에 태어나다보니 그거 때문에 영향이 있나 생각을 했었는데 아니었다ㅜㅠ...
var hits = Physics.OverlapSphere(candidate, safeRadius, occupyMask, QueryTriggerInteraction.Collide);
결국 자리 점유 체크를 할 때
QueryTriggerInteraction.Ignore 로 찾아오던 로직을
QueryTriggerInteraction.Collide 로 바꿔주었다.
이러면 주변에 뭐가 하나라도 있으면 자리 점유 중이라고 반납하기 때문에
어쩔 수 없이 Layer에서 Obstacle은 제외시켜주었다.
어차피 바닥에 스폰되는 이상현상은 스폰 위치는 정해져있어서 Obstacle을 예외처리 하지 않아도 큰 문제는 없긴하다...
3. 장애물에 가려지는 천우인 & 벽이 없는데 벽으로 인식하고 허공에 스폰되는 천우인

위에서 Obstacle을 없애주면서 같은 스폰 포인트에 중복으로 스폰되는건 예외처리 되었지만
이제 이러면 천우인이 문제다.. 얘는 Obstacle을 예외처리 해주지 않으면 이렇게 장애물에 가려진다.
그리고 여전히 천우인은 같은 스폰 포인트에 중복으로 스폰된다.
일단 중복으로 스폰되지 않기 위해 스폰 포인트를 읽어와서 딕셔너리로 값을 갖고오던가 하는 방향으로 바꿔주어야 겠다..ㅠ
'Unity > 멋쟁이사자처럼 부트캠프' 카테고리의 다른 글
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(116일차/마지막) - 발표 & 수료 (0) | 2025.11.12 |
|---|---|
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(115일차/Final Project) - 마감 전 최종 수정 및 발표 준비 (0) | 2025.11.11 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(113일차/Final Project) - 탐지 아이템 멀티 연동 (2) (0) | 2025.11.07 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(112일차/Final Project) - 탐지 아이템 멀티 연동 (0) | 2025.11.06 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(111일차/Final Project) - 부적 연동 & 스포너 로직 수정 (0) | 2025.11.05 |