สร้างโลกของคุณเอง
แชท
การใช้ฟังก์ชันแชทด้วยเสียง
23นาที
zepeto voice chat รุ่นพรีวิวช่วยให้สามารถสนทนาด้วยเสียงในโลกได้ ติดตั้ง zepeto voice chat และตั้งค่าโหมด 1\) ติดตั้ง windows → package manager → zepeto voice chat ฟีเจอร์นี้สามารถใช้ได้ในโลกที่มีการใช้งานองค์ประกอบหลายผู้เล่น การทดสอบสามารถทำได้เฉพาะในมือถือเท่านั้น ไม่สามารถทดสอบในตัวแก้ไขได้ เนื่องจากนโยบายของ ios เสียงของอุปกรณ์จะไม่ลดลงเป็นศูนย์เมื่อไมโครโฟนเปิดในโลกที่เปิดใช้งานการสนทนาด้วยเสียง เสียงของอุปกรณ์จะลดลงเป็นศูนย์เมื่อไมโครโฟนปิด 2\) คลิกปุ่ม \[▼] ในเมนูกลางของหน้าจอโปรเจกต์ unity ที่กำลังพัฒนา คลิกปุ่ม \[เปิดการตั้งค่าโลก] ในเมนูป๊อปอัพที่ปรากฏขึ้น 3\) หากติดตั้งแพ็คเกจ zepeto voice chat อย่างถูกต้อง คุณจะเห็นตัวเลือกโหมด voice chat เพิ่มเข้ามา 4\) ในโหมด voice chat กรุณาตั้งค่าโหมดที่ต้องการ พื้นฐาน ใช้ฟีเจอร์การสนทนาด้วยเสียงที่มีให้โดยค่าเริ่มต้น สคริปต์ ใช้ฟีเจอร์การสนทนาด้วยเสียงโดยการใช้ api การสนทนาด้วยเสียง คุณสามารถจัดการการเข้าหรือออกจากห้องสำหรับการสนทนาด้วยเสียงในระหว่างการทำงาน ดำเนินการสนทนาด้วยเสียงสำหรับทีมที่แตกต่างกัน (เช่น การสนทนาด้วยเสียงของทีมแดงและการสนทนาด้วยเสียงของทีมฟ้า) ตรวจจับผู้ใช้ที่กำลังพูดอยู่ในขณะนี้ โหมดพื้นฐาน การใช้ฟีเจอร์แชทเสียง โลกที่มีการแชทเสียงในโหมดพื้นฐานมีลักษณะดังนี้ คุณยังสามารถสร้างการแชทเสียงที่สนุกสนานมากขึ้นโดยใช้ฟีเจอร์การปรับเสียง การแชทเสียงจะเปิดใช้งานโดยอัตโนมัติเมื่อเข้าสู่โลกที่มีฟังก์ชันการแชทเสียง 👍 เมื่อคุณใช้ฟีเจอร์แชทเสียงใน zepeto เป็นครั้งแรก จะมีป๊อปอัพเกี่ยวกับการเข้าถึงไมโครโฟนปรากฏขึ้น คุณต้องอนุญาตการเข้าถึงเพื่อใช้ฟังก์ชันการแชทเสียง คุณสามารถใช้มันได้โดยการสัมผัสปุ่มแชทเสียง ในแอป zepeto เวอร์ชัน 3 26 000 ขึ้นไป ไอคอนลำโพงแชทเสียงจะไม่ปรากฏ หากคุณต้องการให้ไอคอนการพูดปรากฏ กรุณาเปลี่ยนเป็นโหมดสคริปต์และทำตามคำแนะนำเพื่อเขียนโค้ดของคุณเอง โหมดสคริปต์ การใช้ voicechat api โหมดสคริปต์เปิดใช้งานการสนทนาด้วยเสียงในช่องที่แยกตามทีม โปรดดูคำอธิบายฟังก์ชันและตัวอย่างด้านล่างเพื่อดำเนินการฟีเจอร์นี้ api คำอธิบาย oninitializedevent api การสนทนาด้วยเสียงจะพร้อมใช้งานหลังจากเกิดเหตุการณ์ true ในเหตุการณ์เริ่มต้น หากเหตุการณ์นี้เป็น true การสนทนาด้วยเสียงจะพร้อมใช้งาน และหากเป็น false การสนทนาด้วยเสียงจะไม่พร้อมใช้งาน enterroom(roomproperty roomproperty) ฟังก์ชันเพื่อเข้าสู่ห้องสนทนาด้วยเสียง \ หลังจากเข้าสู่ห้องสนทนาด้วยเสียงสำเร็จ ปุ่มสนทนาด้วยเสียงจะปรากฏขึ้น exitroom() ฟังก์ชันเพื่อออกจากห้องสนทนาด้วยเสียง onroomconnectedevent เหตุการณ์เพื่อตรวจสอบสถานะการเข้าสู่ห้องสนทนาด้วยเสียง หากเหตุการณ์นี้เป็นจริง ผู้ใช้ได้เข้าสู่ห้องสนทนาด้วยเสียง; หากเป็นเท็จ ผู้ใช้ได้ออกจากห้องสนทนาด้วยเสียง onspeechdetectedevent\<string, boolean> เหตุการณ์เพื่อตรวจจับผู้ใช้ที่กำลังพูดในห้องสนทนาด้วยเสียง \ string คือ userid ของผู้ใช้ที่พูด \ boolean เป็นจริงเมื่อเริ่มพูด และเป็นเท็จเมื่อพูดจบ changeteamid(number teamid) ฟังก์ชันเพื่อเปลี่ยน teamid ที่ใช้ในห้องสนทนาด้วยเสียง \ สามารถตั้งค่าเป็นค่าจำนวนเต็ม 1 หรือมากกว่าเท่านั้น คลาส roomproperty api คำอธิบาย setaudiomode โหมดเสียงที่จะใช้ในการสนทนาทางเสียง \ audiomode omnidirectional โหมดสนทนาทางเสียงที่ไม่มีการลดเสียงตามระยะทาง (คุณสามารถใช้มันได้ทั้งกับหรือไม่มีตัวละคร zepeto) \ audiomode directional โหมดสนทนาทางเสียงที่มีการลดเสียงตามระยะทาง (ตัวละคร zepeto ต้องมีอยู่ในฉาก เนื่องจากโหมดนี้ทำงานตามตำแหน่งของตัวละคร zepeto) setteamid teamid ที่จะใช้ในการสนทนาทางเสียงเพื่อเปิดใช้งานการสนทนาทางเสียงระหว่างผู้ใช้ที่มี teamid เดียวกัน \ สามารถตั้งค่าเป็นค่า int ที่ 1 หรือสูงกว่าเท่านั้น ตัวอย่างการใช้งานการสนทนาทางเสียงเฉพาะทีม นี่คือตัวอย่างโค้ดเพื่อทดลองใช้ voice chat api 1\) เพิ่มปุ่มและบันทึกข้อความลงบนผืนผ้าใบตามที่แสดงในภาพด้านล่างเพื่อเข้าสู่ช่องทีม voice chat และแสดงบันทึกสถานะ ปุ่ม button blueteam ปุ่มเข้าสู่การสนทนาของทีมสีน้ำเงิน button redteam ปุ่มเข้าสู่การสนทนาของทีมสีแดง button exit ปุ่มออกจากการสนทนา ข้อความ text log ข้อความเพื่อแสดงบันทึกการสนทนา text team ข้อความเพื่อแสดงรายชื่อสมาชิกในช่องทีม voice chat เดียวกัน text currentspeaking ข้อความเพื่อแสดง userid ของผู้ที่กำลังพูดใน voice chat 2\) สร้างโปรเจกต์ > สร้าง > zepeto > typescript และเปลี่ยนชื่อเป็น voicechattest 3\) เขียนสคริปต์ตัวอย่างตามที่แสดงด้านล่าง voicechattest import { button, inputfield, text } from 'unityengine ui'; import { zepetoscriptbehaviour } from 'zepeto script' import { audiomode, roomproperty, voicechatcontroller } from 'zepeto voice chat' export default class voicechattest extends zepetoscriptbehaviour { // ประกาศ ui components เป็นสมาชิกสาธารณะ public blueteambutton button; public redteambutton button; public exitroombutton button; public logtext text; public currentteamidtext text; public currentspeakinguseridstext text; // ประกาศสมาชิกส่วนตัวเพื่อเก็บ id ของผู้พูดและฟิลด์ป้อน id ทีม private currentspeakinguserids string\[]; private teamidinputfield inputfield; start() { this currentspeakinguserids = new array(); // เพิ่ม event listeners สำหรับการคลิกปุ่ม this blueteambutton onclick addlistener(()=>{ this enterblueteam(); }); this redteambutton onclick addlistener(()=>{ this enterredteam(); }); this exitroombutton onclick addlistener(()=>{ this exitvoicechatroom(); }); // เพิ่ม event listeners สำหรับ voice chat controller voicechatcontroller oninitializedevent addlistener(init => this oninitialized(init)); voicechatcontroller onroomconnectedevent addlistener(connected => this onroomconnected(connected)); voicechatcontroller onspeechdetectedevent addlistener((userid, speechdetected) => this onspeechdetected(userid, speechdetected)); this logtext text = "\[voicechat] voicechattest เริ่มต้น"; } // ondestroy method ถูกเรียกเมื่อสคริปต์ถูกทำลาย ondestroy() { voicechatcontroller oninitializedevent removealllisteners(); voicechatcontroller onroomconnectedevent removealllisteners(); voicechatcontroller onspeechdetectedevent removealllisteners(); } // method ที่ถูกเรียกเมื่อระบบ voice chat ถูกเริ่มต้น private oninitialized(initialized boolean) { this logtext text = "\[voicechat] oninitialized " + initialized; } // method ที่ถูกเรียกเมื่อห้อง voice chat เชื่อมต่อ private onroomconnected(connected boolean) { this logtext text = "\[voicechat] onroomconnected " + connected; } // method ที่ถูกเรียกเมื่อการพูดของผู้ใช้ถูกตรวจพบหรือไม่ถูกตรวจพบ private onspeechdetected(userid string, speechdetected boolean) { this logtext text = "\[voicechat] onspeechdetected " + userid + ", " + speechdetected; if (speechdetected) { this currentspeakinguserids push(userid); } else { let index = this currentspeakinguserids indexof(userid); this currentspeakinguserids splice(index, 1); } let userids = "\[currentspeakinguserids]\n"; for (let i = 0; i < this currentspeakinguserids length; i++) { userids += this currentspeakinguserids\[i]; userids += "\n"; } this currentspeakinguseridstext text = userids; } // method เพื่อเข้าสู่ห้อง voice chat ของทีมสีน้ำเงิน public enterblueteam(){ this entervoicechatroom(2); } // method เพื่อเข้าสู่ห้อง voice chat ของทีมสีแดง public enterredteam(){ this entervoicechatroom(3); } // method เพื่อเข้าสู่ห้อง voice chat ตามดัชนีทีมที่กำหนด private entervoicechatroom(teamindex number) { console log("\[voicechat] entervoicechatroom"); // สร้างวัตถุ roomproperty ใหม่และตั้งค่าคุณสมบัติของมัน let roomproperty = new roomproperty(); roomproperty setaudiomode(audiomode omnidirectional); roomproperty setteamid(teamindex); voicechatcontroller enterroom(roomproperty); this currentteamidtext text = "teamid " + roomproperty teamid tostring(); } // method เพื่อออกจากห้อง voice chat public exitvoicechatroom() { this logtext text = "\[voicechat] exitvoicechatroom"; voicechatcontroller exitroom(); } // method เพื่อเปลี่ยน team id สำหรับผู้ใช้ปัจจุบัน public changeteamid() { // รับ team id ใหม่จากฟิลด์ป้อนและแปลงเป็นจำนวนเต็ม let teamid = parseint(this teamidinputfield text); this logtext text = "\[voicechat] changeteamid " + teamid; this currentteamidtext text = "teamid " + teamid tostring(); // เปลี่ยน team id ในระบบ voice chat voicechatcontroller changeteamid(teamid); } } คำอธิบายโค้ด เมื่อสคริปต์ทำงาน มันจะลงทะเบียนเหตุการณ์บนปุ่มแต่ละปุ่มในฟังก์ชัน start() และลงทะเบียนเหตุการณ์ oninitialized, onroomconnected, และ onspeechdetected บน voicechatcontroller เมื่อปุ่มทีมสีน้ำเงินหรือปุ่มทีมสีแดงถูกคลิก ฟังก์ชัน entervoicechatroom() จะถูกเรียกใช้และผู้ใช้จะเข้าสู่ห้องแชทเสียงโดยการป้อน roomproperty ที่กำหนดไว้ คุณสมบัติของห้องในตัวอย่างมีดังนี้ roomproperty setaudiomode audiomode omnidirectional โหมดเสียง omnidirectional เป็นโหมดที่เสียงมีระดับเสียงเหมือนกันไม่ว่าจะอยู่ในตำแหน่งใดของผู้เล่น ในทางตรงกันข้าม โหมด directional เป็นโหมดเสียง 3d ซึ่งหมายความว่าระดับเสียงจะฟังแตกต่างกันขึ้นอยู่กับตำแหน่งของตัวละคร ดังนั้นยิ่งตัวละครอยู่ไกล เสียงก็จะยิ่งเบาลง roomproperty setteamid ช่อง 2 สำหรับทีมสีน้ำเงิน ช่อง 3 สำหรับทีมสีแดง setteamid ทำหน้าที่เหมือนช่องใน voice chat ทีมที่เข้าสู่ช่อง 2 สามารถแชทเสียงกับผู้เล่นในช่อง 2 เท่านั้น และทีมที่เข้าสู่ช่อง 3 สามารถแชทเสียงกับผู้เล่นในช่อง 3 เท่านั้น exitvoicechatroom() จะออกจากช่องทีมแชทเสียงปัจจุบัน onspeechdetected() จะส่งออก id ของผู้เล่นที่กำลังใช้แชทเสียงในช่องทีมไปยังข้อความบันทึก 4\) หลังจากเสร็จสิ้นสคริปต์ ให้กำหนดปุ่มและข้อความที่สร้างขึ้นในขั้นตอนที่ 1 ใน inspector 5\) ทดสอบบนมือถือผ่าน qr code หรือลิงก์ทดสอบ และคุณจะเห็นว่าปุ่มเปิดใช้งานการสนทนาด้วยเสียงถูกสร้างขึ้นเมื่อกดปุ่ม enter team และเมื่อใดก็ตามที่ผู้เล่นพูด บันทึกจะแสดงว่าผู้เล่นคนใดอยู่ในการสนทนาด้วยเสียง ตามที่แสดงในหน้าจอด้านล่างนี้ ตัวอย่างการแสดงภาพฟองสนทนาด้วยเสียง ในแอป zepeto เวอร์ชัน 3 26 000 และเวอร์ชันที่ใหม่กว่า ไอคอนการพูดคุยด้วยเสียงจะไม่ปรากฏ หากคุณต้องการให้ไอคอนการพูดคุยปรากฏ กรุณาทำตามคำแนะนำและเขียนโค้ดของคุณเอง 1\) เพื่อแสดงฟองพูดเหนือหัวตัวละครเมื่อผู้เล่นอยู่ในการสนทนาด้วยเสียง คุณจะต้องสร้าง prefab ที่ใช้ภาพฟองพูด นำเข้าภาพฟองพูด png ที่คุณต้องการใช้ตามที่แสดงด้านล่างและเปลี่ยนประเภท texture type เป็น sprite 2\) โครงการ > สร้าง > prefab และเปลี่ยนชื่อเป็น chatbubble 3\) ดับเบิลคลิกที่ prefab chatbubble เพื่อเข้าสู่โหมดแก้ไข prefab เลือก prefab chatbubble และเลือก transform > position > เปลี่ยนค่า y เป็น 0 35 4\) สร้าง canvas ภายในวัตถุ prefab ดับเบิลคลิกที่ prefab chatbubble เพื่อเข้าสู่โหมดแก้ไข prefab จากนั้นเพิ่ม hierachy > ui > canvas เปลี่ยนค่าของส่วนประกอบ recttransform ของ canvas เป็นดังนี้ posx 0 , posy 0 ความกว้าง 100, ความสูง 100 scalex 0 005, scaley 0 005, scalez 0 005 เปลี่ยน rendermove ของส่วนประกอบ canvas เป็น world space 5\) สร้างภาพพูดคุยภายใน canvas เพิ่ม hierarchy > ui > image เป็นลูกของ canvas และเปลี่ยนชื่อเป็น chatbubbleimage เปลี่ยนค่าของส่วนประกอบ recttransform ของ chatbubbleimage เป็นดังนี้ ความกว้าง 42, ความสูง 42 ลงทะเบียน sprite รูปภาพที่คุณนำเข้ามาในขั้นตอนที่ 1 เป็น source image ในส่วนประกอบ image 👍 เคล็ดลับ คุณยังสามารถทำให้ภาพสปริงพูดคุยเคลื่อนไหวได้ด้วย คุณยังสามารถใช้ภาพฟองที่แยกต่างหากสำหรับทีมที่แตกต่างกันได้ 6\) โครงการ > สร้าง > zepeto > สร้าง typescript และเปลี่ยนชื่อเป็น voicechatbubblecontroller 7\) เขียนสคริปต์ตัวอย่างตามที่แสดงด้านล่างนี้ voicechatbubblecontroller import { gameobject, object } from 'unityengine'; import { knowsockets, zepetoplayers } from 'zepeto character controller' import { zepetoscriptbehaviour } from 'zepeto script' import { audiomode, roomproperty, voicechatcontroller } from 'zepeto voice chat'; export default class voicechatbubblecontroller extends zepetoscriptbehaviour { // ตัวแปร gameobject สาธารณะเพื่อเก็บ prefab ของ voice chat bubble public voicechatprefab gameobject; // แผนที่ส่วนตัวเพื่อเก็บ gameobjects ที่เกี่ยวข้องกับ user ids private voicebubblemap map\<string, gameobject> = new map\<string, gameobject>(); start() { // เพิ่ม event listeners สำหรับ voice chat controller voicechatcontroller oninitializedevent addlistener(init => this oninitialized(init)); voicechatcontroller onroomconnectedevent addlistener(connected => this onroomconnected(connected)); voicechatcontroller onspeechdetectedevent addlistener((userid, speechdetected) => this onspeechdetected(userid, speechdetected)); } // เมธอดที่เรียกเมื่อระบบ voice chat ถูกเริ่มต้น private oninitialized(initialized boolean) { console log("\[voicechat] oninitialized "); this entervoicechatroom(1); } // เมธอดที่เรียกเมื่อห้อง voice chat เชื่อมต่อ private onroomconnected(connected boolean) { console log("\[voicechat] onroomconnected "); } // เมธอดเพื่อเข้าสู่ห้อง voice chat ตามดัชนีทีมที่กำหนด private entervoicechatroom(teamindex number) { console log("\[voicechat] entervoicechatroom"); // สร้างวัตถุ roomproperty ใหม่และตั้งค่าคุณสมบัติของมัน let roomproperty = new roomproperty(); roomproperty setaudiomode(audiomode omnidirectional); voicechatcontroller enterroom(roomproperty); } // เมธอดที่เรียกเมื่อการพูดของผู้ใช้ถูกตรวจพบหรือไม่ถูกตรวจพบ private onspeechdetected(userid string, speechdetected boolean) { console log("\[voicechat] onspeechdetected " + userid + ", " + speechdetected); // ตรวจสอบว่าหมายเลขผู้ใช้ไม่ได้อยู่ในแผนที่ voice bubble และสร้าง voice bubble หากยังไม่มี if (!this voicebubblemap has(userid)) { this createvoicebubble(userid); } this setvoicebubble(userid, speechdetected); } // เมธอดเพื่อกำหนดสถานะการใช้งานของ voice bubble สำหรับหมายเลขผู้ใช้ที่กำหนด private setvoicebubble(userid string, speechdetected boolean) { const chatbubble = this voicebubblemap get(userid); chatbubble setactive(speechdetected); } // เมธอดเพื่อสร้าง voice bubble สำหรับหมายเลขผู้ใช้ที่กำหนด private createvoicebubble(userid string) { // รับ socket หัวของตัวละครผู้ใช้ const headsocket = zepetoplayers instance getplayerwithuserid(userid) character getsocket(knowsockets head upper); // สร้าง prefab ของ voice chat bubble ที่ตำแหน่ง socket หัว const instancebubble = object instantiate(this voicechatprefab, headsocket) as gameobject; // เพิ่ม bubble ที่สร้างขึ้นในแผนที่ voice bubble this voicebubblemap set(userid, instancebubble); instancebubble setactive(false); } lateupdate() { // ตรวจสอบว่าแผนที่ voice bubble ว่างเปล่าหรือไม่และคืนค่าหากว่างเปล่า if (this voicebubblemap size === 0) { return; } // ทำการวนซ้ำผ่านแผนที่ voice bubble และอัปเดตการหมุนของแต่ละ gameobject bubble this voicebubblemap foreach((bubbleobject gameobject) => { // ตั้งค่าการหมุนของวัตถุ bubble ให้ตรงกับการหมุนของ transform ของกล้อง bubbleobject transform rotation = zepetoplayers instance zepetocamera cameraparent transform rotation; }); } } คำอธิบายโค้ด เมื่อสคริปต์ถูกเรียกใช้งาน มันจะลงทะเบียนเหตุการณ์บนปุ่มแต่ละปุ่มในฟังก์ชัน start() และเหตุการณ์ oninitialized, onroomconnected, และ onspeechdetected บน voicechatcontroller หลังจาก oninitialized() ปุ่ม voice chat จะถูกแสดงบนหน้าจอของผู้เล่นเมื่อพวกเขาเข้าสู่โลก และเมื่อพวกเขากดปุ่ม entervoicechatroom() จะถูกเรียกใช้งานเพื่อเข้าสู่ห้อง voice chat เมื่อใดก็ตามที่ผู้เล่นเปิดใช้งาน voicechat และพูด onspeechdetected() จะถูกเรียกใช้งาน และถ้า speechdetected เป็น true วัตถุ bubblechat จะถูกเปิดใช้งาน และถ้า false จะถูกปิดใช้งาน เมื่อฟังก์ชัน onspeechdetected() ถูกเรียกใช้งานครั้งแรก createvoicebubble() จะสร้าง gameobject voicechatprefab เพื่อให้ลอยอยู่เหนือหัวของผู้เล่นและลงทะเบียนเป็นข้อมูลแผนที่ใน voicebubblemap เราใช้ lateupdate() เพื่ออัปเดตการหมุนของฟองเสียงทุกเฟรมให้ตรงกับ cameraparent ของโลก zepeto ซึ่งทำให้แน่ใจว่าภาพฟองเสียงจะหันไปทางกล้องเสมอ มันจะตรวจสอบก่อนว่า voicebubblemap ว่างหรือไม่ ถ้าไม่ว่างก็จะอัปเดตการหมุนของภาพฟองเสียง prefab 8\) หลังจากเขียนสคริปต์เสร็จแล้ว ให้กำหนด voicechatprefab ใน inspector เป็น prefab ฟองเสียงที่คุณสร้างในขั้นตอนที่ 1 9\) เรียกใช้งานบนมือถือผ่าน qr code หรือลิงก์ทดสอบ และคุณควรเห็นภาพฟองเสียงปรากฏอยู่เหนือหัวของตัวละครเมื่อผู้เล่นใช้เสียงแชท การปรับเสียง เริ่มต้นด้วย voice chat เวอร์ชัน 0 2 1 preview คุณสามารถปรับเสียง voice chat ในโหมดสคริปต์ได้ https //www youtube com/watch?v=yxfpuqypbqk https //www youtube com/watch?v=yxfpuqypbqk ลองปรับเสียงด้วยการใช้คู่มือ api และโค้ดตัวอย่าง ประเภทเสียง (enum) ค่า คำอธิบาย ประเภท00 0 ต้นฉบับ ประเภท01 1 ชิปมังค์ ประเภท02 2 ลุง ประเภท03 3 เอคโค่ ประเภท04 4 เสียงลึก ประเภท05 5 หุ่นยนต์ ประเภท06 6 สำเนียง ประเภท07 7 เมกะโฟน ประเภท08 8 สัตว์ร้าย ประเภท09 9 เครื่องจักร ประเภท10 10 กระแสไฟฟ้าแรง ประเภท11 11 เด็ก ประเภท12 12 เม่น นี่คือตัวอย่างสคริปต์การปรับเสียง import { button } from 'unityengine ui'; import { zepetoscriptbehaviour } from 'zepeto script'; import { roomproperty, voicechatcontroller, voicetype } from 'zepeto voice chat'; export default class voicemodulationmanager extends zepetoscriptbehaviour { // ปุ่มสำหรับตั้งค่าประเภทเสียงที่แตกต่างกัน public buttons button\[]; start() { const voicetypes = \[ voicetype type00, voicetype type01, voicetype type05, voicetype type03, ]; for (const \[index, button] of this buttons entries()) { button onclick addlistener(() => { // ตั้งค่าประเภทเสียงที่ตรงกับดัชนีปุ่มที่ถูกคลิก voicechatcontroller setvoicetype(voicetypes\[index]); }); }; // เมธอดที่เรียกเมื่อระบบ voice chat ถูกเริ่มต้น voicechatcontroller oninitializedevent addlistener( init => { voicechatcontroller enterroom(new roomproperty());; } ); // เมธอดที่เรียกเมื่อห้อง voice chat เชื่อมต่อ voicechatcontroller onroomconnectedevent addlistener( connected => { // ตั้งค่าประเภทเสียงเริ่มต้นและเปิดใช้งาน loopback voicechatcontroller setvoicetype(voicetypes\[0]); voicechatcontroller enableloopback(true); } ); } // เมธอดเพื่อออกจากห้อง voice chat ondestroy() { voicechatcontroller oninitializedevent removealllisteners(); voicechatcontroller onroomconnectedevent removealllisteners(); } } คำอธิบายโค้ด เพิ่มผู้ฟัง onclick สำหรับแต่ละปุ่มเพื่อตั้งค่าประเภทการปรับเสียงที่แตกต่างกัน องค์ประกอบของดัชนีเดียวกันใน ปุ่ม และ ประเภทเสียง จะถูกจับคู่ เมื่อเข้าสู่โลก, voicechatcontroller ถูกเริ่มต้น และการเชื่อมต่อห้องจะถูกสร้างขึ้นโดยอัตโนมัติ ประเภทการปรับเสียงเริ่มต้นถูกตั้งค่าเป็น type00 , และการวนกลับถูกเปิดใช้งานเพื่อฟังเสียงของคุณเอง โปรดทราบว่าการเรียกใช้ setvoicetype และ enableloopback , การเชื่อมต่อห้องเป็นสิ่งจำเป็น ดังนั้นการตั้งค่าเริ่มต้นจะถูกจัดการภายในผู้ฟังของ onroomconnectedevent เปลี่ยนตำแหน่งการเล่นเสียงของผู้เล่นท้องถิ่น คุณสามารถเปลี่ยนตำแหน่งการสนทนาด้วยเสียงของผู้เล่นท้องถิ่นโดยใช้ voicechatcontroller setlocalplayertransform() ใช้สิ่งนี้ คุณสามารถสร้างสถานการณ์ต่างๆ โดยการตั้งค่าตำแหน่งของคุณไปยังพื้นที่หรือวัตถุเฉพาะเมื่อพูดในแชทเสียง 📘 เคล็ดลับ การเปลี่ยนแปลงของแชทเสียงเชื่อมโยงกับการเปลี่ยนแปลงของตัวละคร zepeto ของผู้เล่นในท้องถิ่น ดังนั้น หากตัวละคร zepeto ของผู้เล่นในท้องถิ่นยังไม่ได้ถูกสร้างในโลก เสียงของคุณอาจไม่ถูกส่งออกไป ในกรณีนี้ คุณสามารถใช้แชทเสียงโดยการตั้งค่าตำแหน่งการเล่นเสียงภายในฉากปัจจุบันโดยใช้ setlocalplayertransform() api คำอธิบาย public static setlocalplayertransform($transform unityengine transform)\ void ฟังก์ชันในการเปลี่ยนตำแหน่งการเล่นเสียงของผู้เล่นในท้องถิ่น ❗️ คำเตือน setlocalplayertransform() ต้องถูกเรียกใช้หลังจาก voicechatcontroller oninitializedevent(true) เมื่อแชทเสียงถูกเริ่มต้น 1\) ด้านล่างนี้คือตัวอย่างสคริปต์สำหรับฟังก์ชันการเปลี่ยนตำแหน่งเสียง voicetransformsample import { gameobject, transform, vector3 } from 'unityengine'; import { button } from 'unityengine ui'; import { zepetoscriptbehaviour } from 'zepeto script'; import { audiomode, roomproperty, voicechatcontroller } from 'zepeto voice chat'; export default class voicetransformsample extends zepetoscriptbehaviour { // ปุ่มสำหรับตั้งค่าการเปลี่ยนตำแหน่งเสียงใกล้ public buttonclosertransform button; // ปุ่มสำหรับตั้งค่าการเปลี่ยนตำแหน่งเสียงไกล public buttonfarthertransform button; // การเปลี่ยนตำแหน่งสำหรับเสียง private voicetransform transform; start() { // สร้าง gameobject ใหม่ กำหนดการเปลี่ยนตำแหน่งเพื่อเก็บวัตถุการเปลี่ยนตำแหน่งเสียง const voicetransformobject = new gameobject; this voicetransform = voicetransformobject transform; // เมธอดที่เรียกเมื่อระบบ voice chat ถูกเริ่มต้น voicechatcontroller oninitializedevent addlistener( init => { let roomproperty = new roomproperty(); // ตั้งค่าโหมดเสียงเป็นเสียง 3d ทิศทาง roomproperty setaudiomode(audiomode directional); voicechatcontroller enterroom(roomproperty); // ตั้งค่าการเปลี่ยนตำแหน่งเสียงสำหรับเสียงของผู้เล่นท้องถิ่น voicechatcontroller setlocalplayertransform(this voicetransform); } ); // ตั้งค่าตำแหน่งการเปลี่ยนตำแหน่งเสียงเป็น (0,0,0) เมื่อคลิก 'buttonclosetransform' this buttonclosertransform onclick addlistener(()=>{ this voicetransform position = vector3 zero; }) // ตั้งค่าตำแหน่งการเปลี่ยนตำแหน่งเสียงเป็นจุดที่ห่างเมื่อคลิก 'buttonfartransform' this buttonfarthertransform onclick addlistener(()=>{ this voicetransform position = new vector3(0,0, 10); }) } // เมธอดเพื่อออกจากห้อง voice chat ondestroy() { voicechatcontroller oninitializedevent removealllisteners(); voicechatcontroller onroomconnectedevent removealllisteners(); } } คำอธิบายโค้ด เมื่อฉากเริ่มต้น สร้างวัตถุเกมที่เรียกว่า voicetransformobject ใน start() ฟังก์ชันและลงทะเบียน transform ใน voicetransform เมื่อการสนทนาเสียง oninitialized ถูกเรียก กรุณาใช้การตั้งค่าต่อไปนี้ ตั้งค่าการสนทนาเสียงเป็นโหมดเสียง 3d ผ่าน setaudiomode(audiomode directional) ตั้งค่าตำแหน่งการสนทนาเสียงของผู้เล่นท้องถิ่นเป็น voicetransform ผ่าน voicechatcontroller setlocalplayertransform() buttonclosertransform ตั้งค่าตำแหน่งของ voicetransform เป็นจุดกำเนิด (0, 0, 0) เมื่อปุ่มถูกคลิก buttonfarthertransform ตั้งค่าตำแหน่งของ voicetransform เป็น (10, 0, 0) เมื่อปุ่มถูกคลิก 2\) ลงทะเบียนปุ่มบน canvas ในฉากไปยัง buttonclosertransform และ buttonfarthertransform ของคอมโพเนนต์ voicetransformsample 3\) หากคุณใช้งานบนโทรศัพท์มือถือโดยใช้ qr code หรือลิงก์ทดสอบ คุณสามารถตรวจสอบสิ่งต่อไปนี้ได้ เมื่อคุณกดปุ่ม closer เสียงของคุณจะดังใกล้ชิดกับคนอื่นๆ เมื่อคุณกดปุ่ม farther เสียงของคุณจะได้ยินห่างไกลจากคนอื่นๆ https //www youtube com/watch?v=y pj4rcshts https //www youtube com/watch?v=y pj4rcshts