움직일 때 드래그 제한하기
타일을 맞췄을 때 드래그 제한하기
조건 : 여러 타일들이 코루틴으로 움직이는데 첫 타일이 움직이기 시작했을 때부터 마지막 타일이 멈췄을 때까지 드래그를 제한해야 함
- MainGame 클래스를 Tile에서 참조하는 방법 -> 은닉성이 떨어짐
- 변수를 static으로 쓰는 방법 -> 차라리 참조를 쓰는 게 나아보임
- 콜백으로 정보를 변경하고 움직일 수 있는지 받아옴 -> 이 방법을 사용해보지 않아서 사용해봤음
- Action<int>로 타일이 움직였으면 1을 더해주고 움직임이 끝났으면 1을 빼줬다.
- Func<bool>로 드래그가 가능한지를 받아왔다. (_movingCount == 0일 때 드래그 가능)
public class CharacterTile : MonoBehaviour, IBeginDragHandler
{
private Action<int> _onMoveInfoChanged;
private Func<bool> _getDragable;
public void OnBeginDrag(PointerEventData eventData)
{
if (!_getDragable.Invoke())
return;
/* 위치 체크,갱신 로직
...
*/
}
public IEnumerator Move(Vector2 targetPos, float moveTime)
{
_onMoveInfoChanged.Invoke(ADD_VALUE);
/* 움직임 로직
...
*/
_onMoveInfoChanged.Invoke(-ADD_VALUE);
}
public IEnumerator GoRoundTrip(Vector2 targetPos, float moveTime)
{
_onMoveInfoChanged.Invoke(ADD_VALUE);
/* 움직임 로직
...
*/
_onMoveInfoChanged.Invoke(-ADD_VALUE);
}
}
public class MainGame : MonoBehaviour
{
private int _movingCount;
private bool GetDragable()
{
return _movingCount == 0;
}
private void MoveInfoChangedCallback(int num)
{
_movingCount += num;
}
}
결론
장점 : CharacterTile은 MiniGame의 정보를 모르므로 은닉성이 증가하였다.
단점 : 디버깅 시 코드의 흐름을 따라가기 조금 어렵다.
=> 핵심 로직이거나 은닉화가 필요한 정보를 다룰 때 또는 입력 등의 콜백으로 사용할 때 좋다고 생각한다.
순차적인 파괴 가능하도록 하기
보드가 변경되었을 때 연속적인 타일이 존재한다면 순차적으로 파괴 되도록 하기
- ReArrangeBoard 메서드에 bool 값 파라미터를 넣음으로써 순차적으로 파괴할 경우와 아닌 경우를 나눴다.
https://jcdevelop98.tistory.com/414
public class MainGame : MonoBehaviour
{
private int _movingCount;
private void MoveInfoChangedCallback(int num)
{
_movingCount += num;
if (_movingCount == 0)
{
ReArrangeBoard(true);
}
}
}
버그
* 코루틴 중간에 오브젝트가 파괴되는 경우
* 파괴될 오브젝트가 드래그가 먹혀서 문제가 되는 경우
* 한 번에 여러 타일이 파괴될 때 구멍이 생기는 경우
'클론코딩 > 애니팡' 카테고리의 다른 글
애니팡 클론코딩 (6) - 연속적인 타일이 3개 이상인지 확인하기 (0) | 2024.02.01 |
---|---|
애니팡 클론코딩 (5) - 파괴 시 생성과 정렬, 커스텀 에디터 (1) | 2024.01.30 |
애니팡 클론코딩 (4) - 실패 이동, 파괴 로직 구현 (0) | 2024.01.25 |
애니팡 클론코딩 (3) - 랜덤 타일, 파괴할 타일 추가 (0) | 2024.01.24 |
애니팡 클론코딩 (2) - 보드 구현 (0) | 2024.01.23 |