• 티스토리 홈
  • 프로필사진
    SiJun-Park
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
SiJun-Park
  • 프로필사진
    SiJun-Park
    • 분류 전체보기 (121)
      • Unity (80)
        • RPG Project (39)
        • FPS Project (30)
        • 기타 - 개발 (11)
      • 개발 (35)
        • 임베디드 소프트웨어 (7)
        • 컴파일러 (6)
        • 기계학습 (8)
        • 보안 (8)
        • 그래픽스 (2)
        • 그 외 (4)
      • 코딩문제 (5)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 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
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바