https://growy.tistory.com/39?category=1206374
위와 비슷한 내용을 다루려고 한다.
Label 컴포넌트는 내용(string)에 따라서 노드 사이즈가 유동적으로 변하는 특징이 있다.
문제는 에디터의 프로퍼티창에서는 확인할 수 있지만, 스크립트에서도 똑같이 작동할까?
let size = this.targetLabel.node.getContentSize();
this.targetLabel.string = '1111111111';
let size2 = this.targetLabel.node.getContentSize();
위와 같은 코드에서 디버깅을 해보면
targetLabel의 노드 사이즈는 변하지 않는다.
런타임 중에 Layout에 아이템을 추가해도 한 프레임(1 델타타임) 뒤에 노드 사이즈가 변한 것처럼 Label도 동일한 구조다.
cc.tween(this.node)
.call(() => {
let size = this.targetLabel.node.getContentSize(); console.log(size);
this.targetLabel.string = '1111111111';
})
.delay(cc.director.getDeltaTime())
.call(() => {
let size2 = this.targetLabel.node.getContentSize(); console.log(size2);
})
.start();
Label의 string 값을 초기화하고 직후(같은 프레임)에 노드 사이즈를 확인하면 변함이 없지만
위의 코드처럼 1 델타타임 이후에 확인하면 값이 잘 바뀐 것을 확인할 수 있다.
문제는 Layout 컴포넌트는 이번 프레임에 강제로 사이즈를 계산하도록 하는 updateLayout 함수가 존재하는데,
Label 컴포넌트는 아무리 구글링해도 찾을 수 없었다.
https://discuss.cocos2d-x.org/t/cc-2-1-0-cc-label-cant-update-the-contentsize-immediately/45859
관련 레퍼런스는 위 글인데, 솔루션으로 얘기하는 label._updateRenderData() 함수는 존재하지 않는다.
(3년 전의 글이기 때문에 지금은 도움이 되지 않는 듯...)
핵심은 코코스 크리에이터 내부에서 동작하는 Renderer 또는 Renderer가 참조하는 Data가 어딘가 존재하고
updateLayout에 대응되는 updateLabel 함수는 그곳에 있지 않을까 추측을 했다.
let renderData1 = this.targetLabel['_assembler']._renderData;
let renderData2 = this.targetLabel['_assembler']._updateRenderData;
그리고 찾아본 결과 RenderData는 위와 같이 접근할 수 있다.
하지만 강제 update와 같은 내용은 찾을 수 없었고
https://docs.cocos.com/creator/3.1/api/en/classes/ui.graphics-1.html#updateassembler
Cocos Creator Graphics 레퍼런스 사이트에서도 원하는 내용을 찾을 수 없었다.
결국 updateLabel 함수를 찾는 것은 중단했다.
여기서 추가 문제점을 또 맞딱트렸다.
만약 targetLabel의 노드 active가 꺼져있는 상태여도 위 코드가 작동하는가였고
결론은 꺼져있는 노드는 내부에서 updateLabel이 실행되지 않았다.
연출 때문에 active를 꺼놓고 진행해야 하는 상황이라서 해결방법을 모색하다가 신기한 점을 발견했다.
일단 해결방법은 노드 active는 켜놓고, 노드의 위치를 화면 밖으로 옮기거나 하는 여러 가지 방법으로
마치 노드가 꺼진 것처럼 우회하면 된다.
이런 방법들 중에는 노드의 opacity를 0으로 하거나, scale을 0으로 하는 방법도 있는데
신기한 건 opacity를 0으로 하는 것은 노드의 active가 꺼진 것과 동일하게 Label update가 이뤄지지 않았다.
scale을 0으로 하는 것은 정상적으로 동작했다.
'Cocos Creator' 카테고리의 다른 글
노드를 화면 가득 차게 늘리는 법 #Basic (0) | 2022.10.14 |
---|---|
모바일 해상도를 PC에서 확인하는 방법 (0) | 2022.10.14 |
프리팹 안에 프리팹 (0) | 2022.04.13 |
오브젝트 풀링 (Ojbect Pooling) (0) | 2022.04.07 |
Layout Update (0) | 2022.04.06 |