728x90

중요 기능은 총 세가지

1. Prefab Mode
 - 해당하는 프리팹을 수정하는 모드
 - Hierarchy 윈도우에서 > 를 클릭 시 접근 가능
 - Project 윈도우에서 더블 클릭으로 접근 가능

2. Nested Prefabs
 - 프리팹 안에 다른 프리팹을 넣을 수 있는 기능
 - 예) 사람 프리팹을 만들고 무기 프리팹을 만들어서 그 사람 프리팹 안에 넣을 수 있는 무 기 프리팹을 넣고 각 프리팹을 Prefab Mode 로 수정가능 (사람1, 사람2, 사람3 프리팹은 따로 쓰고 무기 프리팹은 하나로 관리 가능.)

3. Prefab Variants
 - 기존 프리팹의 데이터를 그대로 받아서 사용하되 하위 프리팹에 값을 넣을 경우 하위 프리팹에 사용된 값으로 적용됨.
 - 예) 원본 프리팹의 ScaleX 값이 0.1 일 경우 Variants 프리팹도 0.1 로 적용되지만 Variants 프리팹에 값 0.1 외의 값을 넣는 경우 넣은 값으로 변경됨. 이 사항은 컨포넌트 및 모든 것들에 해당됨.


추가 기능 설명
1. 프리팹 연결 끊기
 - 예) 만약 프리팹 안에 프리팹을 넣었는데 (Nested Prefabs) 안에 있는 프리팹을 부모의 프리팹 안에 합치고 싶을 경우.
 - 해당하는 프리팹을 오른쪽 마우스 버튼을 눌러서 Unpack Prefab 후 Overrides 하면 됨.
 - Unpack Prefab 과 Unpack Prefab Completely 의 차이
 - Unpack Prefab 은 선택된 프리팹만 연결 끊음.
 - Unpack Prefab Completely 는 선택된 프리팹과 하위에 있는 Nested Prefabs 모두 연결 끊음.

유튜브
https://www.youtube.com/watch?v=6_gAiPPKyUg

소개 블로그 - 한글
https://blogs.unity3d.com/kr/2018/06/20/introducing-new-prefab-workflows/

728x90
Posted by 정망스
,
728x90

사운드와 관련해서 알아보던중 unity5부터 추가된 오디오 믹서라는 기능이 있다는것을 이제서야 알았다.

 

여태까지는 오디오 리스너와, 오디오 소스 2개만으로 모든 사운드를 처리햇엇는데 믹서라는것을 알아보니 신세계였다;

 

 

지금은 나도 계속해서 공부를 하는 중이라 자세하게 설명하긴 힘들거 같고,

내가 정리한 결론은 오디오 소스에서 -> 믹서를 타고 들어가서 설정에 맞게 음향을 세팅할수 있고(라우팅 같은 그럼 개념) -> 리스너로 출력이 되는 그런 과정인듯 했다.

 

일단 믹서의 기능은 엄청 많지만 그중에 좋게 느껴진건 스냅샷 기능과, 사운드 그룹간의 부모 자식 관계 설정, effect add를 통해서 다양한 음향의 연출 효과 등등 적다보니 너무 많아서 다 못적겠다 아무튼 좋다.

 

추가된 effect에서 우클릭->expose를 하면 스크립트에서 해당하는 믹서에 string 변수로 접근도 가능하여 스크립트에서도 제어가 가능하고

 

스냅샷으로 각 상황에 맞는 오디오 세팅을 해주면 트랜지션 하면서 그때 그때 마다 음향의 효과를 또 바 꿀수도 잇고

 

내가 공부겸 만들어본건 잔잔한 음향을 리버브로 내면서, 음악을 하나 틀었는데 이 음악은 에코가 묻어나오면서 소리가 나오게 해보니 씬을 재생하면 마치 노래방에 있는듯한 느낌이 만들어졌다 상당히 재밌는 기능이다 ㅋㅋ

 

약간 이런 복합적인 기능을 만들려면 send, receive 개념도 알아야 하고 뭐 아직 이런건 다 정리해서 적지 못하겠다. 기회가 되면 정리를 해야겠다.

 

그래도 아직 모바일에서는 단순한 여러 믹서의 믹싱이나, 볼륨 조절용으로는 괜찮지만 리버브나 에코 같은 특수한 effect를 많이 넣게 되면 cpu 자원이 많이 소모되고, 메모리 영역도 사용할수있는 여지가 생기기 때문에 부하가 커질수 있다고 한다.

 

하드웨어 적인 한계도 있기때문에 아무리 화려하게 한들 하드웨어가 안되면 안되는 일도 태반이라고 하니 적당선에서 쓰는게 좋을듯 하다.

 

하드웨어에서 재생 가능한 채널수 제한이 잇으니 소리의 재생시간이나, 반복간격을 잘 파악해서 효과음 같은것도 잘 선택해야될꺼 같다. 게임에서 총을 쏠때 총 단발을 쏠때 소리와, 총을 연발로 쏠때 소리를 같은 효과음을 한다하면 연발로 총을 쏠시에 소리간 나다 안나다 할수가 있다.

이럴땐 그냥 연발용 효과음을 따로 제작해서 단발, 연발의 효과음을 다르게 가져가는게 좋을수도 있다라는 개념이다. ㅎㅎ

 

아무튼 좋은거 발견했다~

 

728x90
Posted by 정망스
,
728x90

NGUI를 이용하여 스크롤뷰를 만들경우에, 보통은 아래 그림과 같은 구조로 간단하게 만들수 있다.


스크롤뷰가 있고, 그 아래엔 오브젝트들 정리를 위한 그리드가 있고, 그리드 밑에는 오브젝트들이 배치가 되는 구조 이다.








스크롤뷰를 구성하기 위해 UIScrollView 컴포넌트를 오브젝트에 붙이면 UI Panel과 UI Scroll View 컴포넌트 2개가 붙게 된다. 


스크롤뷰 컴포넌트를 쓰기위해선 패널 컴포넌트도 무조건 따라오게 되어 있다.
















내가 이번에 테스트겸, 알아보고 싶었던거는 보통 게임들을 보면 스크롤뷰를 사용하되 특히 랭킹 같은 정보의 스크롤뷰를 보면 한번에 100개의 정보가 한번에 다 스크롤뷰에 보여주는 것이 아니라 스크롤 영역을 드래그 하면서 끝부분에 도달하면 이후의 정보들을 서버로부터 더 받아와서 뿌려주는 방식이 대부분이다.


이 판정을 어떻게 하는가에 대해 궁금하여 정리해보았다.



코드를 설명하면

스크롤뷰에 이벤트를 등록시켜준다, 드래그가 끝낫을때 처리하는 이벤트를 등록하고 이벤트 콜백함수는 bbb()라고 임시로 지었다.


이 함수에서 하는 일은 스크롤뷰안에 있는 드래깅 되고있는 패널(scrollView.panel)부분영역을 기준으로 CalculateConstrainOffset이라고하는 함수를 사용하여 매개변수로 스크롤뷰의 바운드(bounds) box 영역을 이루고 있는 최소점과 최대점(Vector) 값을 넘겨주면 스크롤뷰의 패널 영역 기준으로 현재 스크롤뷰 바운드가 얼마만큼의 차이(Offset)값이 났는지에 대한 결과값을 vector 값으로 준다.


이 결과값 vector를 이용해서 우리는 스크롤뷰를 드래그 하고나서 스크롤뷰가 스크롤뷰의 패널영역 어디 부분(y : 위, 아래  x: 왼쪽,오른쪽)에  도달했는지를 알수 있다.











위 그림을 통해서 좀 더 자세히 보면 주황색 영역과 겹쳐진 직사각형의 보라색영역이 스크롤뷰의 패널 영역입니다.(UI Panel) 패널 영역의 크기는 패널 컴포넌트의 Size와 관련이 있다.


그리고 직사각형의 주황색 영역이 스크롤뷰의 바운드(Bounds) 영역입니다. 실제로 스크롤뷰 아래 자식으로 무언가 오브젝트가 없다면 저 영역은 0과 마찬가지다, 사진에만 보이도록 하기 위해 제가 안보이는 오브젝트를 생성해두었다. (스크롤뷰 안에있는 그리드에 자식으로 오브젝트를 추가한것임)


이 바운드 영역은 오브젝트가 추가되고 삭제되고 할때마다 알아서 계산해서 바운드 영역을 잡아 주는것으로 테스트결과로 보았다.



위에서부터 4번째까지가 순서대로


scrollView.bounds.min

scrollView.bounds.max

scrollView.bounds.size.x

scrollView.bounds.size.y


값을 로그로 찍어봣다.

이 4개 값을 그림으로 그려보면 사각형 box가 이루어진다는것을 알수 있다

이 box가 현재 스크롤뷰의 bounds 영역이라는 것이다.


스크롤뷰를 드래그해서 패널 컴포넌트의 offset 값의 변동을 보게 되면, 밑으로 스크롤뷰를 드래그 했을때는 y값이 +가 되는걸 볼수 있고, 위로 드래그 했을대는 y값이 -가 되는걸 볼수 있었다.


즉 CalculateConstrainOffset 을 통해 가져온 값은 스크롤뷰의 패널영역내에서 스크롤뷰의 바운드영역의 현재 위치에 대한 차이값이므로 이 차이값에서 y가 0보다 커지면 밑으로 드래그 할수있는 최대영역에 도달했다는것(스크롤 상단끝에 도달)이고, y가 0보다 작으면 위로 드래그할수있는 최대영역(스크롤 하단끝에 도달)에 도달했다라는걸 알수 있다.


그리고 이러한 모든 처리를 하고나면 스크롤뷰의 포지션을 어떻게 다시 잡아줄거냐도 문제인데 
두가지 함수가 제공된다.

public virtual void SetDragAmount (float x, float y, bool updateScrollbars)
이 함수는 해당 위치로 바로 스크롤뷰를 이동시켜주는 함수다.
x와 y값은 0~1사이의 값을 넣어줘야 한다. 세번째 인자는 정확한 용도는 모르겟지만 이름만 봐서는 스크롤바도 사용하고있다면 이것도 갱신을 해줄지 안해줄지에 대한 bool 변수인듯 하다.

0을 넣으면 처음위치, 0.5는 중간, 1은 끝위치 정도로 생각하면 되겠다.


static public SpringPanel Begin (GameObject go, Vector3 pos, float strength)


이 함수는 해당 위치로 곧바로 이동시키는것이 아니라 애니메이션이 되면서 스무스 하게 스크롤뷰를 이동시켜 준다.


인자는 스크롤뷰를 가지고 있는 게임오브젝트를 넘겨주고 이동할 포지션, 그리고 세번째 인자는 뜻만봐선 힘인데 spring이라는 단어에서 유추할수 있듯이 힘이세면 스프링이 쎄게 팅기는원리처럼 스크롤뷰가 애니메이션으로 움직일때 어느정도의 강도를 줄것이냐 라고 정도로 이해하면 될듯 하다.


특정 아이템이있는 위치로 스크롤뷰를 이동시키고 싶으면 

가로로 움직이는 스크롤뷰이고 아이템이 차례대로 1개씩 정렬되어 있다는 가정하에


float itemWidth = 스크롤뷰.bounds.size.x 를 / 아이템 총 갯수 

로 나누면 아이템 한개당 width(폭)을 알수 있다.


float movePosX = -itemWidth * 위치하고싶은 아이템의 인덱스(스크롤뷰에서 몇번째에 있는지)

로 하면 해당 아이템으로 이동해야할 x 포지션을 구할수 있다.


x는 왼쪽으로 갈수록 -가 되니까 -를 해준거다.


SpringPanel.Begin(스크롤뷰.gameObject, new Vector3(movePos, 스크롤뷰.transform.localPosition.y), 1f);


이런식으로 하면 해당 아이템쪽으로 이동이 되는거다 애니메이션을 하면서.


SetDragAmount 함수에서도 똑같이


위와 같은 과정으로 moxPosX (이동해야할 폭)을 구하고 이 값을 / 스크롤뷰.bounds.size.z로 나누면 

0~1사이의 값으로 나올테니까 똑같이 비율 계산을 통해 이동시켜 줄수 있다.

728x90
Posted by 정망스
,
728x90

여기 정리글은 내 경험 토대로 적는거라.. 당연한 말일수도 있고 틀릴것이 있을수도 있고 혹은 되려 몰랏던 부분을 이글을 통해 알게 되는 사람이 있을수도 있다.. 고려해서 보길 바란다..


처음 번들 개념에 접근할때 햇갈리면 안되는 부분이 있다 번들은 해석하면 말그대로 묶음이다.

유니티에서 사용하는 에셋번들은 여러 에셋들을 하나로 묶어서 하나의 에셋번들로 만든다라는 개념으로 봐야한다.

(꼭 에셋번들이 여러개를 뭉친 작품이라는것은 아니다, 에셋한개당 번들 한개로도 만들수 있다 그건 개발하는 사람에 따라..)


번들을 만들때 우리는 에셋마다 에셋번들네임을 지정해준다. 이 번들네임은 에셋한개당 고유한 네임이 아니다. 3개의 오브젝트가 잇다면 이 오브젝트 모두 동일한 에셋번들네임을 지정해줄수 있고, 번들을 빌드해서 나온 결과를 보게 되면 지정한 에셋번들이름으로 에셋번들이 생성되어 있고 매니패스트 파일을 보게되면 그안에는 3개의 오브젝트가 각각 들어있다는것을 알수 있다.


이렇게 만들어진 에셋번들을 로드해와서 에셋번들안에 있는 우리가 알고 있는 에셋들의 이름을 통해 접근하고 가져와서 사용할수 있는거다.


번들작업을 하면서 크게 느꼇던 과정이 Ngui를 사용한 아틀라스를 번들로 만들어서 쓸때와 Scene을 번들로 만들어서 쓸때이다.


ngui로 아틀라스 작업을 하면 총 3개의 결과물이 생성된다. (아틀라스 프리팹과, 머테리얼, 텍스쳐) 번들에있는 아틀라스를 가져와서 모바일 기기에 적용시키려고 하니, 프리팹에 있던 각 스프라이트들의 아틀라스 연결이 다 끊어져있었다. 그래서 이것을 하나하나 다시 연결시켜줘야할 필요성이 있었는데, 번들로부터 아틀라스 프리팹을 가져와서 uiatlas 컴포넌트에 접근해서 다시 붙여 줬다. 하지만 안됬다.


왜 안되나 햇더니 번들을 잘못 만들엇던 것이다. 저 3개의 결과물을 한 번들안에(=같은에셋번들이름 지정)으로 해서 만들어야했는데 (프리팹만 번들로 이름을 지정하고 불러와서 적용이 되는걸 보니 머티리얼과, 텍스쳐의 참조성이 유지되는것 같다), 각각 이름이 달라 개별적으로 번들이 만들어져 버린것이다.

그래서 아틀라스 프리팹에 연결되어야했던 머테리얼이나 텍스쳐들이 연결성이 깨져버려서 안된것이다.


Scene같은 경우엔 날밤새면서 애좀 먹었다. Scene 자체를 번들에서 로드해오는건 어렵지 않았으나, 씬 안에 있는 여러 오브젝트들 그리고 그 오브젝트들이 사용하고 있는 머테리얼이나 셰이더가 다 깨져서 핑크(Pink)로 화면에 가득 채우는 현상이 발생했다.


외부에서 만든 커스텀셰이더를 사용할 경우에는 Edit -> Project Settings ->Graphics 항목에 들어가서

Always Included Shaders 항목에 사이즈를 추가시키고 해당하는 커스텀셰이더를 넣어라는 포럼 글을 봐서 했는데 되나? 싶더니 여전히 핑크가 되고 있었다.


좀 더 찾아보니 다른 글들을 보면 모두가 번들로 뽑아낸 셰이더와 관련된것들은 해당 플랫폼 기기에서는 잘 나오고 유니티 에디터 상에서는 핑크로 된다라는 공통적인 글들을 볼수 있었다.


그런데 이상하게 내가 하고있는건 에디터 상에선 잘나오는데 해당 플랫폼 기기에서는 핑크화 되는 것이였다.


너무 이상해서 작업한 코드를 다시 살펴 보던중 씬을 로드 할때마다 해당 씬에 있는 renderer들을 모두 가져와서 거기에 있는 머테리얼의 셰이더들을 다시 셋팅해주고 있었다;;;


예전에 어떤 글에서는 핑크화 될 경우에 셰이더들을 다시 잡아주면 된다라는 글을 보고 그렇게 한 것이고 에디터에서 잘 나오길래 오~ 하며 이렇게 하는거구나 햇는데 


이 부분이 모바일에서 핑크화 되는 원인이였던 것이다.


좀 더 포럼에서의 글들을 보니 셰이더와 관련된것들은 번들화 되었을때 해당 플랫폼에 맞는 그래픽 API로 변환된다는것을 보았다 Ios/Android 같은 경우는 OpenGLES2/3, Metal 등과 같은 그래픽 API라고 하는데 이렇게 되면 해당 플래폼 기기에서는 잘나와야 정상이라는 것이다.


핑크로 나온다는건 번들화 되어 있는 셰이더에서 사용하는 그래픽 api와, 기기에서 사용하는 그래픽 api가 달라서 그렇다는 것이다.


유니티 에디터는 윈도우라면 기본적으로 DirectX를 그래픽 api로 잡고있는데 번들에서 가져온 셰이더는 IOS/Andorid용으로 이미 만들어버린 다른 그래픽 api라서 핑크핑크로 나온다는 것이다.


그래서 저 코드 부분을 주석처리하고 빌드해서 하니 핑크 현상이 다 깔끔하게 사라졌다.


결론은 이 핑크현상은 유니티 에디터에서만 발생하는 것이고(그래픽api가 다르기 떄문에), 해당 플랫폼에선 번들화 될때 해당 플랫폼 그래픽 api에 맞게 셰이더가 변환되기 떄문에 잘 나온다는 것이였다. 


!!유니티 에디터에서 번들화 된것을 가져와서 핑크현상이 없이 보고 싶다면 머테리얼에 있는 셰이더를 다시잡아주는 작업을 코드로 해라 라는 그런 팁과 같은 글이 또 있었다. 나는 두서 없이 그냥 머테리얼 셰이더를 다시 잡아주니 잘되서 오 이거구나 한게 그냥 잘못이었던 것이다.


그리고 번들의 용량이 크지 않다면 unLoad 할필요 없이 딕셔너리 같은곳에 번들을 저장해두었다가 꺼내 쓰는 식으로 해도 되지만, 번들 하나 하나의 용량이 크다면 상황에 맞춰서 번들을 꼭 unload(true)를 해주어야 한다. (번들은 사용이 없을 경우엔 꼭 타이밍에 마춰서 unload(true)를 해주자 안그러면.. 번들이 계속 메모리에 올려져 와서 메모리가 계속 쌓이는 현상이 발생해버린다.)


실수로 번들을 로드한 후에 번들안에 있는 에셋들을 모두 가져다 썻다라고 생각하고 이제 해당 에셋번들을 unload(ture)를 한다면 씬에서 사용되고 있던 번들의 에셋들이 모두 메모리에서 제거 되서 한마디로 망해버리는수가 있다..


그러니 메모리에 계속 올라와있는건 그만큼 자원을 잡아먹고있다는 부분이니까 꼭 unload(true)를 해주되 더이상 해당 씬이라던지 아니면 어떤 상황에서 쓰지 않는 번들이라는 판단이 확실할 경우에만 unload를 해주어야 한다.

728x90
Posted by 정망스
,
728x90

Path.GetFileName(Path)

경로에 위치된 파일네임을 반환해줌.

ex.) Paht.GetFileName("c:WTest\test.txt") -> 반환값은 text.txt


반환된 파일네임에 확장자명을 제외하고 싶다면 Path.GetFileNameWithoutExtension(path); 를 사용하면 됨.


AssetDatabase.GetAllAssetPaths() 

에셋이 있는 모든 경로를 반환해줌(에셋 이름까지 포함)


AssetImporter

에셋임포터는 에디터 클래스로 이 클래스를 사용하려면 우선 프로젝트 폴더 안의 Assets/Editor에 

이 클래스를 사용하는 스크립트를 저장해야 한다고 한다.


이클래스 안에는 임포트때 사용하는 importSettings와, AssetBundleName 등과 같은 사용자가 데이터를 저장할수 있는 userdata를 가지고 있고 이를 직렬화 해서 메타 파일의 일부로 저장된다고 한다.

AssetImporter.GetAtPath(Path)를 이용해서 경로(에셋 이름까지 포함해서)에있는 에셋의 에셋 임포터를 가져올수 있고, 임포터에서 접근할수 있는 assetBundleName을 통해 어셋번들네임을 가져오거나 지정할수 있다, 보통 자동화로 번들작업을 할때 각 어셋별로 번들이름을 지정해주려 할때 코드 작업에서 많이 쓰일것 같다.


AssetPostprocessor

이것도 에디터 클래스이고 위의 에셋임포터와 같이 폴더 안의 Assets/Editor에 이클래스를 사용하는 스크립트를 저장해야 한다.

다양한 에셋들을 임포트 하는 과정에서 임포트 전이나 후같은 특정 시점과 특정 에셋들에 관해 처리해야 할 경우에 대비한 유용한 함수들을 제공하는 클래스이다.


AssetDatabase.RemoveUnusedAssetBundleNames()

에셋번들네임 작업을 마친후에 혹시나 사용하지 않고있는 번들 이름이 있을수도 있으므로 이 함수를 사용하면 사용되지 않는 번들이름을 제거해준다.


Directory.GetDirectories(Path)

Path로 넘기는 경로에 있는 하위 디렉토리들의 이름(경로까지 포함)을 반환한다.


Directory.CreateDirectory(Path)

Path로 넘기는 경로에 모든 디렉토리를 생성 시킨다.

 

Directory.GetFiles(Path)

Path로 넘기는 경로에 있는 파일 목록들을 반환한다. (경로까지 포함해서 반환)

ex.) path를 C/TEST라고 넘겻고 저 경로에 test.txt가 있다고 하면,  C/TEST/text.txt를 반환한다.


AssetBundle.LoadAsset(name), AssetBundle.GetAllScenePaths()

LoadAsset은 해당 에셋번들에서 name으로 입력된 에셋을 가져오는 역할,

GetAllScenePaths()는 해당 에셋번들에 있는 모든씬의 경로를 반환한다(씬 이름과 확장자(.unity) 까지


SceneManager.LoadScene이나, SceneManager.LoadSceneAsync를 등을 통해 씬을 불러올때 GetAllScenePaths()를 통해 가져온 씬이 있는 경로를 위의 두 함수 파라미터로 넘겨주면 된다.

무조건 번들에 하나의 씬만있다면 GetAllScenePaths()[0]을 하면 되는거고..

번들안에 여러개 씬이 잇다면 뭐 GetAllScenePath()를 통해 가져온 경로 문자열에 로드할려는 씬의 이름이 포함되어 있는지의 등의 검색을 통해서 가져오는 식으로 하면 될듯 하다.


AssetBundle.LoadFromFile(Path)

Path 경로에 있는 에셋 번들을 로드해온다.


AssetDatabase.SaveAssets()

에셋들이 수정되고 수정된 사항들이 저장되지 않은경우 이 함수를 호출하면 에셋번들의 변경사항을 저장한다. File -> SaveProject와 기능이 같다고 한다.


Selection

유니티 에디터에서의 선택과 관련된 클래스이고 이것도 에디터 클래스이다. 똑같이 프로젝트 폴더 안의 Assets/Editor에 이클래스를 사용하는 스크립트를 저장해야 한다.


ex.) Selection.gameObjects를 하면 유니티 에디터 상에서 현재 내가 선택한 모든 게임오브젝트의 목록을 스크립트 상에서 가져올수 있다.

foreach (GameObject prefab in Selection.gameObjects) 처럼 하나씩 접근해서 처리할수도 있다.


Enum.IsDefined(type, object)

object로 받는 상수값이나 이름이 type로 받는 enum 형식에 있는지의 여부를 반환한다.


TypeConverter, TypeDescriptor

TypeConverter는 타입 변환과 관련된 통합 된 방법을 제공하는 클래스이다

TypeDescriptor는 특성, 속성, 이벤트, 클래스 등과 같은 여러 구성 요소에 대한 정보를 제공하는 클래스이다.


ex.)

TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));

T type = (T)converter.ConvertFromString(text);

와 같이 TypeDescriptor에서 제공되는 GetConverter를 이용하면 파라미터로 넘겨준 type에 대한 TypeConverTer를 반환해주고 TypeConverTer에서 제공되는 ConvertFromString를 이용하면 text에 해당하는 값을 해당 type으로 변환한 값을 넘겨 준다.


BitConverter, MD5.ComputeHash

BitConverter 클래스는 기본데이터 형식을 바이트 배열 혹은 그 반대로 변환하는 방법을 제공하는 클래스이다.

MD5.ComputeHas는 MD5 암호화를 이용하여 해시값을 계산해서 바이트 배열로 반환을 해주는 함수이다.


ex.)

MD5 md5 = MD5.Create();

FileStream fs = File.OpenRead(path);

string value = BitConverter.ToString(md5.ComputeHash(fs)).Replace("-", string.Empty);

fs.Close();


path에 해당하는 경로에있는 파일을 파일 스트림으로 접근한후에 ComputhHash 인자로 스트림을 넘겨주면 계산된 해시값이 바이트 배열로 반환되고 BitConverter.Tostring을 통해 바이트 배열의 각 요소를 16진수 문자열로 변환해서 반환해준다. 변환된 값에 "-"가 추가되서 나오므로 제거할려면 저렇게 없애주면 된다.



728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침