https://docs.unity3d.com/kr/2018.1/Manual/RandomNumbers.html

우선 스크롤뷰를 사용하는 방법에는 여러가지가 있다


1. Vertical하게 컨텐츠들을 배치하는 방법




2. Horizontal하게 컨텐츠들을 배치하는 방법




3. Vertical하게 배치하되 한 줄에 여러 컨텐츠를 넣는 방법




등등이 있다


이러한 스크롤뷰 내의 Content와 Content의 child들의 size , position을 일일이 코드로 수정해주려면 매우 힘들다.

그렇기 때문에 유니티는 여러가지 좋은 컴퍼넌트들을 제공해준다. 그 방법을 알아보자.


우선 가장 기본적인 것은 Content의 Child로 들어갈 Ui들에 LayoutElement를 추가해주는 것이다


아래와 같이 Preferred Width와 Height를 체크해주어서 적절한 사이즈를 정해주자....


그 다음에는 Content에 여러 두가지 컴퍼넌트가 각각 필요하다


우선 공통적으로는 Content Size Filtter가 필요하다

스크롤뷰를 아래위로 당기는지 혹은 좌우로 당기는지에 따라 


아래위로 당기는 경우 Vertical Fit을 Preferred Size로 Horizontal Fit을 Uncontrained로

좌우로 당기는 경우 Vertical Fit을 Uncontrained로 Horizontal Fit을 Preferred Size로 설정한다

Vertical Fit, Horizontal Fit 모두 Preferred Size로 설정한다


그 다음 


1. 아래 위로 당기는 경우에는 Vertical layout Group을


2. 좌 우로 당기는 경우에는 Horizontal layout Group을


3. 한 줄 혹은 한 행에 여러 Content child가 들어가는 경우에는 Grid layout Group을


각 컴포넌트의 설정방법은 아래의 것을 참고하면 된다..



특별하게 Grid Layout Group의 경우에는 


한 줄에 여러 컨텐츠를 넣는 경우에는 Cell Size를 조정, Constraint를 Fixed Column Count를 한 줄에 들어갈 컨텐츠 개수로 정해주면 된다


한 행에 여러 컨텐츠를 넣는 경우에는 Cell Size를 조정, Constraint를 Fixed Row Count를 한 행에 들어갈 컨텐츠 개수로 정해주면 된다




Start Axis는 Content의 Child 순서대로 ScrollView에서 어떤 순서로 배치할지를 결정한다

horizontal은 Child 순서대로 왼쪽에서 오른쪽으로 스크롤뷰를 채워나간다

vertical은 Child 순서대로 위에서 아래로 스크롤뷰를 채워나간다










Content와 Content의 child로 들어갈 오브젝트의 Anchor을 조정해주어서 적절한 위치를 정해주자


C# Dictionary에서 key를 enum이나 struct으로 사용 시 매우 주의해야할 점


Dictionary key 값으로 enum이나 struct을 사용하면 알게 모르게 사용하면서 엄청난 양의 가비지가 발생한다


그 이유는 enum이나 struct은 Equals, GethashCode가 구현되지 않았기 때문에 Dictionary의 Contain 함수를 사용할 때 비교를 위해 부모 클래스 형인 Object로 박싱하여 Object끼리 비교를 해야하기 때문이다. 예를 들면 A라는 딕셔너리가 있고 A.ConatinKey(키값) 이나 A[키값]을 사용 할 때 모두 내부적으로는 비교구문이 실행된다. 비교를 위해서는 비교 함수를 사용하는데 이때 자신이 만든 enum , struct은 Equals, GethashCode가 구현이 되어 있지 않아 박싱을 해야하고 박싱을 할 때 가비지가 발생한다.


이러한 문제는 프로그램이 커질 수록 더 많은 양의 가비지를 발생시켜 나중에는 문제가 될 가능성이 많다


이를 해결하기 위해서는 IEqualityComparer<T> 인터페이스를 상속받는 클래스를 선언하여 Dictionary 인스턴스를 생성할 때 생성자로 넣어주면 된다


아래와 같이 struct(Vector3) , enum(MoviePoint)에 대한 Comparer 클래스를 생성해주면 된다.



public class Vector3Comparer : IEqualityComparer<Vector3>

{

    public bool Equals(Vector3 x, Vector3 y)

    {

        return x.x == y.x && x.y == y.y && x.z == y.z;

    }


    public int GetHashCode(Vector3 vector)

    {

        return vector.x.GetHashCode() ^ vector.y.GetHashCode() << 2 ^ vector.z.GetHashCode() >> 2;

    }

}


public class MoviePointComparer : IEqualityComparer<MoviePoint>

{

    public bool Equals(MoviePoint x, MoviePoint y)

    {

        return (int)x == (int)y;

    }


    public int GetHashCode(MoviePoint obj)

    {

        return ((int)obj).GetHashCode();

    }

}


Dictionary<Vector3, bool> dic = new Dictionary<Vector3, bool>(new Vector3Comparer());


Dictionary<MoviePoint, bool> dic = new Dictionary<MoviePoint, bool>(new MoviePointComparer ());

+ Recent posts