odyssey

#15 odyssey 개발일지 : 지형 생성기 만들기

san10 2023. 7. 24. 13:54

https://san10.tistory.com/10

 

#5 odyssey 개발일지 : 베지어 곡선으로 곡선 지형 생성

지금까지는 임시로 곡선 지형을 만들었는데 이제는 베지어 곡선으로 지형을 만들려고 한다. 베지어 곡선이란? n개의 조절점과 선형 보간을 통해 얻을 수 있는 곡선으로, n-1차 베지어 곡선이라고

san10.tistory.com

 

https://san10.tistory.com/19

 

#7 odyssey 개발일지 : 커스텀 에디터

odyssey의 지형생성 방식에 대해 생각해봤는데.. 미리 여러 타입의 지형을 생성해놓고, (일단은) 런타임 중에 적당히 랜덤하게 붙이기로 했다. https://san10.tistory.com/10 #5 odyssey 개발일지 : 베지어 곡

san10.tistory.com

저번 개발일지때 베지어 곡선으로 지형을 만들었는데..

이렇게 만드니깐 문제점이

직접 만들어보기 전까지 지형이 어떻게 생겼을지 예측이 힘들었다!

 

앞으로 지형을 많이 만들어야 할텐데

이렇게는 힘들것 같아서 

에디터 상에서 바로 베지어 곡선이 보이게 만들려고 한다

 

구현

https://blog.naver.com/PostView.nhn?blogId=dasoong15&logNo=222223767429&parentCategoryNo=&categoryNo=7&viewDate=&isShowPopularPosts=true&from=search 

 

유니티 베지어 곡선 구현방법

https://www.youtube.com/watch?v=KTEX2L4T4zE 아래는 4개의 점 이상의 베지어 곡선 구현입니...

blog.naver.com

저번에 베지어 곡선으로 지형만들때도 이 코드를 많이 참고했는데

이번에도 많이 참고해서 만들었다 ^~^

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(BezierMeshGenerator))]
public class BezierMeshEditor : Editor
{
    private void OnSceneGUI()
    {
        BezierMeshGenerator bezierMeshGenerator = (BezierMeshGenerator)target;

        bezierMeshGenerator.p1 = Handles.PositionHandle(bezierMeshGenerator.p1, Quaternion.identity);
        bezierMeshGenerator.p2 = Handles.PositionHandle(bezierMeshGenerator.p2, Quaternion.identity);
        bezierMeshGenerator.p3 = Handles.PositionHandle(bezierMeshGenerator.p3, Quaternion.identity);
        bezierMeshGenerator.p4 = Handles.PositionHandle(bezierMeshGenerator.p4, Quaternion.identity);

        int count = 30;
        for(float i=0; i<count; i++)
        {
            float beforeIndex = i / count;
            Vector3 beforePoint = bezierMeshGenerator.bezierGenerator.BezierPoint(
                bezierMeshGenerator.p1, bezierMeshGenerator.p2, bezierMeshGenerator.p3, bezierMeshGenerator.p4, beforeIndex);

            float afterIndex =( i+1) / count;
            Vector3 afterPoint =  bezierMeshGenerator.bezierGenerator.BezierPoint(
                bezierMeshGenerator.p1, bezierMeshGenerator.p2, bezierMeshGenerator.p3, bezierMeshGenerator.p4, afterIndex);

            Handles.DrawLine(beforePoint, afterPoint);
        }
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        BezierMeshGenerator bezierMeshGenerator = (BezierMeshGenerator)target;
        if (GUILayout.Button("MeshGenerate"))
        {
            bezierMeshGenerator.CreateBezierMesh();
        }
    }
}

결과