ㅁㄴㅇㄹ
classDiagram
%%Using UnityEngine.Events
class GameManager{
+enum PHASE
%%0 : 라운드 시작 전, 1 : 플레이어 선택, 2 : 방향 선택, 3 : 결과 계산, 4 : 최종 결과 보여주기
+int winCounter %% 총 승리 횟수
+bool endGame %% 게임이 끝났는지 여부
+bool citizenW %% 시민이 최종 승리했는지 여부
+List~Player~ players
+List~Player~ participants
+int votingPlayerIndex
+int round
+int maxRound
+List<int> roundGoal %% 라운드 목표 저장하는 list
+int[] roundPlayerNumber %% 각 라운드 사람 수
+int roundMinimunNumber = 1 %% 한 쪽에 올라가는 최소 사람 수
+UnityEvent SetGameInfoStart
+UnityEvent PlayerSelectionStart
+UnityEvent DirectionSelectionStart
+UnityEvent RoundResultStart
+UnityEvent LastResultStart
%%RoundResult 결과에 따라 RoundStarted 혹은 RoundEnded로 이동
}
%%UnityEvent들에 각자 PhaseManager의 Activate(), Deactivate()등을 작동시킬 수 있는 function을 연결하면 됩니다.
GameManager : +ReportEndPhase(enum PHASE)
GameManager : +InitializationRound()
GameManager : +AddWin() int
GameManager : +MovetoNextRound() int
GameManager : +GetAnswer()
GameManager : +roundGoalInitialization()
GameManager : +CheckWinCondition() bool
%% 유저의 승리 여부와 탬플릿을 비교하여 이겼는지 안 이겼는지를 리턴
class Player{
+enum COLOR //기존의 enum COLOR 사용
+string playerName
+int weight, type
+Button select, right, left
+bool weightSelected
+bool isLeft
+SpriteRenderer sr
+TMP_Text nameTextMesh
}
Player : +SetColor(COLOR color)
class PhaseManagerBase{
+
}
PhaseManagerBase : +ActivatePhase()
PhaseManagerBase : +DeactivatePhase()
%%canvasList의 자식들을 SetActive를 통해 차례로 비활성화 및 다음 canvas 활성화
class PageManagerBase{
+GameObject currentCanvas
}
PageManagerBase : +SwitchCanvas(GameObject Canvas)
class PageDataIO1{
+
}
PageDataIO1 --|> PageManagerBase : 상속
PageDataIO1 ..> InitialPhaseManager
class PagePlayerSelection1{
+
}
PagePlayerSelection1 --|> PageManagerBase : 상속
PagePlayerSelection1 ..> PlayerSelectionManager
class PageDirectionSelection1{
+
}
PageDirectionSelection1 --|> PageManagerBase : 상속
PageDirectionSelection1 ..> DirectionSelectionManager
class PageRoundResult1{
+
}
PageRoundResult1 --|> PageManagerBase : 상속
PageRoundResult1 ..> RoundResultManager
class PageLastResult1{
+
}
PageLastResult1 --|> PageManagerBase : 상속
PageLastResult1 ..> LastResultManager
class InitialPhaseManager{
+
}
GameManager : +SetPlayerNum(int num)
%% playernum을 외부에서 입력받아 저장하는 것
GameManager : +SetPlayerName(string name)
%% playername을 외부에서 입력받아 저장하는 것
GameManager : +SetPlayerInfo()
%% player에게 누가 스파이이고, 무게가 몇이고를 할당하는 작업
InitialPhaseManager : +ShowGameInfo()
%% 이전의 showgamepurpose와 howtoplay를 합쳐서 구현, 규칙을 보여주는
%% 페이지
InitialPhaseManager : +ShowPlayerInfo()
%% 플레이어의 정보를 보여준다
InitialPhaseManager --|> PhaseManagerBase : 상속
class PlayerSelectionManager{
}
PlayerSelectionManager : +UpdateParticipants(List<int> playeridx)
%% Choose가 먼저 나옴
%% candidates 후보 변수
PlayerSelectionManager --|> PhaseManagerBase : 상속
class DirectionSelectionManager{
+Player currentPlayer
}
DirectionSelectionManager : +ChooseDirection(Player currentPlayer, bool isLeft)
DirectionSelectionManager : +MovetoNextPlayer()
DirectionSelectionManager --|> PhaseManagerBase : 상속
class RoundResultManager{
-enum DIRECTION
-int direction
}
RoundResultManager : +CalculateTotal() int
%% 플레이어의 저울 참가 여부와, 그에 따른 투표 정보가 Player에 저장됨
%% 다 받아서 계산해서 DIRECTION을 리턴함
RoundResultManager : +ResultOutput()
RoundResltManager --|> PhaseManagerBase : 상속
class LastResultManager{
+List~int~ trueAnswer
}
LastResultManager : +PlayerFailed()
%% 플레이어가 실패했을 시, 능력자가 승리했다는 UI를 호출해준다
LastResultManager : +JudgeRound(List <int>GuessInput)
%% 게임매니저에서 answer을 받고, 페이지에서 능력자의 추측
%% 입력을 받아서 UI에서 끝났을 때 이 함수를 부를 것이다
%% JudgeRound 이후에 최종 결과 출력을 UI에서 명령을 때려 준다
%% 최종 결과 출력 이후 게임 END 출력도 UI에서 처리한다
LastResultManager --|> PhaseManagerBase : 상속

public class Player : MonoBehaviour
{
public string playerName; //플레이어 이름
public int weight; //랜덤으로 정할 무게, 괴물일 시 ‘실제 무게 합산 시에만’ 0으로 취급
public int type; //해당 플레이어 괴물 여부 및 능력 확인 (0: 평범한 플레이어, 괴물의 능력은 홀수는 왼쪽, 짝수는 오른쪽일 때 발동한다. 1~2:자신이 위치한 접시가 항상 무겁다. 3~4:자신이 위치한 접시가 항상 가볍다. 5~6:저울의 결과를 반대로 바꾼다.)
public Button select; //플레이어 선택 버튼
public Button right; //오른쪽 저울에 올라가기 버튼
public Button left; //왼쪽 저울에 올라가기 버튼
public TMP_Text nameText; //입력 받은 이름 저장
public GameObject[] visibleObject; //중간에 꺼졌다 켜졌다 하는 항목들
}
public class GameManager : MonoBehaviour
{
public List players;
public Button confirm;
public List<List> roundInfo;
// Start is called before the first frame update
void Start()
{
StartGame();
}
// Update is called once per frame
void Update()
{
}
void StartGame()
{
GetNames();
SetPlayer();
SetRoundObjetives();
for (int round = 0; round < 5; round++)
{
PlayRound(round);
if(CheckWinCondition()) {
// 김도형
}
}
}
void GetNames() //프로그램 시작 시 플레이어 이름 저장
{
//김도형
}
void SetPlayer() //플레이어 순서, 무게, 괴물 여부, 괴물 능력 랜덤으로 정함
{
//양영헌
}
void SetRoundObjetives() //라운드 목표 조건부 랜덤으로 정하기
{
//정유진, 이지현
//라운드 목표를 조건부 랜덤으로 정하는 함수
//앞에 선언된 roundinfo list는 <roundObjective, 라운드 인원, 가벼운 쪽 최소 인원 수>로,총 5라운드로 이루어진 이중 리스트
//-1 0 1 중 하나의 값을 담은 int가 roundObjective고, 5라운드니까 list<int>가 되겠지
//이 roundObjective를 set하는 함수이다
//-1은 왼쪽으로 기울어짐, 0은 수평, 1은 오른쪽으로 기울어짐을 뜻함
//3라운드는 무조건 수평이 되어야함
//1,2,4,5 라운드는 -1 아니면 1로 랜덤으로 부여되는데, -1-1-1-1 혹은 1111 처럼 4개 다 쏠리지는 않도록 부여해야함
//이 setObjectives 랜덤 정수 5개를 debug 창에 출력하면 됨
}
void PlayRound(int round) //라운드 대표자를 입력받고 라운드 진행
{
SelectPlayers() // 정유진
Weigh() // 정유진
}
PopupRule(); // 백지은
bool CheckWinCondition() // 김도형
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Player : MonoBehaviour
{
public string playerName; //플레이어 이름
public int weight; //랜덤으로 정할 무게, 괴물일 시 ‘실제 무게 합산 시에만’ 0으로 취급
public int type; //해당 플레이어 괴물 여부 및 능력 확인 (0: 평범한 플레이어, 괴물의 능력은 홀수는 왼쪽, 짝수는 오른쪽일 때 발동한다. 1~2:자신이 위치한 접시가 항상 무겁다. 3~4:자신이 위치한 접시가 항상 가볍다. 5~6:저울의 결과를 반대로 바꾼다.)
public Button select; //플레이어 선택 버튼
public Button right; //오른쪽 저울에 올라가기 버튼
public Button left; //왼쪽 저울에 올라가기 버튼
public TMP_Text nameText; //입력 받은 이름 저장
public GameObject[] visibleObject; //중간에 꺼졌다 켜졌다 하는 항목들
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public List<Player> players;
public Button confirm;
public List<List<int>> roundInfo;
// Start is called before the first frame update
void Start()
{
StartGame();
}
// Update is called once per frame
void Update()
{
}
void StartGame()
{
GetNames();
SetPlayer();
SetRoundObjetives();
for (int round = 0; round < 5; round++)
{
PlayRound(round);
}
}
void GetNames() //프로그램 시작 시 플레이어 이름 저장
{
confirm.onClick.AddListener(SetNames);
}
void SetNames()
{
for (int i = 0; i< 5; i++)
{
players[i].playerName = players[i].nameText.text;
players[i].visibleObject[0].SetActive(false);
}
confirm.onClick.RemoveListener(SetNames);
confirm.gameObject.SetActive(false);
}
void SetPlayer() //플레이어 순서, 무게, 괴물 여부, 괴물 능력 랜덤으로 정함 (debug)
{
}
void SetRoundObjetives() //라운드 목표 조건부 랜덤으로 정하기 (debug)
{
}
void PlayRound(int round)
{
Debug.Log("현재 대표자는 " + players[round].playerName + "입니다.");
SelectPlayers();
}
IEnumerator SelectPlayers() //저울에 올라갈 플레이어를 선택
{
yield return 0;
}
}