노드 사이 간선을 생성한다.
public void SetTarget(GameObject _obj)
{
if (firstSpot == null)
{
firstSpot = _obj;
Debug.Log("첫 번째 영역 지정 완료");
_obj.GetComponent<Node>().SelectedWayMode(true);
}
else if (secondSpot == null)
{
secondSpot = _obj;
Debug.Log("두 번째 영역 지정 완료");
_obj.GetComponent<Node>().SelectedWayMode(true);
}
else
{
Debug.Log("더 이상 지정할 수 없습니다.");
return;
}
}
SetTarget 함수는 간선을 생성하기 위해 양 끝 노드를 선택하는 함수이다.
InputMange로부터 호출되어 매개변수로 넘겨받은 GameObject를 기반으로 첫번째 지점, 두번째 지점을 탐색하여 비어있을 경우 넘겨받은 GameObject를 할당한다.
노드 오브젝트가 클릭이 되었을 경우 시각적 표현으로 노드 스크립트의 SelectedWayMode를 실행한다. 이 함수는 노드 오브젝트를 일시적으로 녹색으로 보이게 한다.
만약 두 변수가 모두 할당되어 있을 경우 위의 단계를 진행하지 않는다.
void WayCreate()
{
Vector3 fsPosition = firstSpot.transform.position;
Vector3 ssPosition = secondSpot.transform.position;
float dist; //거리
float angle; //각도
Vector3 wayPos; //생성될 위치
dist = Vector3.Distance(fsPosition, ssPosition); //두 지점 사이 거리
Vector3 v3 = ssPosition - fsPosition; //각도 계산에 필요한 수치
angle = Quaternion.FromToRotation(Vector3.up, v3).eulerAngles.y; //두 지점의 연결선과 x축 간의 각도
wayPos = new Vector3((fsPosition.x + ssPosition.x) / 2, (fsPosition.y + ssPosition.y) / 2, (fsPosition.z + ssPosition.z) / 2);
//way 오브젝트 생성
GameObject way = Instantiate(wayObj, wayPos, Quaternion.Euler(0, angle, 0));
//생성된 way 오브젝트 크기 설정
way.transform.localScale = new Vector3(dist, 0.2f, way.transform.localScale.z);
way.GetComponent<Way>().NodeA = firstSpot;
way.GetComponent<Way>().NodeB = secondSpot;
//각 노드에 인접노드와 간선을 전달
firstSpot.GetComponent<Node>().AddAdjNodeWay(secondSpot, way);
secondSpot.GetComponent<Node>().AddAdjNodeWay(firstSpot, way);
// //각 노드에 상대노드의 정보를 전달
// firstSpot.GetComponent<Node>().AddNearNode(secondSpot);
// secondSpot.GetComponent<Node>().AddNearNode(firstSpot);
//선택됨을 나타내는 가시적 표현을 초기화
firstSpot.GetComponent<Node>().SelectedWayMode(false);
secondSpot.GetComponent<Node>().SelectedWayMode(false);
//선택된 노드를 선택해제
firstSpot = null;
secondSpot = null;
}
WayCreate 함수는 양 끝 노드가 설정되었을 때 간선을 생성하는 함수이다.