본문 바로가기

Unity/Unity 기타

Unity3D- FieldOfView 시야구현(2)

1. 플레이어 시야각 가시화 하기

 - FieldOfView 스크립트

 - 총시야각을 stepCount 수로 등분하고

 - 하나의 조각시야각을 stepAngleSize로 지정

 - 총시야각을 stepAngleSize만큼 나누어 Ray를 그린다

*4/06 수정

1).ex) 해상도=0.1, 총시야각 =60도 --->등분수stepCount =10등분 =>  등분수steopCount = 6분등 으로 수정

2).ex) 등분수=10등분 ---> 한조각 각도stepAngleSize =6도 => 등분수=6등분 ---> 한조각 각도stepAngleSize=10도

3).for(int i=0; i<stepCount; i++)  => for(int i=0; i<=stepCount; i++) 로수정

 

 

 

 

2. 시야각 가시화하기(2)

 - FieldOfView 스크립트

 - 1에서 나누어 그려본 Ray방향으로 Ray를 직접 발사하여 장해물에 도달하면 해당 장해물에 도달한 지점을 저장,

    해당 Ray가 장해물에 도달하지 않으면 본래 나아갈 길이만큼 나아간 끝부분 지점을 저장

 -  위 지점들을 꼭지점으로 하고 Ray를 발사한 플레이어를 원점으로 하여 원점을 포함한 꼭지점들의 모임인 정점배열        을 만들고,

 -  위 정점배열들로 만들 수 있는 삼각형의 갯수를 정의하여 삼각형을 만들기 위해 필요한 정점들의 모임인 삼각형꼭지      점 배열을 만든다   

 

 

* 커스텀 메쉬를 만들기위해  정점배열과, 삼각형을 이루는데 필요한 꼭지점배열이 필요한 이유

참조 : uemonwe.tistory.com/4

 

유니티(Unity) | 메쉬(Mesh) 코드로 만들기

Unity에서는 Mesh를 만들기위한 코드를 제공하며 DX와 비슷하기 때문에 DX를 좀 하신분이라면 어렵지 않게 접근할 수 있습니다. DX를 전혀 모르시더라도 네이티브 언어로 접근하는게 아니기에 Mesh가

uemonwe.tistory.com

 

3. 시야각 가시화하기(3)

 

 - 시야각 커스텀메쉬를 만들기 위해 인스펙터창에 등록할 빈 meshFilter를 선언해주고

 - 이 후 할당할 meshfilter컴포넌트의 mesh에  우리가 만들 customViewMesh 메쉬를 채워 넣어준다

 

 - Player의 자식오브젝트로 빈오브젝트를 생성하고 View Visualation으로 Rename한다

 - 여기에 우리가 만들 커스텀메쉬가 들어가 mesh실체를 형성하기 위해 필요한 MeshFilter컴포넌트를 만들어준다

   (현재 None이라고된 Mesh속성에 커스텀메쉬가 들어가 실체를 형성할 예정)

 - MeshRenderer컴포넌트도 만들어준다 이는 실체화한 Mesh에 Material을 렌더링하기 위한 컴포넌트이며 

   해당Mesh가 그림자를 그리지 않도록 Cast Shadows를 off해주고,

   다른 물체의 그림자가 Mesh에 그려지지 않도록 Receive Shadows를 체크해제 해준다

 

- 2에서 만든 정점배열과 삼각형꼭지점배열을 커스텀메쉬를 만들기위해 필요한 mesh.vertices배열과 mesh.triangles배열에 대입해주어 커스텀 메쉬를 완성시킨다

- mesh.Clear()와, mesh.RecalculateNomals()를 활용하여 시야각 해상도에따라 바뀌는 정점 정보(mesh.vertice)에 대해 삼각형정점배열 정보(mesh.triangles)를 재설정하는데 용이하도록 구현해준다 

*mesh.vertices is too small...에러를 mesh.Clear()로 해결

 

 - 정점배열의 첫번째 원소이자 원점인 vertexs[0]의 위치가 로컬포지션인것과 같은 이유로 나머지 정점들인 

    vertexs[i+1]원소들의 위치도 로컬포지션으로 바꿔주기 위해 transform.InverseTransformPoint()를 활용하여 

    지역좌표계 기준으로 바꿔준다

4. 시야각 가시화하기(4)

 - 이제 유니티 에디터에서 Player가 시야를 얼마나 정밀하게 관찰하는지에 대한 해상도(높을 수록 총 시야각을 많은

   조각으로 나눔)인 Mesh Resolution을 설정해주고

*Mesh Resolution을 0으로 두고 Play를 누르면 overFlow exception 에러가 난다

 - Player의 MeshFilter인스펙터에 우리가 3에서 만든 View Visualation오브젝트를 드래그 앤 드랍한다

 - Play를 누르면 우리가 원하는 시야각 가시화에 근접하게 도달한다

 - Play를 하니 View Visualation의 Mesh Filter에 우리가 만들고 View Mesh로 이름을 설정한 시야각 커스텀 메쉬가 들어간 것을 볼 수 있다.

 

- Mesh Renderer컴포넌트를 만든 이유 => Material을 하나 생성하여 상단의 Rendering Mode를 fade모드로 바꿔주고

  흰색의 투명한 재질을 우리의 시야각 커스텀메쉬에 드래그 앤 드랍하여 입혀준다

*참고 Rendering Mode : docs.unity3d.com/kr/530/Manual/StandardShaderMaterialParameterRenderingMode.html