Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 짐벌락
- AR세팅
- 레이캐스트
- 확장메서드
- ExtensionMethod
- AR Foundation
- callbyvalue
- 게임제작
- ARProgect
- 인터페이스
- 게임개발
- 깃허브
- 게임
- 로케트
- Unity
- 유니티
- 1인개발
- 델리게이트
- 병맛게임
- raycast
- ar
- 소규모프로젝트
- Quaternion
- github
- 리듬게임에디터
- Euler
- 리듬게임
- AR게임
- callbyreference
- C#
Archives
- Today
- Total
Ssssong += Dev
[퍼즐게임] WHITE POLYGON - 8 본문
씬 간의 퀘스트 상태가 공유되도록 퀘스트 싱글턴 관리 기능을 추가하였다.
처음 씬 들어갔을 때 나오던 대사가 씬을 바꿨다 들어왔을 때 다시 출력되지 않고,
퀘스트 진행 중 바뀐 대사 또한 씬 교체 이후에도 유지된다.
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 |