멀티플레이 제작 끝

This commit is contained in:
김도환
2026-05-01 07:06:29 +09:00
parent a36270f77a
commit ad7caf1e71
23 changed files with 2212 additions and 96 deletions

View File

@@ -26,10 +26,20 @@ public class Gazuaa : MonoBehaviourPunCallbacks
{
_gazuaInput = new GazuaInput();
_gazuaInput.Enable();
_gazuaInput.Player.Gacha.performed += Gacha;
if (logText != null) logText.text = ""; // 시작할 때 텍스트 비우기
if (logText != null) logText.text = "";
// ---- [추가된 부분: 재시작 시 데이터 초기화] ----
myAvatarCount = 0;
knownAvatarCounts.Clear(); // 딕셔너리 비우기
isGameActive = false; // 게임 상태 초기화
// 서버에 기록된 내 아바타 개수도 0으로 덮어씌우기
Hashtable hash = new Hashtable();
hash["AvatarCount"] = 0;
PhotonNetwork.LocalPlayer.SetCustomProperties(hash);
// ---------------------------------------------
}
private void Gacha(InputAction.CallbackContext obj)
@@ -48,10 +58,11 @@ public class Gazuaa : MonoBehaviourPunCallbacks
// 서버가 "누군가의 정보가 바뀌었어!" 라고 알려줄 때 실행됨 (나의 변경 사항도 포함됨)
public override void OnPlayerPropertiesUpdate(Photon.Realtime.Player targetPlayer, Hashtable changedProps)
{
if (!this || !map) return;
if (changedProps.ContainsKey("AvatarCount"))
{
int newTotalCount = (int)changedProps["AvatarCount"];
int actorNumber = targetPlayer.ActorNumber;
int actorNumber = targetPlayer.ActorNumber;
string playerName = targetPlayer.NickName; // [핵심] 아까 로비에서 적은 닉네임 가져오기!
int oldCount = 0;
@@ -71,9 +82,9 @@ public class Gazuaa : MonoBehaviourPunCallbacks
for (int i = 0; i < avatarsToSpawn; i++)
{
GameObject newAvatar = Instantiate(avatarPrefab, map.transform);
newAvatar.name = actorNumber.ToString();
newAvatar.name = actorNumber.ToString();
if (GameManager.AvatarCache.ContainsKey(actorNumber))
if (GameManager.AvatarCache.ContainsKey(actorNumber))
{
Image avatarImage = newAvatar.GetComponent<Image>();
if (avatarImage != null)
@@ -104,33 +115,83 @@ public class Gazuaa : MonoBehaviourPunCallbacks
logText.text = string.Join("\n", logMessages);
}
public void HighlightWinner(int winnerActorNumber)
// GameManager에서 호출할 함수 (이름도 같이 받도록 매개변수 추가)
public void HighlightWinner(int winnerActorNumber, string winnerName)
{
StartCoroutine(RouletteRoutine(winnerActorNumber, winnerName));
}
private System.Collections.IEnumerator RouletteRoutine(int winnerActorNumber, string winnerName)
{
string winnerNameStr = winnerActorNumber.ToString();
// Map 밑에 생성된 모든 아바타를 순회합니다.
foreach (Transform child in map.transform)
{
Image img = child.GetComponent<Image>();
if (img == null) continue;
List<Transform> allAvatars = new List<Transform>();
List<Transform> winnerAvatars = new List<Transform>(); // [수정] 당첨자의 '모든' 아바타를 담을 리스트
for (int i = 0; i < map.transform.childCount; i++)
{
Transform child = map.transform.GetChild(i);
allAvatars.Add(child);
// 모든 아바타를 어둡게 만듭니다.
child.GetComponent<Image>().color = new Color(0.4f, 0.4f, 0.4f, 1f);
// 당첨자의 아바타라면 리스트에 싹 다 모아둡니다.
if (child.name == winnerNameStr)
{
// 당첨자의 아바타: 원래 색상 유지 및 살짝 크게 만들기
child.localScale = new Vector3(1.2f, 1.2f, 1.2f);
// (응용: 당첨자 아바타들 중 하나만 랜덤으로 골라 파티클을 터뜨려도 멋집니다!)
}
else
{
// 패배자의 아바타: 까맣게 만들고 반투명하게(Alpha 값 조절)
img.color = new Color(0.3f, 0.3f, 0.3f, 0.5f);
winnerAvatars.Add(child);
}
}
// 아무도 없거나 에러 방지용
if (allAvatars.Count == 0 || winnerAvatars.Count == 0) yield break;
// 2. 시간 기반 룰렛 회전 설정
float delay = 0.04f; // 초기 속도
int currentIndex = 0;
float elapsedTime = 0f; // 흐른 시간
float spinDuration = 3.5f; // ★ [핵심] 정확히 3.5초 동안만 회전합니다!
while (elapsedTime < spinDuration)
{
// 이전 아바타 원상복구
int prevIndex = (currentIndex == 0) ? allAvatars.Count - 1 : currentIndex - 1;
allAvatars[prevIndex].localScale = Vector3.one;
allAvatars[prevIndex].GetComponent<Image>().color = new Color(0.4f, 0.4f, 0.4f, 1f);
// 현재 아바타 하이라이트
allAvatars[currentIndex].localScale = new Vector3(1.2f, 1.2f, 1.2f);
allAvatars[currentIndex].GetComponent<Image>().color = Color.white;
yield return new WaitForSeconds(delay);
elapsedTime += delay; // 흐른 시간 누적
// 시간이 지날수록 속도를 살짝 늦춥니다.
if (elapsedTime > spinDuration * 0.5f) delay = 0.08f; // 절반 지났을 때
if (elapsedTime > spinDuration * 0.8f) delay = 0.15f; // 거의 끝날 때쯤
// 다음 아바타로 이동
currentIndex = (currentIndex + 1) % allAvatars.Count;
}
// 회전이 끝났으므로 마지막으로 켜져 있던 아바타 끄기
allAvatars[currentIndex].localScale = Vector3.one;
allAvatars[currentIndex].GetComponent<Image>().color = new Color(0.4f, 0.4f, 0.4f, 1f);
// 3. ★ 정해진 시간이 끝나면, 당첨자의 '모든' 아바타를 동시에 하이라이트!
foreach (Transform winner in winnerAvatars)
{
winner.localScale = new Vector3(1.5f, 1.5f, 1.5f);
winner.GetComponent<Image>().color = Color.white;
}
FindObjectOfType<GameManager>().text.text = $"{winnerName} 당첨!!!";
FindObjectOfType<GameManager>().ShowRestartButtonIfMaster();
}
private new void OnDisable()
public override void OnDisable()
{
base.OnDisable();
_gazuaInput.Disable();
}
}