제페토 캐릭터 외형 숨기기, 나타나기
3 분
렌더러 방식 사용
ZEPETO 캐릭터의 렌더러를 비활성화하여 카메라에 보이지 않게 할 수 있습니다.
다음은 버튼을 눌러 캐릭터의 외형을 숨기고 보여주는 예제 코드입니다.

1) 계층 구조 만들기 > 빈 객체 만들기 및 이름을 HideShowCharacter로 변경합니다.
2) 프로젝트 만들기 > 만들기 > ZEPETO > TypeScript 및 이름을 HideShowCharacter로 변경합니다.
3) HideShowCharacter 객체에 스크립트를 추가합니다.
4) 아래와 같이 샘플 스크립트를 작성합니다.
import { Renderer } from 'UnityEngine';
import { Button } from 'UnityEngine.UI';
import { SpawnInfo, ZepetoPlayers } from 'ZEPETO.Character.Controller';
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
export default class HideShowCharacter extends ZepetoScriptBehaviour {
public hideCharacterBtn: Button;
public showCharacterBtn: Button;
Start() {
ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
this.hideCharacterBtn.onClick.AddListener(() => {
// Zepeto 캐릭터의 렌더러를 비활성화하여 카메라에 보이지 않게 합니다.
ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character.GetComponentsInChildren<Renderer>().forEach(r => {
r.enabled = false;
console.log("숨기기");
});
});
this.showCharacterBtn.onClick.AddListener(() => {
ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character.GetComponentsInChildren<Renderer>().forEach(r => {
r.enabled = true;
console.log("보이기");
});
});
});
}
}
5) 캔버스 > 버튼을 사용하여 각 버튼을 화면에 추가하고 스크립트 검사기에 할당합니다.

6) [▶︎(재생)] 버튼을 눌러 실행하세요.

캐릭터의 레이어를 변경하여 숨기기 처리하기
캐릭터의 렌더러를 비활성화하는 것 외에도 캐릭터의 외형을 숨기고 보여줄 수 있습니다.
이것은 ZEPETO 카메라의 Culling Mask를 활용하여 수행됩니다.
Culling Mask를 사용하면 특정 레이어를 보이지 않게 처리할 수 있습니다.
ZEPETO 캐릭터가 생성될 때 기본적으로 설정된 레이어가 없습니다.
다음 예제 코드는 ZEPETO 카메라에서 특정 레이어를 보이지 않게 만드는 방법을 보여주며, 버튼 클릭 시 ZEPETO 캐릭터의 레이어를 변경하여 숨기고 표시하는 방법을 보여줍니다.
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { Camera, LayerMask, Transform } from "UnityEngine";
import { ZepetoCharacter, ZepetoPlayers } from "ZEPETO.Character.Controller";
import { Button } from "UnityEngine.UI";
// 캐릭터의 모든 하위 객체의 레이어를 변경하는 함수
function ChangeLayersRecursively(transform: Transform, layer: string, fromLayer?: string): void {
if (!transform || !layer || layer.length === 0) {
return;
}
if (fromLayer) {
if (transform.gameObject.layer === LayerMask.NameToLayer(fromLayer)) {
transform.gameObject.layer = LayerMask.NameToLayer(layer);
}
} else {
transform.gameObject.layer = LayerMask.NameToLayer(layer);
}
for (let i = 0; i < transform.childCount; i++)
{
let child = transform.GetChild(i);
ChangeLayersRecursively(child, layer, fromLayer);
}
}
export default class ChangeCameraLayer extends ZepetoScriptBehaviour {
private zepetoCamera : Camera;
public hideCharacterBtn: Button;
public showCharacterBtn: Button;
Start() {
ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
let character = ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character;
this.zepetoCamera = ZepetoPlayers.instance.LocalPlayer.zepetoCamera.camera;
// culling mask에 레이어 추가
this.zepetoCamera.cullingMask |= (1 << LayerMask.NameToLayer("Player"));
// culling mask에서 레이어 제거
this.zepetoCamera.cullingMask &= ~(1 << LayerMask.NameToLayer("TransparentFX"));
this.hideCharacterBtn.onClick.AddListener(() => {
this.SetHiddenLayer(character);
});
this.showCharacterBtn.onClick.AddListener(() => {
this.SetPlayerLayer(character);
});
});
}
SetPlayerLayer(playerObject: ZepetoCharacter) {
ChangeLayersRecursively(playerObject.transform, "Player");
}
SetHiddenLayer(playerObject: ZepetoCharacter) {
ChangeLayersRecursively(playerObject.transform, "TransparentFX");
}
}