ZEPETOキャラクターの外見を隠すと表示する
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) Canvas > Buttonを使用して、各ボタンを画面に追加し、スクリプトインスペクタに割り当てます。

6) [▶︎(再生)] ボタンを押して実行します。

キャラクターのレイヤーを変更して隠す処理を行う
キャラクターのレンダラーを無効にすることに加えて、キャラクターの外見を隠したり表示したりすることもできます。
これはZEPETOカメラのカリングマスクを利用して行われます。
カリングマスクを使用すると、特定のレイヤーを不可視として扱うことができます。
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;
// カリングマスクにレイヤーを追加
this.zepetoCamera.cullingMask |= (1 << LayerMask.NameToLayer("Player"));
// カリングマスクからレイヤーを削除
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");
}
}