기존 테이블 구조 일부를 외부 테이블로 빼고, 카드 효과를 스크립트로 관리하기로 결정되어 해당 부분을 수정중이다.

그 외에 장비 유지보수 레이어 UI를 작업했다.

'Unity > 작업&삽질노트' 카테고리의 다른 글

2021-08-18 작업일지  (0) 2021.08.19
2021-08-17 작업일지  (0) 2021.08.17
2021-08-09 작업일지  (0) 2021.08.09
2021-08-04 작업일지  (0) 2021.08.04
2021-08-03 작업일지  (0) 2021.08.03

오늘은 기획서의 장비/스킬/카드 데이터를 DB에 등록/정리하는 작업을 했다.

컬럼을 정리하는 과정에서 바뀐 부분들을 몇가지 수정했다.

스킬트리부분은 기능상의 구현은 끝났다. 이후 리소스 교체와 애니메이션 추가, UI 재배치를 해줄 예정이다.

 

'Unity > 작업&삽질노트' 카테고리의 다른 글

2021-08-17 작업일지  (0) 2021.08.17
2021-08-12 작업일지  (0) 2021.08.12
2021-08-04 작업일지  (0) 2021.08.04
2021-08-03 작업일지  (0) 2021.08.03
2021-08-02 작업일지  (0) 2021.08.02

작업 내용

1. 레이어(씬)별 작업 진행상황 문서 작성
2. 기존 코드 수정작업 다수
3. UIBar prefab에 옵저버 적용


 카드를 삭제하거나, 스킬을 활성화 할때 골드와 스킬포인트가 차감되어 UI에 반영된다.

특정 행동이 실행되면 NotifyObserver를 실행해 옵저버에 알리고 해당 옵저버에 엮여있는 OnNext를 모두 실행한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//...        
        else if (characterData.UnLockedSkill.Contains(selectedSkillData.Parent)) {
            //skillActivationButton.image.sprite = Resources.Load("UnlockSkillButtonImageUIPath...", typeof(Sprite)) as Sprite;
            skillButtonText.text = $"{CommonDefineKR.UnlockSkillString}";
            skillActivationButton.interactable = true;
 
            skillActivationButton.onClick.AddListener(() => {
                characterData.UnLockedSkill.Add(selectedSkillData.Number);
                //...
                characterData.SkillPoint -= 1;
                CharacterInfoDAO.UpdatePlayerInfo(characterData);
                SceneState.GetInstance()._UIStateHandler.NotifyObservers();
                SetButton();
            });
        }
//...
cs
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class UIBarInfoController : MonoBehaviour, IObserver<UIStateInfo> {
    // Area
    [SerializeField] Text playerNameText = null;
    [SerializeField] Text playerLevelText = null;
    [SerializeField] Text playerHpText = null;
    [SerializeField] Text playerMpText = null;
    [SerializeField] Text stageNameText = null;
    [SerializeField] Image playerIconImage = null;
 
    // Skill
    [SerializeField] Text containSkillPointText = null;
 
    // Gold
    [SerializeField] Text coinText = null;
 
    void Start() {
        Init();
        SceneState.GetInstance()._UIStateHandler.Subscribe(this);
        SceneState.GetInstance()._UIStateHandler.NotifyObservers();
    }
 
    private void Init() {
        CharacterInfoDTO characterInfo = CharacterInfoDAO.GetCharacterInfo();
        playerNameText.text = characterInfo.Name;
        playerLevelText.text = $"{CommonDefineKR.LevelString} {characterInfo.Level}";
        playerHpText.text = $"{CommonDefineKR.HpString} {characterInfo.Hp}";
        playerMpText.text = $"{CommonDefineKR.MpString} {characterInfo.Mp}";
 
        AreaDTO area = AreaDAO.SelectArea(characterInfo.CurrentArea);
        if (null != area) {
            stageNameText.text = area.Name;
        }
 
        PortraitDTO portrait = PortraitDAO.SelectPortrait(characterInfo.Portrait);
        playerIconImage.sprite = Resources.Load(portrait.ImagePath, typeof(Sprite)) as Sprite;
 
        containSkillPointText.text = $"{CommonDefineKR.ContainSkillPointString} {characterInfo.SkillPoint}";
 
        coinText.text = characterInfo.Gold.ToString();
    }
    public void OnNext(UIStateInfo value) {
        Init();
    }
    public void OnCompleted() {
        throw new NotImplementedException();
    }
 
    public void OnError(Exception error) {
        throw new NotImplementedException();
    }
}
cs

 

'Unity > 작업&삽질노트' 카테고리의 다른 글

2021-08-12 작업일지  (0) 2021.08.12
2021-08-09 작업일지  (0) 2021.08.09
2021-08-03 작업일지  (0) 2021.08.03
2021-08-02 작업일지  (0) 2021.08.02
[작업일지] 2019-06-13  (0) 2019.06.13

캐릭터의 카드 유지보수씬을 작업중이다.

이전에 작업해놓은 내용들이 읽기 힘들고 지저분해 코드를 정리하는 작업을 했다.

기존에는 카드 리스트를 위아래로 드래그해 살펴볼 수 있는 기능과, 카드를 드래그해 카드 버리기 영역에 드랍하면 카드가 버려지는 기능이 있었는데, 드래그 기능이 중복되어 리스트 드래그가 방해받는 문제가 있었다. 해당 문제는 카드선택 후 버리기 버튼을 눌러 버리는 형태로 변경해 해결했다.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class CharacterMaintenance_Card_Layer : MonoBehaviour, IPointerClickHandler {
 
    [SerializeField] GameObject deckListArea = null;
    [SerializeField] Canvas targetCanvas = null;
 
    //버튼
    [SerializeField] Button discardButton = null;
 
    //카드 설명창
    [SerializeField] Text cardTitle = null;
    [SerializeField] Text cardMana = null;
    [SerializeField] Text cardDescribe = null;
    [SerializeField] Text cardProperty = null;
    [SerializeField] GameObject cardManaIcon = null;
    //raycast 변수
    GraphicRaycaster raycaster = null;
    PointerEventData pointer = null;
 
    CardDTO cardDataOnSelect = null;
    GameObject cardObjectOnSelect = null;
    CharacterInfoDTO characterInfo = null;
    GameObject currentPopup = null;
 
    void Start() {
        ButtonInit();
    }
    private void OnEnable() {
        Init();
        UpdateDeckList();
    }
 
    void Init() {
        raycaster = targetCanvas.GetComponent<GraphicRaycaster>();
        pointer = new PointerEventData(null);
        characterInfo = CharacterInfoDAO.GetCharacterInfo();
    }
 
    void ButtonInit() {
        discardButton.onClick.AddListener(() => {
            DiscardCardFromDeck();
        });
    }
 
    public void OnPointerClick(PointerEventData eventData) {
        pointer.position = eventData.position;
 
        List<RaycastResult> results = new List<RaycastResult>();
        raycaster.Raycast(pointer, results);
        if (results.Count > 0) {
            if (results[0].gameObject.transform.GetComponent<CardObject>()) {
                if (cardObjectOnSelect != null) {
                    cardObjectOnSelect.GetComponent<CardObject>().glowEffect.SetActive(false);
                }
 
                cardDataOnSelect = results[0].gameObject.transform.GetComponent<CardObject>().CardData;
                cardObjectOnSelect = results[0].gameObject;
                cardObjectOnSelect.GetComponent<CardObject>().glowEffect.SetActive(true);
                UpdateCardDescription(cardDataOnSelect);
            }
        }
    }
 
    void UpdateDeckList() {
        Transform[] childList = deckListArea.GetComponentsInChildren<Transform>(true);//기존 레이어에 존재하던 자식들 삭제
        if (childList != null) {
            for (int i = 1; i < childList.Length; i++) {
                if (childList[i] != transform) Destroy(childList[i].gameObject);
            }
        }
 
        for (int i = 0; i < characterInfo.CardList.Count; i++) {
            GameObject obj = FactoryManager.GetInstance().CreateCardObject(characterInfo.CardList[i], deckListArea.transform);
            obj.name = $"card_{i}";
        }
    }
 
    void UpdateCardDescription(CardDTO card) {
        cardTitle.text = card.Title;
        cardMana.text = card.Mana.ToString();
        cardDescribe.text = card.Explanation;
        cardProperty.text = card.Property;
        cardManaIcon.SetActive(true);
    }
 
    void DeleteCardDescription() {
        cardTitle.text = "";
        cardMana.text = "";
        cardDescribe.text = "";
        cardProperty.text = "";
        cardManaIcon.SetActive(false);
    }
 
    void DiscardCardFromDeck() {
        if(cardObjectOnSelect != null) {
            characterInfo.CardList.Remove(cardDataOnSelect.Number);
            Destroy(cardObjectOnSelect);
 
            cardDataOnSelect = null;
            cardObjectOnSelect = null;
        }
        DeleteCardDescription();
 
        CharacterInfoDAO.UpdatePlayerInfo(characterInfo);
    }
}
 
 
cs

카드를 삭제할때마다 DB에 바로 업데이트하도록 했다.

몇줄 수정만 해줄 생각이었는데 생각보다 지우고 다시 쓴 부분이 많아졌다.

'Unity > 작업&삽질노트' 카테고리의 다른 글

2021-08-12 작업일지  (0) 2021.08.12
2021-08-09 작업일지  (0) 2021.08.09
2021-08-04 작업일지  (0) 2021.08.04
2021-08-02 작업일지  (0) 2021.08.02
[작업일지] 2019-06-13  (0) 2019.06.13

캐릭터의 스킬 트리 작업을 진행했다.

스킬 노드간의 관계에 따라 간선의 상태를 다르게 설정해야했다.

case 1. 활성화된 노드(부모) - 활성화된 노드(자식)  -> 밝게 빛나는 간선
case 2. 활성화된 노드(부모) - 비활성화된 노드(자식) -> 하이라이트 표시된 간선 (임시로 빨갛게 표시함)
case 3. 비활성화된 노드(부모) - 비활성화된 노드(자식) - > 회색빛 간선
세 가지 케이스로 분류할 수 있다.

해당 간선은 스킬 트리와 장비 트리에 사용되기때문에 두 케이스를 고려해 작업해야했다.

1
2
3
4
5
6
    public GameObject CreateLineObject<T>(Vector3 start, Vector3 end, T data,Transform parent) {
        GameObject LinePrefab = Resources.Load("Prefabs/LineRenderer"as GameObject;
        GameObject Line = Instantiate<GameObject>(LinePrefab,parent);
        Line.GetComponent<RenderBridge>().Init(start, end, data);
        return Line;
   }//FactoryManager
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public void Init<T>(Vector3 start, Vector3 end, T data) {
        type = typeof(T);
        if(type == typeof(SkillDTO)) {
            skill = (SkillDTO)Convert.ChangeType(data, type);
            Debug.Log("skill");
            Debug.Log(skill.Number);
        }
        else {
            //equip = data;
            equip = (EquipmentDTO)Convert.ChangeType(data, type);
            Debug.Log("Equip");
        }
        parentPosition = this.gameObject.transform.parent.position;
        parentPosition_2 = this.gameObject.transform.parent.position;
        startPosition = start;
        endPosition = end;
        this.GetComponent<LineRenderer>().SetPosition(0, startPosition);
        this.GetComponent<LineRenderer>().SetPosition(1, endPosition);
        parentPosition = this.transform.parent.position;
        initialized = true;
    }
cs

각 노드는 FactoryManager라는 클래스를 통해 인스턴스화된다.

FactoryManager의 CreateLineObject가 호출될 때 받은 data의 타입에 따라 어떻게 처리할지 if문으로 구분했다.(이부분은 분명 더 좋은 방법이 있을것같은데 당장 떠오르는게 없었다...)

'Unity > 작업&삽질노트' 카테고리의 다른 글

2021-08-12 작업일지  (0) 2021.08.12
2021-08-09 작업일지  (0) 2021.08.09
2021-08-04 작업일지  (0) 2021.08.04
2021-08-03 작업일지  (0) 2021.08.03
[작업일지] 2019-06-13  (0) 2019.06.13

저번 포스팅에서 언급했듯이, Update는 한번만 호출되는 Start와 달리 매 프레임마다 호출된다.

그렇다면 FixedUpdate는 Update와 어떤 차이점이 있을까?

Update가 매 프레임마다 호출된다면,

FixedUpdate는 일정 시간마다 호출된다.

이와 같은 특성때문에, FixedUpdate는 프레임 속도와 무관하게 업데이트되어야하는  physics와 관련된 메소드 등을 호출하는데 사용한다.

 

 

유니티 라이프 사이클 플로우차트 링크

https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html

'Unity > C#' 카테고리의 다른 글

C#에서 구조체, value type  (0) 2021.09.13
[Unity/C#] Ray&Raycast  (0) 2019.06.11
-C#- Awake/Start/Update  (0) 2019.06.03
-C#- 대리자(delegate)  (0) 2019.05.28
C# - Vector3  (0) 2019.04.03

+ Recent posts