创造你的世界
玩家与角色:提示
隐藏和显示ZEPETO角色外观
3min
您可以禁用ZEPETO角色的渲染器,使其对相机不可见。
以下是一个示例代码,可以通过按下按钮来隐藏和显示角色的外观。
1) 创建层级 > 创建空对象并将其重命名为HideShowCharacter。
2) 创建项目 > 创建 > ZEPETO > TypeScript并将其重命名为HideShowCharacter。
3) 将脚本添加到HideShowCharacter对象。
4) 按如下所示编写示例脚本。
HideShowCharacter
1import { Renderer } from 'UnityEngine';
2import { Button } from 'UnityEngine.UI';
3import { SpawnInfo, ZepetoPlayers } from 'ZEPETO.Character.Controller';
4import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
5
6export default class HideShowCharacter extends ZepetoScriptBehaviour {
7
8 public hideCharacterBtn: Button;
9 public showCharacterBtn: Button;
10
11 Start() {
12 ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
13 this.hideCharacterBtn.onClick.AddListener(() => {
14 // 禁用Zepeto角色的渲染器,使其对相机不可见
15 ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character.GetComponentsInChildren<Renderer>().forEach(r => {
16 r.enabled = false;
17 console.log("隐藏");
18 });
19 });
20
21 this.showCharacterBtn.onClick.AddListener(() => {
22 ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character.GetComponentsInChildren<Renderer>().forEach(r => {
23 r.enabled = true;
24 console.log("显示");
25 });
26 });
27 });
28 }
29
30}
5) 使用画布 > 按钮将每个按钮添加到屏幕并将其分配给脚本检查器。
6) 按下 [▶︎(播放)] 按钮以运行它。
除了禁用角色的渲染器外,您还可以隐藏和显示角色的外观。
这是通过利用ZEPETO相机中的剔除遮罩完成的。
剔除遮罩允许您将特定层视为不可见。
当创建ZEPETO角色时,默认情况下没有设置任何层。
以下示例代码展示了如何在ZEPETO相机中使特定层不可见,然后在单击按钮时更改ZEPETO角色的层以隐藏和显示它。
TypeScript
1import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
2import { Camera, LayerMask, Transform } from "UnityEngine";
3import { ZepetoCharacter, ZepetoPlayers } from "ZEPETO.Character.Controller";
4import { Button } from "UnityEngine.UI";
5
6// 一个更改角色所有子对象层的函数
7function ChangeLayersRecursively(transform: Transform, layer: string, fromLayer?: string): void {
8 if (!transform || !layer || layer.length === 0) {
9 return;
10 }
11
12 if (fromLayer) {
13 if (transform.gameObject.layer === LayerMask.NameToLayer(fromLayer)) {
14 transform.gameObject.layer = LayerMask.NameToLayer(layer);
15 }
16 } else {
17 transform.gameObject.layer = LayerMask.NameToLayer(layer);
18 }
19 for (let i = 0; i < transform.childCount; i++)
20 {
21 let child = transform.GetChild(i);
22 ChangeLayersRecursively(child, layer, fromLayer);
23 }
24}
25
26export default class ChangeCameraLayer extends ZepetoScriptBehaviour {
27
28 private zepetoCamera : Camera;
29 public hideCharacterBtn: Button;
30 public showCharacterBtn: Button;
31
32 Start() {
33 ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
34 let character = ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character;
35 this.zepetoCamera = ZepetoPlayers.instance.LocalPlayer.zepetoCamera.camera;
36 // 将层添加到剔除遮罩
37 this.zepetoCamera.cullingMask |= (1 << LayerMask.NameToLayer("Player"));
38 // 从剔除遮罩中移除层
39 this.zepetoCamera.cullingMask &= ~(1 << LayerMask.NameToLayer("TransparentFX"));
40
41 this.hideCharacterBtn.onClick.AddListener(() => {
42 this.SetHiddenLayer(character);
43 });
44
45 this.showCharacterBtn.onClick.AddListener(() => {
46 this.SetPlayerLayer(character);
47 });
48 });
49 }
50
51 SetPlayerLayer(playerObject: ZepetoCharacter) {
52 ChangeLayersRecursively(playerObject.transform, "Player");
53 }
54
55 SetHiddenLayer(playerObject: ZepetoCharacter) {
56 ChangeLayersRecursively(playerObject.transform, "TransparentFX");
57 }
58}