개발/WHITE POLYGON
[퍼즐게임] WHITE POLYGON - 8
ssong_dev
2022. 7. 28. 21:31
씬 간의 퀘스트 상태가 공유되도록 퀘스트 싱글턴 관리 기능을 추가하였다.
처음 씬 들어갔을 때 나오던 대사가 씬을 바꿨다 들어왔을 때 다시 출력되지 않고,
퀘스트 진행 중 바뀐 대사 또한 씬 교체 이후에도 유지된다.
public class CQuestSystem : CSingleton<CQuestSystem>
{
public Dictionary<string, CharacterInfo> characterInfos;
public Dictionary<string, QuestComponentInfo> questComponentInfos;
public string sceneName;
public CQuestList questList;
public override void Awake()
{
base.Awake();
characterInfos = new Dictionary<string, CharacterInfo>();
questComponentInfos = new Dictionary<string, QuestComponentInfo>();
}
//씬 호출 시 현재 씬 정보 세팅
void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
sceneName = scene.name;
}
void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
//딕셔너리에 각 정보 저장
public void AddCharacter(CCharacter a_Character)
{
string addKey = sceneName + "_" + a_Character.gameObject.name + "_Ch";
//딕셔너리에 없다면 새 항목 추가
if(!characterInfos.ContainsKey(addKey))
{
CharacterInfo newCharacterInfo = new CharacterInfo();
newCharacterInfo.addKey = addKey;
newCharacterInfo.dialogueNum = a_Character.DialogueNum;
characterInfos.Add(addKey, newCharacterInfo);
questList.sceneCharacters.Add(a_Character);
}
else
{
Debug.Log(addKey + " : " + characterInfos[addKey].dialogueNum);
}
}
public void AddEvent(CQuestComponent a_Quest)
{
string addKey = sceneName + "_" + a_Quest.gameObject.name + "_" + a_Quest.GetType().ToString();
if (!questComponentInfos.ContainsKey(addKey))
{
QuestComponentInfo newQuestComponent = new QuestComponentInfo();
newQuestComponent.addKey = addKey;
newQuestComponent.questStart = a_Quest.questStart;
newQuestComponent.questClear = a_Quest.questClear;
questComponentInfos.Add(addKey, newQuestComponent);
questList.sceneQuests.Add(a_Quest);
}
}
//딕셔너리로 업데이트
public void UpdateCharacterInfo(CCharacter a_Character)
{
string addKey = sceneName + "_" + a_Character.gameObject.name + "_Ch";
if (characterInfos.ContainsKey(addKey))
{
characterInfos[addKey].dialogueNum = a_Character.DialogueNum;
Debug.Log("Update : " + addKey);
}
}
public void UpdateQuestComponentInfo(CQuestComponent a_Quest)
{
string addKey = sceneName + "_" + a_Quest.gameObject.name + "_" + a_Quest.GetType().ToString();
if (questComponentInfos.ContainsKey(addKey))
{
questComponentInfos[addKey].questStart = a_Quest.questStart;
questComponentInfos[addKey].questClear = a_Quest.questClear;
Debug.Log("Update : " + addKey);
}
}
//딕셔너리에서 정보를 찾아 적용
public void SetCharacterInfo(CCharacter a_Character)
{
string addKey = sceneName + "_" + a_Character.gameObject.name + "_Ch";
//딕셔너리에 있다면 딕셔너리 정보 적용
if(characterInfos.ContainsKey(addKey))
{
a_Character.DialogueNum = characterInfos[addKey].dialogueNum;
}
else
{
//딕셔너리에 없다면 딕셔너리에 추가
AddCharacter(a_Character);
}
}
public void SetQuestComponentInfo(CQuestComponent a_Quest)
{
string addKey = sceneName + "_" + a_Quest.gameObject.name + "_" + a_Quest.GetType().ToString();
if (questComponentInfos.ContainsKey(addKey))
{
a_Quest.questStart = questComponentInfos[addKey].questStart;
a_Quest.questClear = questComponentInfos[addKey].questClear;
}
else
{
AddEvent(a_Quest);
}
}
}
추가할 사항 : 아이템 존재 여부 또한 유지되어야 한다.
카메라 무빙 중 버튼 기능이 활성화 되어 있는 것을 막았다.
QClickEvent와 ButtonEvent를 상속받는 클릭 이벤트들이 클릭 체크를 검사받도록
transformChange와 camerMove가 활성화 될 시 싱글턴 UI매니저에서 관리된다.
public class CUIManager : CSingleton<CUIManager>
{
public bool uiCanInteract;
public TransformChange transformChange;
public CameraMove cameraMove;
public override void Awake()
{
base.Awake();
}
public bool CheckIfUICanInteract()
{
if (uiCanInteract && transformChange == null && cameraMove == null)
return true;
else
return false;
}
}
public class QClickEvent : CQuestComponent
{
public void OnMouseDown()
{
Debug.Log("mouseDown");
if(EventSystem.current.IsPointerOverGameObject())
{
Debug.Log(EventSystem.current);
}
if(!questClear && questStart && CUIManager.Instance.CheckIfUICanInteract() && !EventSystem.current.IsPointerOverGameObject())
{
Debug.Log("startQuest");
StartQuest();
}
else if (EventSystem.current.IsPointerOverGameObject())
{
Debug.Log(EventSystem.current);
}
}
}