본문 바로가기

전체 글

(195)
[ 자료구조 ] 해시 테이블 - 03 . 개방 주소법 [ 개방 주소법 ] [ 개방 주소법 ] 개방 주소법 (Open Addressing)은 충돌이 일어날 떄 해시 함수에 의해 얻어진 주소가 아니라 다른 주소를 사용하게 허용하는 충돌해결 알고리즘이다 . 충돌이 일어나면 해시 테이블 내의 새로운 주소를 탐사 (Probe)하여 충돌된 데이터를 입력하는 방식으로 동작한다 . cf ) 체이닝은 오픈 해싱기법이자 폐쇄 주소법(Closed Addressing) 알고리즘이기도 하다 . 탐사방식은 다음과 같이 나뉜다 선형탐사 제곱탐사 이중해싱 [ 선형 탐사 ] 가장 간단한 탐사방법이다 . 해시 함수로부터 얻어낸 주소에 이미 다른 데이터가 있다면 , 해당 주소에서 고정폭 (1,2 .. )으로 빈 곳을 찾을때까지 다음 주소로 이동한여 찾는다면 그곳에 데이터를 입력한다 . ex..
[커스텀 에디터]버튼을 눌러 해당 URL로 이동 [ URL 이동 ] [ 해결 ] =>에디터 확장을 통해 인스펙터에서 URL로 이동하고자 한다 . const string guideURL = "http://optipng.sourceforge.net/"; GUILayout.TextField("제작 가이드 보기", EditorStyles.boldLabel); //해당 버튼을 눌러 가이드를 볼 수 있게 하였음 if (GUILayout.Button("이동")) { Application.OpenURL(guideURL); } Editor 를 상속한 스크립트에서 guideUrl로 이동한다. 참고 https://gist.github.com/yasirkula https://kjun.kr/1577
[커스텀 에디터]Fade Group를 활용하여 bool값 변경 [Fade Group] [문제] Editor의 확장을 통해 페이드 그룹이 켜지면 bool 값을 바꾸고 , 추가옵션을 보여주고자 하였다 . =>bool 값의 타겟은 isPaidMusic이고 , 해당 옵션이 true일때만 productCode와 productExplanation을 수정 할 수 있게 하려 했다 . 이를 위해 에디터 확장을 이용하였다 . [Editor 확장] 다음 스크립트는 Editor 폴더에 위치한다 . using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditor.TerrainTools; using UnityEditor.AnimatedValues; ..
[ UGUI ] ui 뒤 혹은 앞에 파티클 보이게 하기 [해결] [해결] 캔버스를 두개 생성한다 . 1.UI가 보이는 캔버스 2.이펙트가 보이는 캔버스 각 캔버스의 Order in Layer를 조정하여 원하는 값을 얻는다
[ 유니티 ]SkyBox가 인게임에서 안바뀌는 문제 해결 [문제] [문제 상황] RenderSettings.skybox =skyBox; DynamicGI.UpdateEnvironment(); 위의 메서드를 통해서 스카이 박스를 바꾸려 하는데 바뀌지 않았다 . [해결] [원인] 이유는 해당 메서드를 Init에서 실행해주었는데 (Awake와 비슷한 타이밍에 호출 되었을듯) 씬의 이동 방식이 그전씬 => 로딩 => 모든 과정이 완료(Init에서 완료를 처리함) =>씬이 활성화 의 순서였다. 그렇기에 씬이 완전히 로드 되기 전 , 즉 Loading씬의 SkyBox를 바꾸고 있던 것이다 . 이는 다음의 메서드로 해결하였다 IEnumerator SetSkyBox(Material skyBox) { yield return new WaitUntil(()=>SceneManage..
[ 유니티 ] 곡 별 점수를 PlayerPrefs에 저장하기 [ 데이터 형식] [public class MusicScoreData] 곡 별 최근 점수 / 최고 점수를 가지고 있다 . 각 점수는 다시 난이도에 따라 나뉜다 . public class MusicScoreData { public float recentEasyScore = 0; public float recentNormalScore = 0; public float recentHardScore = 0; public float bestEasyScore = 0; public float bestNormalScore = 0; public float bestHardScore = 0; } [public class TotalScoreData] PlayerPrefs에 저장되는 TotalScoreData는 MusicScor..
[ C# ] foreach 문을 돌리며 리스트 안에 객체를 삭제시 주의점 [ 주의점 ] [ 문제 상황 ] //곡의 점수는 있지만 MusicDataDic에는 없는 경우(해당 곡이 빠진 경우)를 확인 foreach (var musicData in totalScoreData.totalScoreDic.Keys) { if (SoundManager.instance.MusicDataDic.ContainsKey(musicData) == false) { Debug.Log("키는" + musicData); //해당 데이터를 지워준다. totalScoreData.totalScoreDic.Remove(musicData); } } =>문제의 메서드는 다음과 같다 . 아래와 같은 오류를 보여주었다 . [ 해결 ] =>이는 foeach 문을 돌리는 중 리스트 내부의 요소를 삭제하였기때문에 생긴 문제이다..
[ 자료구조 ] 해시 테이블 - 02 . 충돌 해결 [ 충돌 해결 ] [ 충돌 ] 해시 함수가 서로 다른 입력값에 대해 동일한 해시 테이블 주소를 반환하는 것을 일컬어 "충돌"이라고 한다 . 어떠한 해시 함수든 , 모든 입력값에 대해 고유한 해시값을 만들지는 못한다 . 즉 ,충돌은 불가피하다 . 충돌의 해결방법은 크게 두가지이다 . 개방 해싱 (Open Hashing) : 해시 테이블의 주소 바깥에 새로운 공간을 할당 , 문제를 해결 폐쇄 해싱 (Closed Hashing) : 처음에 주어진 해시테이블의 공간 안에서 문제를 해결 [ 체이닝 ] 체이닝은 개방 해싱 기반의 충돌 해결 기법이다 . 해시 함수가 서로 다른 키에 대해 같은 주소값을 반환해서 충돌이 발생하면 , 각 데이터를 해당 주소에 있는 링크드 리스트에 삽입 , 문제를 해결하는 기법이다 . 체이..