반응형 개발/Unity235 유니티 - 드로우 콜 횟수 최적화하기 (Optimizing Draw Calls, Batches) Unity 전체 링크 참고 - CombineInstance로 메시 합치기 - OnGUI로 실시간 초당 프레임 수 확인하기 - 드로우 콜 배칭 (Unity 메뉴얼) - OnGUI, ProfilerRecorder로 런타임 드로우 콜 확인하기 드로우 콜, Batches 아래와 같이 쿼드 5개를 배치하고 게임을 실행한 후, Game Scene에서 Stats을 확인해보자. 유니티는 Draw Call 횟수를 Batches로 알려준다. Draw Call은 CPU가 GPU에 오브젝트를 그려라고 하는 명령의 호출을 의미한다. Draw Call 횟수가 많을수록 렌더링 횟수가 많아지므로 성능이 떨어지거나 기기가 빨리 뜨거워진다. Draw Call을 줄이는 방법은 여러 가지가 있지만 간단히 해결하는 방법은 아래 세 가지가 있.. 2022. 11. 30. 유니티 - 3차원에서 두 직선 사이의 최단 거리를 만드는 직선 (How to Find the Points of Intersection Two Lines in 3D) Unity 전체 링크 참고 - 평면과 직선의 접점 좌표 구하기 - 튜플로 여러 값 반환하기 아래와 같이 빨간 직선과 파란 직선이 3차원 공간에 있을 때, 두 직선의 최단거리와 최단거리를 만드는 초록색 직선을 구해보자. 3차원에 있는 두 직선의 최단거리 두 직선의 최단거리 공식은 다음과 같다. 점 A, B가 만드는 직선과 점 C, D가 만드는 직선이 있을 때, 직선 AB의 점 하나(=A)와 직선 CD의 점 하나(=C)로 직선을 만들고 아래의 공식을 대입하면 거리를 구할 수 있다. 위의 공식 AC에서 A나 C가 아니더라도 각각 직선 AB와 직선 CD에 포함된 모든 점이 가능하다. 유니티에서는 아래와 같이 구현하면 된다. float getDistanceTwoLine(Vector3 A, Vector3 B, Ve.. 2022. 11. 26. 유니티 - 다각형 좌표의 시계 방향 판단하기 (How to Determine If a Polygon is Clocwise) Unity 전체 링크 참고 - 세 점을 지나는 평면 구하기 - 3차원 세 점의 좌표로 삼각형의 넓이 구하기 - Vector3.Cross로 평면 위에서 시계 방향 판단하기 다각형 좌표의 시계 방향 판단하기 = 다각형의 넓이 구하기 아래와 같이 별 모양의 다각형이 주어졌다고 가정하자. 점의 배치를 보면 시계방향으로 좌표가 정렬되어 있다. 처음 3개의 점은 시계 방향이다. 하지만 다음 3개의 점은 반시계 방향이다. 좌표를 볼 때, 시계 방향으로 배치하였지만, 점 3개씩 방향을 체크하면 시계 방향과 반시계 방향이 같이 존재한다. 즉, 점 3개씩 비교하는 것으로 좌표가 시계 방향인지 반시계 방향인지 판단할 수 없다. 좌표가 주어졌을 때 시계 방향인지, 반시계 방향인지 판단하는 함수를 만들어보자. Settings .. 2022. 11. 25. 유니티 - 직선을 N등분 하기 (Dividing a Line) Unity 전체 링크 직선을 나누는 방법은 간단하다. 아래와 같이 두 점과 몇 개로 나눌지 입력받은 함수를 나눈 뒤, 두 점을 빼고 N등분 한 후 하나씩 더해주면 된다. List getDivideLinePoint(Vector3 a, Vector3 b, int n) { Vector3 divide = (b - a) / n; List points = new List(); for(int i = 1; i < n; i++) points.Add(a + divide * i); return points; } 두 점은 public으로 선언해서 Inspector에서 받도록 하자. 여기서는 임의의 큐브를 생성해서 배치하였다. N등분하는 점들의 좌표를 눈으로 보기 쉽도록 CreatePrimitive를 이용하자. List poi.. 2022. 11. 23. 유니티 C# - 비교 함수를 이용하여 리스트 정렬하기 (List Sorting with Compare) Unity 전체 링크 먼저 List를 출력하는 함수를 만들자. void printList(List list) { string text = string.Empty; foreach (T l in list) text += l.ToString() + ", "; Debug.Log(text); } 기본적으로 int 타입의 List에서 Sort()를 실행하면 오름차순 정렬이 된다. List listInt = new List(); listInt.Add(5); listInt.Add(7); listInt.Add(3); listInt.Add(7); listInt.Add(-2); listInt.Add(-4); listInt.Sort(); printList(listInt); 실행결과는 아래와 같다. 하지만 만약에 벡터를 정렬한.. 2022. 11. 22. 유니티 - Vector3.Cross로 평면 위에서 시계 방향 판단하기 (How to Determine Clockwise on the Plane with Vector3.Cross) Unity 전체 링크 참고 - 평면과 점 사이의 최단거리 구하기 - 평면과 점 사이의 최단거리를 만드는 평면 위의 점 구하기 - 다각형 좌표의 시계 방향 판단하기 (How to Determine If a Polygon is Clocwise) 세 개의 점이 다음과 같다. d1 = new Vector3(0, 0, 0); d2 = new Vector3(1, 0, 1); d3 = new Vector3(0, 0, 1); d1 → d2 → d3는 반시계 방향이고, d1 → d3 → d2는 시계 방향이다. 모든 좌표가 y = 0이기 때문에 ccwBy2D가 + 면 시계 방향, - 면 반시계 방향이다. 참고로 이 방향은 점 3개로 Plane을 만들 때의 방향과 동일하다. using System.Collections; u.. 2022. 11. 11. 유니티 - 평면과 점 사이의 최단거리를 만드는 평면 위의 점 구하기 Unity 전체 링크 참고 - 평면과 점 사이의 최단거리 구하기 - Vector3.Cross로 평면 위에서 시계 방향 판단하기 파란색 공과 평면 사이의 최단거리를 구하고, 평면 위에 최단거리를 만드는 점을 빨간색 공으로 표시해보자. Plane과 파란색 공을 만들고 DotOnthePlane.cs를 파란색 공에 추가한다. 그리고 planeObject에 Plane을 할당하고 OnDrawGizmos로 평면의 노멀 벡터를 그려보자. public GameObject planeObject; public GameObject dotOnthePlane; void OnDrawGizmos() { Gizmos.color = Color.blue; Gizmos.DrawRay(planeObject.transform.position,.. 2022. 11. 11. 유니티 - triangles로 다각형의 원래 좌표 복구하기 (Recover the Original Coordinates of a Polygon with Triangles) Unity 전체 링크 절차적 메시와 삼각분할로 임의의 다각형을 만들고 저장하자. 빈 오브젝트에 Mesh Filter와 Mesh Renderer를 추가한 후 MyMesh를 추가해보자. 이제 위의 오브젝트에 아래의 스크립트를 추가하고 실행하자. using System.Collections; using System.Collections.Generic; using UnityEngine; public class MakeClockWiseCoordinate : MonoBehaviour { Mesh mesh; List triangles = new List(); void init() { mesh = this.GetComponent().mesh; vertices = new List(mesh.vertices); triang.. 2022. 11. 8. 유니티 - CombineInstance로 메시 합치기 (Combine Meshes with CombineInstance) Unity 전체 링크 참고 - 드로우 콜 횟수 최적화하기 (Optimizing Draw Calls, Batches) Quad 5개가 그림과 같이 배치되어 있다. 5개 오브젝트의 mesh를 하나로 합쳐보자. Mesh 정보를 불러올 오브젝트들을 public으로 선언한다. public GameObject[] go; 오브젝트에서 MeshFilter의 정보를 얻은 다음, mesh를 CombineInstance에 넣어주고, 좌표도 전환한다. meshFilters의 transform(=GameObject의 transform)의 로컬 좌표를 월드 좌표로 전환해서 넣어준다. MeshFilter[] meshFilters = new MeshFilter[go.Length]; CombineInstance[] combine = .. 2022. 11. 7. 이전 1 ··· 3 4 5 6 7 8 9 ··· 27 다음 반응형