테스트를 위해 지형을 임의로 생성하고 생성된 지형끼리 이어지는 선을 만들 수 있는 기능을 구현
지형이 생성 될 수 있도록 기반을 생성한다.
지형이 생성되면 일괄적으로 관리할 수 있도록 Ground란는 이름의 빈 오브젝트를 생성한다. 이 오브젝트는 노드 및 간선 생성을 담당하는 스크립트가 포함된다.
또한 입력감지를 담당할 빈 오브젝트로 InputManger를 생성한다.
생성될 노드
스크립트는 1.Floor를 클릭 2.생성모드 활성화 2-1.해당 좌표에 노드를 생성 2-2.좌클릭시에는 생성되었던 노드를 삭제
3.생성모드를 끄고 선택모드로 전환 3-1.최대 두개의 노드를 선택 3-2.길 생성을 선택하면 노드 사이에 간선이 생성
의 순서로 구현
먼저 입력을 받아들이기 위해 Input Manager 스크립트를 아래와 같이 작성
private void Update()
{
CheckKey();
}
private void CheckKey()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity))
{
if (GroundMaker.instance.nodeActivateMode)
{
if (hit.collider.gameObject.layer == 6)
{
//감지된 부분이 지형(Floor)일 경우
GroundMaker.instance.CreateNode(hit);
}
else
{
//지형이 아닌 다른 부분을 클릭했을 경우
Debug.Log("해당 지역에 노드를 생성할 수 없습니다.");
}
}
else if (GroundMaker.instance.wayActivateMode)
{
GameObject scanObj = hit.collider.gameObject.transform.parent?.gameObject;
if (scanObj && scanObj.layer == 7)
GroundMaker.instance.SetTarget(scanObj);
else
Debug.Log("노드를 지정해 주세요.");
}
}
}
if (Input.GetMouseButtonUp(1))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity))
{
if (GroundMaker.instance.nodeActivateMode)
{
GroundMaker.instance.RemoveNode(hit);
}
else if (GroundMaker.instance.wayActivateMode)
{
}
}
}
}
클릭한 지점에 Ray를 생성하여 RayHit된 오브젝트의 collider를 활용하여 정보를 수집, 좌클릭시 지형을 생성할 수 있는 레이어만 감지하도록 했으며 우클릭시 생성된 노드의 경우만 삭제할 수 있도록 구현