이제 스크립트를 짤 시간이다.
스플라인으로 그린 선의 길이를 1로 두었을 때 0~1사이의 값을 주면 그 정점의 위치, 회전값 등등을 가져오는 메서드가 있다.
m_splineContainer.Evaluate(t,out position,out forward,out upVector);
이 함수이다. 여기서 t는 0~1사이의 값이다.
먼저 클래스 위에 이걸 선언한다.
[ExecuteInEditMode()]
public class SplineSampler : MonoBehaviour
{
}
이걸 선언하면 이 스크립트는 에디터모드에서 실행된다.
즉 start문이나 update문이 에디터모드에서 실행된다는 것.
우린 에디터 모드에서 확인을 해야하므로 선언해야한다.
도로를 그리기 위해선 스플라인으로 그린 곡선 안의 정점들이 필요하다.
[SerializeField] SplineContainer m_splineContainer;
public SplineContainer SplineContainer { get { return m_splineContainer; } }
[SerializeField] private float m_width;
public float Width { get { return m_width; } }
Vector3 p1;
Vector3 p2;
float3 position;
float3 forward;
float3 upVector;
변수들을 미리 선언한다.
메쉬를 그려야하므로 도로의 넓이를 의미하는 변수인 m_width를 선언.
그리고 넓이에 의해 결정되는 도로의 양 끝점인 p1,p2를 선언한다.
public void SamplerWidth(float t, out Vector3 p1, out Vector3 p2, bool NotUp = false)
{
m_splineContainer.Evaluate(t,out position,out forward,out upVector);
float3 right = Vector3.Cross(forward, upVector).normalized;
if (NotUp == true)
right = Vector3.Cross(forward,transform.up).normalized;
p1 = position + (right * m_width);
p2 = position + (-right * m_width);
}
이제 p1,p2를 구하기 위해 좌우측으로 얼마나 가야되는지를 정하는 방향벡터를 구한다.
Evaluate로 나온 정면 벡터와 위를 향하는 벡터를 외적하여 방향벡터를 구한다.
