전체 글

전체 글

    Label Update

    Label Update

    https://growy.tistory.com/39?category=1206374 Layout Update 위와 같은 구조에서 Layout 노드에 아이템을 추가/삭제할 때마다 Layout 노드의 사이즈도 유동적으로 변한다. 아이템 간의 padding(간격)과 레이아웃에 속해 있는 아이템들의 넓이들을 모두 더한 값을 growy.tistory.com 위와 비슷한 내용을 다루려고 한다. Label 컴포넌트는 내용(string)에 따라서 노드 사이즈가 유동적으로 변하는 특징이 있다. 문제는 에디터의 프로퍼티창에서는 확인할 수 있지만, 스크립트에서도 똑같이 작동할까? let size = this.targetLabel.node.getContentSize(); this.targetLabel.string = '1111..

    아주 심플한 가중치 랜덤 뽑기

    아주 심플한 가중치 랜덤 뽑기

    어떤 상자를 열면 A, B, C, D, E 다섯 개의 아이템 중 하나가 나온다. 그리고 이 다섯 개의 아이템이 나올 확률이 각각 다르다면 대부분은 이것을 테이블화시킬 것이다. 하지만 이런식으로 테이블을 만들면 문제가 생긴다. 한 아이템의 확률을 조정하거나, 아이템을 삭제하거나, 새 아이템을 추가하게 된다면 모든 아이템의 확률 총합이 100%가 되지 않게 되면서, 그때마다 나머지 아이템들의 확률도 같이 조정해야 한다.  그래서 가중치라는 게 필요하다.   각 아이템의 가중치를 그 아이템의 부피라고 생각할 수 있다. 그림처럼 일렬로 붙인 다음에 Random pivot 포인터가 왼쪽 끝에서부터 오른쪽 끝까지 왔다 갔다 한다고 가정해보자. 어느 순간에 포인터를 스탑 시키고, 포인터가 어디 위에서 멈췄는지 확인하..

    랜덤 맵 생성 알고리즘 #1 프롤로그

    랜덤 맵 생성 알고리즘 #1 프롤로그

    로그라이크 게임을 만들기 위해서 랜덤 맵 생성 기능을 만들다가 현재 버전까지 만들어놓고 개발을 중단한 지 수개월이 지났다. 밑에 배경을 깔고, 나무나 바위같은 오브젝트들도 랜덤으로 배치하는 기능까지 추가하고 싶었지만 만들려는 게임의 기획이 또 바뀌면서, 지금까지 한 게 기억 속에서 잊힐 것 같아서 블로그에 내용을 정리라도 하기로 마음 먹었다. 참고로 신입 때 제작했던 포트폴리오에서는 두 가지의 던전 타입을 만들었던 경험이 있다. 위에는 Tiled라는 고전 타일 에디터로 캔버스 위에 바닥 타일과 오브젝트 타일들을 단순하게 그린 방식이고, 아래는 에셋을 구매한 뒤 수정을 한 방식이다. 수정을 하면서 절차적 맵 생성(Procedural Map Generation)을 공부하게 됐다. 에셋은 완벽하게 본인이 처음..

    Call By Sharing

    let array = [0,0,0];array = [];C#에서는 Array와 List에 Clear 함수가 있지만, 자바스크립트와 타입스크립트에는 존재하지 않는다. 그래서 자바스크립트에서는 배열을 빈 배열로 초기화할 때는 위와 같이 빈 배열 []로 덮어 씌우면 된다.  그동안 위와 같은 방법을 계속 사용하다가 흥미로운 점을 발견했다. onLoad() { let array = [0,0,0]; this.Clear(array); console.log(array); // [0,0,0]}Clear(array: Array) { array = [];}Array 타입은 number와 같은 기본 타입이 아닌 객체 타입이기 때문에 Clear 함수의 매개변수로 전달할 때 Call By Refer..

    프리팹 안에 프리팹

    프리팹 안에 프리팹

    코코스 크리에이터에서도 프리팹을 씬에 배치했을 때 유니티의 Select, Revert, Apply에 대응하는 Select, Go Back, Save 버튼이 있다. Select : assets 폴더에서 프리팹의 위치로 이동 Go Back : 씬에 배치된 프리팹의 내용을 원본 프리팹의의 내용으로 덮어쓰기 Save : 씬에 배치된 프리팹의 내용을 원본 프리팹에 저장 하지만 A 프리팹 안에 B 프리팹을 배치한 구조에서는 B 프리팹의 Go Back, Save 기능이 사라진다. B 프리팹을 수정하면 A 프리팹을 열어서 기존 B 프리팹을 삭제하고 새 B 프리팹을 다시 배치해야 된다. 이러한 불편함은 왼쪽의 파란색 클립 모양을 눌러 해결할 수 있다. 이걸 누르면 해당 B 프리팹은 auto-syncable 프리팹이 되고..

    함수 리스트 (Delegate)

    유니티에서 옵저버패턴과 delegate를 사용했었던 경험이 몇 번 있었는데, 타입스크립트와 코코스 크리에이터를 사용하는 프로젝트에서도 비슷하게 사용하고 싶은 상황이 생겼다. export class Manager { static delegate1: { [key: string]: any } = {}; // functions 컬렉션 static delegate2: Array = []; // functions 배열}delegate는 이런 식으로 Dictionary 형태 또는 List 형태로 생성할 수 있다. 아무래도 타입스크립트는 함수와 변수를 다루는 데 있어서 차이가 없다시피 하고 any 타입으로 함수를 지칭할 수 있기 때문에 사용하기 더 간편하다.  start() { Manager..

    오브젝트 풀링 (Ojbect Pooling)

    오브젝트 풀링 (Ojbect Pooling)

    위 게임은 뱀파이어 서바이벌이라는 게임인데, 오브젝트 풀링에 분명히 신경을 많이 썼을 것으로 예상돼서 가져왔다. 오브젝트 풀링은 대표적이고 전통적인 최적화 기술 중 하나고 다양한 방면에서 활용할 수 있다. 꽤나 중요하고 자주 쓰는 기술이다 보니 검색하면 관련 내용들이 무수히 나온다. 하지만, 그렇다고 유니티가 따로 오브젝트 풀링 관련된 API를 제공하지는 않는다. 반면 코코스 크리에이터에서는 오브젝트 풀링 API를 제공하고 있다. 그리고 코코스는 오브젝트를 노드로 부르기 때문에 그 이름이 노드 풀링(Node Pooling)이다. 오브젝트 풀링은 여러가지 예외처리, 최적화 처리를 해줘야 해서 built-in 된 API를 그대로 쓰는 것보다는 직접 구현하는 것이 적절하다고 생각하지만, 그래도 한 번 정리해본..

    Layout Update

    Layout Update

    위와 같은 구조에서 Layout 노드에 아이템을 추가/삭제할 때마다 Layout 노드의 사이즈도 유동적으로 변한다. 아이템 간의 padding(간격)과 레이아웃에 속해 있는 아이템들의 넓이들을 모두 더한 값을 자동으로 계산한다. 그러나 스크립트에서 아이템을 추가했을 때는 자동으로 계산이 되지 않는다. let width1 = this.testLayout.node.width; // 391.48 let newLabel = cc.instantiate(this.testLayout.node.children[0]); newLabel.setParent(this.testLayout.node); let width2 = this.testLayout.node.width; // 391.48 실제로 위의 코드를 디버깅해보면 레이..