버프 아이템
버프 아이템은 상점을 처음 만들기 시작했을 때 스크립터블 오브젝트를 통해 이미 스프라이트나 이름, 타입등을 정의 해 놓았습니다.
일단 이런 정보가 있으므로 버프 아이템들을 구분하기 위한 개별적인 데이터가 필요했는데 저는 아이템의 이름으로 아이템의 각각의 기능을 정의하기로 했습니다.
버프 아이템에는 각각의 기능이 있는데 다음과 같습니다
아이템 세팅
아이템은 아이템 프리팹을 가져와서 스크립터블 오브젝트에서 이미지와 이름을 랜덤으로 가져와서 넣어 줍니다.
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); } }
아이템의 기능들은 모두 공에 적용되기 때문에 볼 매니저에서 구현하였습니다.
// 공 분할 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; }
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; } } }
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 :
12시-1시: 점심식사
14:00 ~ 18:00
6시-7시: 저녁식사
19:00 ~ 20:00 : 집중 코딩 시간 부족한 부분 해결해보기
20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
21:00 : 내일은 위한 휴식!