내일배움캠프 52일차 6/28 TIL + 그룹 컨트롤 구현
그룹 컨트롤
게임을 마우스로 진행하는 형식의 게임이기에 우클릭 드래그로 여러개를 클릭하여 작동 시키는 방법을 찾아야했다.
public interface ISelectable
{
public void SelectThis();
public void DeSelectThis();
}
우선 인터페이스 ISelectable을 만들어서 선택 가능한 객체를 지정해주고,
public class SelectionManager : MonoBehaviour
{
public RectTransform SelectArea;
public List<ISelectable> SelectedUnits;
bool isMouseDown, isDragging;
Vector3 MouseStartPos;
private void Update()
{
if(Input.GetMouseButtonDown(0))
{
isMouseDown = true;
MouseStartPos = Input.mousePosition;
}
if(isMouseDown)
{
if(Vector2.Distance(Input.mousePosition, MouseStartPos) > 1 && !isDragging)
{
isDragging = true;
SelectArea.gameObject.SetActive(true);
}
if (isDragging)
{
float areaWidth = Input.mousePosition.x - MouseStartPos.x;
float areaHeight = Input.mousePosition.y - MouseStartPos.y;
SelectArea.sizeDelta = new Vector2(Mathf.Abs(areaWidth), Mathf.Abs(areaHeight));
SelectArea.anchoredPosition = (MouseStartPos + Input.mousePosition) / 2;
SelectUnits();
}
}
if (Input.GetMouseButtonUp(0))
{
isMouseDown = false;
isDragging = false;
SelectArea.gameObject.SetActive(false);
}
}
private void SelectUnits()
{
throw new NotImplementedException();
}
}
드래그하는 범위를 보여주는 SelectArea의 위치와 크기를 드래그에 따라 변화하게 해줬다.
문제는 드래그하여 객체를 선택할 때 결국 해당 객체들이 이 범위 안에 있는지를 하나하나 검사해줘야한다는 것이다.
일단은 모든 객체를 리스트에 담아놓고 모두 돌아보며 위치를 체크할 수도 있지만 그러면 시간이 너무 오래 걸릴 것 같고,
다른 방법은 collider를 써서 충돌이나 trigger 감지로 처리를 하는 것이다. 그러려면 일단 UI대신 드래그 범위를 오브젝트로 나타내야할텐데,
내가보기엔 리스트를 다 도는건 너무 소모적인 것 같아서 충돌처리를 고려하게 되었다.
그런데 충돌도 결국에는 모든 유닛의 위치나 크기를 계산하여 알려줄텐데 혹시 충돌도 사실 모든 객체의 크기와 위치를 리스트처럼 돌면서 체크하는 것인가 하여 관련된 내용을 좀 더 찾아봐야할 것 같다.