[Unity]TIL (37) | 2023.09.13 | 유니티 버프 아이템 만들어보기

kjg5370·2023년 9월 13일
0

TIL

목록 보기
37/91
post-thumbnail

들어가기 앞서

팀 프로젝트를 하는데 기능 개발 부분은 거의 마무리가 되가고있는 것 같습니다.
내일은 발표을 해야되기 때문에 오늘 거의완성을 하고 밸런스나 버그를 잡는데 힘을 써야됩니다.
오늘은 아이템의 마지막인 버프 적용 아이템을 만들어보았습니다.

오늘 배운 것

  • 버프 아이템
    버프 아이템은 상점을 처음 만들기 시작했을 때 스크립터블 오브젝트를 통해 이미 스프라이트나 이름, 타입등을 정의 해 놓았습니다.
    일단 이런 정보가 있으므로 버프 아이템들을 구분하기 위한 개별적인 데이터가 필요했는데 저는 아이템의 이름으로 아이템의 각각의 기능을 정의하기로 했습니다.
    버프 아이템에는 각각의 기능이 있는데 다음과 같습니다

    • 아이템 세팅
      아이템은 아이템 프리팹을 가져와서 스크립터블 오브젝트에서 이미지와 이름을 랜덤으로 가져와서 넣어 줍니다.

      • setBuffItem.cs
        			public class SetBuffItem : MonoBehaviour
        			{
        			    public ShopUIData[] buffItem;
        			    // Start is called before the first frame update
        			    void Start()
        			    {
        			        // 랜덤하게 BuffItemData 배열에서 하나의 데이터를 선택
        			        int randomIndex = Random.Range(0, buffItem.Length);
        			        ShopUIData randomData = buffItem[randomIndex];
        
        			        // 선택된 데이터를 사용하여 게임 오브젝트의 이름을 설정합니다.
        			        gameObject.name = randomData.itemName;
        
        			        SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
        			        if (spriteRenderer != null && randomData.itemImage != null)
        			        {
        			            // 선택된 데이터의 스프라이트를 설정합니다.
        			            spriteRenderer.sprite = randomData.itemImage;
        			        }
        			    }
        			    private void Update()
        			    {
        			        if (gameObject.transform.position.y < -5.0f)
        			        {
        			            Destroy(gameObject);
        			        }
        			    }
        			}

      아이템은 무조건 패들(플레이어)이 먹어야 발동 되도록 세팅해두었습니다. ->패들을 조작하는 스크립트에 아이템 구별

    • padScript.cs 중 트리거로 아이템을 먹었을 때 아이템 별 기능 실행

       private void OnTriggerEnter2D(Collider2D coll)
         {
             if (coll.gameObject.tag == "Item")
             {
      
                 if (coll.gameObject.name == "x2")
                 {
                     BallManager.I.DivideBall();
                 }
                 if (coll.gameObject.name == "AtkMax" && !isFunctionActive)
                 {
                     StartFunction();
                     BallManager.I.AtkUP(true);
                 }
                 if (coll.gameObject.name == "Big" && !isFunctionActive)
                 {
                     StartFunction();
                     BallManager.I.ExpandCollider(true);
                 }
                 Destroy(coll.gameObject);
             }
         }

      아이템의 기능들은 모두 공에 적용되기 때문에 볼 매니저에서 구현하였습니다.

  1. 공 분할
    공이 두개로 분할되는 기능입니다. 이미지는 파란색 병으로 만들었습니다.

    MakeBall();은 공을 만드는 함수이고 나머지는 공의 방향과 물리엔진에 관한 내용입니다.
  • 공 분할 함수
      // 공 분할
        public void DivideBall()
        {
            float _maxPosY = -3;
            int _ballIndex = -1;
            for (int i = 0; i < _balls.Count; i++)
            {
                if (_balls[i].transform.position.y > _maxPosY && _balls[i].gameObject.activeSelf == true)
                {
                    _maxPosY = _balls[i].transform.position.y;
                    _ballIndex = i;
                    continue;
                }
            }
    
            if (_ballIndex == -1)
                return;
    
            MakeBall();
            _lastMakeBall.transform.position = _balls[_ballIndex].transform.position;
            _lastMakeBall._ballShottingPow = _balls[_ballIndex]._ballShottingPow;
            Vector3 _oldVelocity = _balls[_ballIndex]._rigidbody.velocity;
            Vector3 _newVelocity = new Vector3(_oldVelocity.x * -1, _oldVelocity.y, 0).normalized;
            _lastMakeBall._rigidbody.bodyType = RigidbodyType2D.Dynamic;
            _lastMakeBall._rigidbody.velocity = _newVelocity * _lastMakeBall._ballShottingPow;
        }
  1. 공 크기 증가
    공의 크기가 1.25배 커지는 기능입니다. 이미지는 초록색 병을 사용하였습니다.

    현재 화면의 모든 공의 오브젝트를 가져와 크기를 키웁니다.
  • 공 크기 증가 함수
     public void ExpandCollider(bool isWork)
       {
           if (isWork)
           {
               for (int i = 0; i < _balls.Count; i++)
               {
                       Vector3 newScale = _balls[i].transform.localScale * 1.25f;
                       _balls[i].transform.localScale = newScale;
               }
           }
           else
           {
               for (int i = 0; i < _balls.Count; i++)
               {
                       _balls[i].transform.localScale = originalScale;
               }
           }
       }
  1. 공의 공격력 증가
    공의 공격력이 100으로 고정됩니다. 공격력은 블록의 HP를 줄이는데 사용됩니다. 이미지는 노란색 병을 사용하였습니다.
    _dmg는 공이 가지고 있는 공격력 의 값입니다. 크기증가와 마찬가지로 모든 공을 불러와 공격력을 올립니다. 그리고 조건문의
    isWork는 5초후 증가된 능력치를 원래대로 돌리기 위한 bool변수입니다.
  • 공의 공격력 증가 함수
       public void AtkUP(bool isWork)
       {
           if (isWork)
           {
               for (int i = 0; i < _balls.Count; i++)
               {
                       _balls[i]._dmg = 100;
               }
           }
           else
           {
               for (int i = 0; i < _balls.Count; i++)
               {
                       _balls[i]._dmg = originalATK;
               }
           }
       }

기억 할 것 & 진행 사항

-버프 능력 일정시간만 적용시키기
저는 버프 능력이 게임 시간으로 5초만 적용되게 해놓았습니다.

일단 패들이 먹은 시간을 기준으로 하므로 패들 스크립트에

bool isFunctionActive = false;
float startTime;

이 두 변수를 선언합니다. 그리고 Update에서

   private void Update()
    {
        // 기능이 활성화되어 있고 일정 시간이 경과하면 기능을 비활성화합니다.
        if (isFunctionActive && Time.time - startTime >= 5f)
        {
            StopFunction();
        }
    }

isFunctionActive가 true일 때만 시간을 재서 5초가 지나면 비활성화 시킵니다.

  private void StartFunction()
    {
        // 기능을 활성화하고 시작 시간을 기록합니다.
        isFunctionActive = true;
        startTime = Time.time;
    }

    private void StopFunction()
    {
        // 기능을 비활성화합니다.
        BallManager.I.AtkUP(false);
        BallManager.I.ExpandCollider(false);
        isFunctionActive = false;
    }

이 두개의 함수는 시작시간을 기록하고 시간이 끝나면 원래 상태로 돌리는 역할을 합니다.
이렇게 버프아이템을 먹고 5초가 지나면 버프가 꺼지고 그 후 다시 버프아이템을 적용시킬 수 있게
기능을 짜 보았습니다.

진행 사항

버프 아이템 블록에 할당
상점 능력치 부분 추가
공 스킨 변경

밸런스 조절(진행중)
버그 수정(진행중)

내일 할 일

  • 하루 계획
    • 오전
      • 09:00 ~ 10:00 : 알고리즘 코드카타
      • 10:00 ~ 10:30 : 팀 회의
      • 10:30 ~ 14:00 :
        • 오늘 계획 (Task)
      • 12시-1시: 점심식사
    • 집중 코딩
      • 14:00 ~ 18:00
    • 저녁
      • 6시-7시: 저녁식사
      • 19:00 ~ 20:00 : 집중 코딩 시간 부족한 부분 해결해보기
      • 20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
      • 21:00 : 내일은 위한 휴식!
profile
학생입니다

0개의 댓글