- RPG Project - 18 [ QuickSlots 구현 ]2024년 10월 24일
- SiJun-Park
- 작성자
- 2024.10.24.:49
이번의 목표는 QuickSlots을 구현하는 것이 목표입니다.
퀵슬롯 현재는 번호를 고정을 해놓았지만, 마무리 단계때 설정한 키를 연동을 할 생각입니다.
이번 시스템은 이전의 인벤토리 시스템을 활용을 하여서 제작을 하였습니다.
QuickSlot의 기본 요소
public enum Type { None, item, skill } public string _name = null; public float mana; public GameObject _CooltimeImage; public Image _Cool; public float _duration; public float _cool_time; public float _current_cool_time = 0; public float _UsingTime = 0f; public Type _CurrentSlotType = Type.None; public float _skilltype = 0; public Image _icon; public object control; private bool _isUsing = false; public bool GetUsing() => _isUsing; public bool SetUsing(bool b) => _isUsing = b; [SerializeField] private Image _BackGround; [SerializeField] private Transform _DragImage;
가장 먼저 QuickSlot이 무엇인지 선언을 해주어야 합니다.
그래서 나중에 필요로 하는 것들을 넣어주어 구현을 하였습니다.
가까운 QuickSlot 찾기
public QuickSlots Find_ClosedQuickSlot(Vector3 pos) { float Closed = 10000f; int index = -1; for (int i = 0; i < _QuickSlots.Count; i++) { Vector2 NowSlotPos = _QuickSlots[i].transform.GetChild(1).position; float diff = Vector2.Distance(NowSlotPos, pos); if (diff < Closed) { Closed = diff; index = i; } } if (Closed > _SlotSize) return null; return _QuickSlots[index].GetComponent<QuickSlots>(); }
현재 마우스 위치를 Pos로 값을 받아와서 존재하는 Quickslot과의 거리를 비교해서
가장 가까운 Slot을 가져와줍니다. 만약 벗어난다면 Null을 리턴을 해서 QuickSlot에 들어있는 것을 지울 예정입니다.
QuickSlot 삭제
void DeleteSlot(QuickSlots slot) { slot._name = null; slot._CurrentSlotType = QuickSlots.Type.None; slot.mana = 0; slot._cool_time = 0; slot._duration = 0; slot._skilltype = 0; slot._icon.sprite = null; slot._icon.gameObject.SetActive(false); slot.SetUsing(false); slot.control = false; }
QuickSlot 속성에 맞도록 모든 것을 초기화 해줍니다.
QuickSlot에 아이템/스킬 추가
public void QuickSlotAdd(object control, QuickSlots QuickSlot) { if (control is Skillslots skill_slot){ Skill skill = SkillControl._instance.GetSkill(skill_slot.name); if(skill == null) { Debug.Log("QuickSlotControl.cs - QUickSlotAdd Error - skill is null"); return; } int check = CheckQuickSlot(skill); //Find 동일한 것 찾아서 지워주기\ if (check == 0) return; // int형으로 받은 이유는 내가 만약에 스킬을 사용하고 있으면 새롭게 추가하지 못하게 하기위해서 QuickSlot._name = skill.skill_name; QuickSlot._CurrentSlotType = QuickSlots.Type.skill; QuickSlot.mana = skill.skill_mana; QuickSlot._cool_time = skill.skill_cool_time; QuickSlot._duration = skill.skill_duration; QuickSlot._skilltype = (float)(int)skill._skill_type; QuickSlot._icon.sprite = skill.skill_icon; QuickSlot.control = control; QuickSlot.SetUsing(true); QuickSlot._icon.gameObject.SetActive(true); } else if(control is SlotControl item_slot){ QuickSlot._name = item_slot._items.Peek()._name; QuickSlot._CurrentSlotType = QuickSlots.Type.item; QuickSlot.mana = item_slot._items.Peek()._value; QuickSlot._cool_time = 0; QuickSlot._duration = 0; QuickSlot._skilltype = 0; QuickSlot._icon.sprite = item_slot._items.Peek()._Icon; QuickSlot.control = control; QuickSlot.SetUsing(true); QuickSlot._icon.gameObject.SetActive(true); } else { Debug.Log("QuickSlotControl.cs - QuickSlotAdd Error - not found object"); } }
가장 먼저 object로 control을 받아오고 이 control이 스킬인지 아이템인지 확인 후 나누어서 필요로 하는 값을 넣었습니다.
여기서 check로 받아오는데 이 코드는 밑에서 설명하겠습니다.
QuickSlot에 스킬이 존재하는지 체크
int CheckQuickSlot(Skill skill) { for (int i = 0; i < _QuickSlots.Count; i++) { if (_QuickSlots[i].GetUsing() == true && _QuickSlots[i]._name.Equals(skill.skill_name)) { if (_QuickSlots[i]._current_cool_time != 0) return 0; DeleteSlot(_QuickSlots[i]); break; } } return 1; }
위는 스킬이 들어오면 해당하는 스킬이 있는지 찾아주고 만약에 그 스킬이 쿨타임 이라면 return을 0을 넣어주고
그것이 아니라면 해당 QuickSlot을 비워주고 1값을 줍니다
그럼 아까 위에 추가를 할 때 check가 0이라면 스킬을 못넣습니다. 즉 쿨타임이 있으면 퀵슬롯에 스킬을 새롭게 추가를 못합니다.
하지만 쿨타임이 아니라면 지금 사용중인 QuickSlot을 지워주고 마우스로 추가한 자리에 새롭게 스킬을 추가 해줍니다.
이렇게 함으로써 스킬이 중복으로 존재를 할 수 없게 구현을 하였습니다.
Swap
public void Swap(QuickSlots Current, QuickSlots Target) { if (Target.GetUsing() == false) { QuickSlotAdd(Current.control, Target); DeleteSlot(Current); } else { object tempControl = Current.control; string tempName = Current._name; float tempSkillType = Current._skilltype; float tempMana = Current.mana; float tempCoolTime = Current._cool_time; float tempDuration = Current._duration; Sprite tempIcon = Current._icon.sprite; QuickSlots.Type tempType = Current._CurrentSlotType; Current._name = Target._name; Current._skilltype = Target._skilltype; Current.mana = Target.mana; Current._CurrentSlotType = Target._CurrentSlotType; Current._cool_time = Target._cool_time; Current._duration = Target._duration; Current._icon.sprite = Target._icon.sprite; Current.control = Target.control; Target._name = tempName; Target._skilltype = tempSkillType; Target.mana = tempMana; Target._CurrentSlotType = tempType; Target._cool_time = tempCoolTime; Target._duration = tempDuration; Target._icon.sprite = tempIcon; Target.control = tempControl; } } }
옮길 위치가 비워져있다면 그대로 그 위치를 사용을 하고, 만약에 아이템이나 스킬일 경우는 서로 바꿔주는 형식으로 하였습니다.
결과 'Unity > RPG Project' 카테고리의 다른 글
RPG Project - 20 [ Item과 User의 충돌 해결 방법 및 발밑 아이템 탐지] (0) 2024.10.25 RPG Project - 19 [ Log System 구현 ] (0) 2024.10.24 RPG Project - 17 [ Object 충돌 시 통과 문제 해결 - 추후 최적화 예정] (0) 2024.10.23 RPG Project - 16 [ Object 충돌에 따라 카메라 Zoom 구현 ] (0) 2024.10.23 RPG Project - 15 [ 코드 분류와 translate 문제점 및 해결 ( 1차 최적화 ) ] (0) 2024.10.23 다음글이전글이전 글이 없습니다.댓글