Ssssong += Dev

[퍼즐게임] WHITE POLYGON - 8 본문

개발/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);
        }
    }
}

 

'개발 > WHITE POLYGON' 카테고리의 다른 글

[퍼즐게임] WHITE POLYGON - 10  (0) 2022.08.08
[퍼즐게임] WHITE POLYGON - 9  (0) 2022.08.01
[퍼즐게임] WHITE POLYGON - 7  (0) 2022.07.28
[퍼즐게임] WHITEPOLYGON - 6  (0) 2022.07.24
[퍼즐게임] WHITE POLYGON - 5  (0) 2022.07.19