Mengubah warna karakter ZEPETO dan warna item yang dikenakan
Panduan ini bertujuan untuk membantu dalam membuat konten yang menarik.

Mengubah Warna Karakter ZEPETO
Karakter ZEPETO diinstansiasi saat runtime sebagai objek ZepetoCharacter.
Jika Anda memeriksa struktur ZepetoCharacter, Anda akan menemukan sub-objek bernama Zepeto Context. Lebih jauh di dalam Zepeto Context, ada objek lain bernama body.
Dengan mengganti Material body(Clone) dari objek body saat runtime menggunakan skrip, Anda dapat mengubah warna karakter ZEPETO.
Untuk avatar yang tidak dianimasikan, pendekatan ini mengubah warna seluruh wajah dan tubuh.


Namun, untuk avatar yang dianimasikan, Anda juga perlu memodifikasi Material body(Clone) dari ANIME_BASEMODEL, yang merupakan anak dari objek body.
Harap dicatat bahwa penggantian Material dapat dilakukan dengan array Material yang memiliki panjang yang sama.


📘 Bahan Unity https://docs.unity3d.com/2020.3/Documentation/Manual/Materials.html

Di bawah ini adalah contoh kode yang mengubah warna tubuh Pemain Lokal.
Pastikan untuk menerapkan logika sehingga warna karakter hanya berubah setelah karakter dimuat.
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import {LocalPlayer, SpawnInfo, ZepetoCharacter, ZepetoCharacterCreator, ZepetoPlayers} from "ZEPETO.Character.Controller";
import {ZepetoPropertyFlag} from "Zepeto";
import { GameObject, Material, Renderer, SkinnedMeshRenderer, Transform, WaitForSeconds } from 'UnityEngine';
import { Button } from 'UnityEngine.UI';
export default class ChangeSkinColor extends ZepetoScriptBehaviour {
public newColorMaterial : Material;
public changeColorButton : Button;
public originalColorButton : Button;
private _originalColorMaterial : Material;
private _originalAnimeMaterials : Material[];
private _animeRend : Renderer;
private _bodyRend : Renderer;
private _bodyRends : Renderer[];
private _localCharacter: ZepetoCharacter;
Start() {
// Temukan pemain lokal dan atur ke _localCharacter
ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
this._localCharacter = ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character;
// Temukan material dari konteks zepeto pemain lokal
this._bodyRend= this._localCharacter.Context.GetComponentInChildren<SkinnedMeshRenderer>();
// Simpan material asli
this._originalColorMaterial = this._bodyRend.material;
// Tentukan apakah itu avatar yang dianimasikan dan simpan informasi terkait
this._bodyRends= this._localCharacter.GetComponentsInChildren<SkinnedMeshRenderer>();
this._bodyRends.forEach((currentRenderer) =>{
if(currentRenderer.name.includes("ANIME_BASEMODEL")){
this._animeRend = currentRenderer;
this._originalAnimeMaterials = this._animeRend.sharedMaterials;
}
});
});
// Ganti dengan material preset saat tombol ditekan
this.changeColorButton.onClick.AddListener(() => {
if(this._localCharacter != null) {
this._bodyRend.material = this.newColorMaterial;
if(this._animeRend != null) {
let tempMaterials : Material[] = [this._animeRend.sharedMaterials[0],this._animeRend.sharedMaterials[1],this.newColorMaterial,this._animeRend.sharedMaterials[3]];
this._animeRend.sharedMaterials = tempMaterials;
}
}
});
// Kembali ke material asli saat tombol ditekan
this.originalColorButton.onClick.AddListener(() => {
if(this._localCharacter != null) {
this._bodyRend.material = this._originalColorMaterial;
if(this._animeRend != null) {
this._animeRend.sharedMaterials = this._originalAnimeMaterials;
}
}
});
}
} 

- Mengubah bahan tubuh dapat mengakibatkan makeup avatar ZEPETO tidak ditampilkan dengan benar.

Mengubah Warna Barang yang Dipakai
Barang yang dipakai diinstansikan sebagai sub-objek di bawah objek tubuh.
Anda dapat memeriksa Material yang diterapkan untuk setiap barang dari bagian Material objek barang.
Dengan mengganti Material saat runtime menggunakan skrip, Anda dapat mengubah warna barang-barang tersebut.


Di bawah ini adalah contoh kode yang mengubah warna item pertama yang dikenakan oleh Pemain Lokal.
Pastikan bahwa warna item hanya diubah setelah karakter dimuat.
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import {LocalPlayer, ZepetoCharacter, ZepetoPlayers} from "ZEPETO.Character.Controller";
import { GameObject, Material, Renderer, SkinnedMeshRenderer, Transform, WaitForSeconds } from 'UnityEngine';
import { Button } from 'UnityEngine.UI';
export default class ChangeSkinColor extends ZepetoScriptBehaviour {
public newColorMaterial : Material;
public changeColorButton : Button;
public originalColorButton : Button;
private _originalColorMaterial : Material;
private _body : GameObject;
private _itemRend : Renderer;
private _localCharacter: ZepetoCharacter;
Start() {
// Temukan pemain lokal dan atur ke _localCharacter
ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
this._localCharacter = ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character;
// Akses tubuh konteks zepeto pemain lokal
this._body = this._localCharacter.Context.GetComponentInChildren<SkinnedMeshRenderer>().gameObject;
// Akses material item anak pertama dari tubuh
this._itemRend = this._body.transform.GetChild(0).GetComponent<SkinnedMeshRenderer>();
// Simpan material asli
this._originalColorMaterial = this._itemRend.material;
});
// Ganti dengan material preset saat tombol ditekan
this.changeColorButton.onClick.AddListener(() => {
if(this._localCharacter != null) {
this._itemRend.material = this.newColorMaterial;
}
});
// Kembali ke material asli saat tombol ditekan
this.originalColorButton.onClick.AddListener(() => {
if(this._localCharacter != null) {
this._itemRend.material = this._originalColorMaterial;
}
});
}
} 
- Penjelasan Kode
- this.body.transform.GetChild(0) mengacu pada item pertama di antara item yang dikenakan, yaitu item pada indeks 0.
- Anda dapat menyesuaikan ini untuk mengubah warna item lain yang dikenakan.
- Untuk item yang menggunakan beberapa Material, ingat bahwa penggantian Material memerlukan array Material dengan panjang yang sama.


Mengubah Warna Kedua Karakter ZEPETO dan Semua Item
Dengan memanfaatkan wawasan yang telah kami peroleh sejauh ini, Anda dapat memodifikasi warna baik karakter maupun semua item secara seragam.


Berikut adalah contoh kode yang mengubah warna karakter Pemain Lokal dan warna item sepenuhnya ketika tombol "Ubah Warna" diklik dan kembali ke warna asli ketika tombol "Warna Asli" diklik:
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import {LocalPlayer, ZepetoCharacter, ZepetoPlayers} from "ZEPETO.Character.Controller";
import { GameObject, Material, Renderer, SkinnedMeshRenderer, Transform, WaitForSeconds } from 'UnityEngine';
import { Button } from 'UnityEngine.UI';
export default class ChangeAllMaterial extends ZepetoScriptBehaviour {
public newColorMaterial : Material;
public changeColorButton : Button;
public originalColorButton : Button;
private _originalMaterials : Material[] = new Array();
private _bodyRends : Renderer[];
private _localCharacter: ZepetoCharacter;
Start() {
// Temukan pemain lokal dan atur ke _localCharacter
ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
this._localCharacter = ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character;
// Simpan untuk menjaga material asli
this._bodyRends= this._localCharacter.GetComponentsInChildren<SkinnedMeshRenderer>();
this._bodyRends.forEach((currentRenderer) =>{
for(let i=0; i<currentRenderer.sharedMaterials.length;i++){
this._originalMaterials.push(currentRenderer.sharedMaterials[i]);
}
});
});
// Ganti dengan material preset ketika tombol ditekan
this.changeColorButton.onClick.AddListener(() => {
if(this._localCharacter != null) {
this._bodyRends.forEach((currentRenderer) =>{
let tempMaterials : Material[] = new Array();
for(let i=0; i<currentRenderer.sharedMaterials.length;i++){
tempMaterials.push(this.newColorMaterial);
}
currentRenderer.sharedMaterials = tempMaterials;
});
}
});
// Kembali ke material asli ketika tombol ditekan
this.originalColorButton.onClick.AddListener(() => {
if(this._localCharacter != null) {
let indexNum = 0;
this._bodyRends= this._localCharacter.GetComponentsInChildren<SkinnedMeshRenderer>();
this._bodyRends.forEach((currentRenderer) =>{
let tempMaterials : Material[] = new Array();
for(let i=0; i<currentRenderer.sharedMaterials.length;i++){
tempMaterials.push(this._originalMaterials[indexNum]);
indexNum++;
}
currentRenderer.sharedMaterials = tempMaterials;
});
}
});
}
} 
- Metode ini tidak hanya berlaku untuk Pemain Lokal tetapi juga untuk karakter ZEPETO yang dibuat saat runtime, termasuk karakter NPC.
- Silakan berkreasi dan terapkan dengan cara yang menyenangkan!