เพิ่มเสียง 3D

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

เสียง 3D เป็นเสียงทิศทางที่ออกจากตำแหน่งเฉพาะในพื้นที่ 3D เพิ่มขึ้นหรือลดลงตามระยะและทิศทางระหว่างตัวเร่งเสียงและผู้ฟังซึ่งหมายความว่าเมื่อผู้ฟังหรือผู้ส่งย้ายไปรอบ ๆ สภาพแวดล้อมผู้เล่นสามารถได้ยินเสียงได้อย่างไดนามิกจากทิศทางและระดับเสียงที่แตกต่างกัน

ใช้ไฟล์ Gingerbread House - Start.rbxl เป็นสถานที่เริ่มต้นและ Gingerbread House - Complete Audio เป็นข้อมูลอ้างอิง, บทแนะนำนี้จะแสดงวิธีเพิ่มทั้งการเล่นซ้ำและเสียง 3D ในประสบการณ์ของคุณรวมถึงคำแนะนำเกี่ยวกับ:

  • เล่นเสียงสิ่งแวดล้อมซ้ำๆ ที่เล่นทันทีที่ผู้เล่นเชื่อมต่อกับเซิร์ฟเวอร์
  • การเรียกเสียงเพื่อแจ้งให้ผู้เล่นทราบเกี่ยวกับเหตุการณ์สำคัญที่เกี่ยวข้องกับการเล่นเกมของพวกเขา
  • เปิดใช้งานเสียงเพื่อให้ผู้เล่นได้รับความคิดเห็นทางการได้ยินเมื่อพวกเขาโต้ตอบกับวัตถุ 3D
  • เล่นบิตเสียงตัวละครที่มีส่วนร่วมและนําผู้เล่นไปสู่จุดสนใจภายในสภาพแวดล้อมของพวกเขา

หากในจุดใดก็ตามที่คุณติดอยู่ในกระบวนการ คุณสามารถใช้ Gingerbread House - Complete Audio เป็นข้อมูลอ้างอิงเพื่อเปรียบเทียบความคืบหน้าของคุณ

วัตถุเสียง

เพื่อสร้างเสียงทิศทาง สิ่งสำคัญคือต้องเข้าใจวัตถุเสียงที่คุณจะทำงานร่วมกับตลอดการสอนนี้มีสามประเภทหลักของวัตถุเสียง:

  • วัตถุ AudioPlayer โหลดและเล่นไฟล์เสียง **** * วัตถุ AudioEmitter เป็น วิทยุเสมือน ที่ส่งเสียงไปยังสภาพแวดล้อม 3D
  • วัตถุ เป็นไมโครโฟนเสมือนที่รับเสียงจากสภาพแวดล้อม 3D
  • วัตถุ เป็นอุปกรณ์ฮาร์ดแวร์ทางกายภาพภายในโลกแห่งความจริง เช่น ลำโพงหรือหูฟัง
  • วัตถุ AudioDeviceInput เป็นไมโครโฟนทางกายภาพ ภายในโลกแห่งความจริง * Wires ส่งสตรีมเสียงจากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง

วัตถุเสียงเหล่านี้ทั้งหมดทำงานร่วมกันเพื่อส่งเสียงเหมือนกับเพื่อนร่วมงานในโลกแห่งความจริงลองดูว่าสิ่งนี้ทำงานอย่างไรในการใช้งานจริงโดยใช้ตัวอย่างผู้เล่นสวมหูฟังในขณะเล่นประสบการณ์ด้วยแล็ปท็อป:

  • การโหลด AudioPlayer ทรัพยากรเสียง 1516791621 audioID ในประสบการณ์สำหรับสนามฝน
  • เอมิต AudioEmitter ส่งสตรีมเสียงเพลงสายฝนไปยังสภาพแวดล้อม 3D
  • A Wire ส่งสตรีมจาก AudioPlayer ไปยัง AudioEmitter เพื่อให้สตรีมออกจากลำโพง 3D
  • ลูกของตัวละครฟังเสียงนั้นภายในสภาพแวดล้อม 3D เฮดเซ็ท
  • วัตถุ AudioDeviceOutput ส่งเสียงจาก AudioListener ไปยังลำโพงทางกายภาพของผู้เล่นหรือในกรณีนี้คือหูฟังของพวกเขา
  • วัตถุ AudioDeviceInput จับเสียงจากโลกแห่งความจริงและส่งกลับสู่ประสบการณ์สําหรับการแชทด้วยเสียง
การแสดงตัวแทนวัตถุภายในประสบการณ์
การแสดงตัวแทนวัตถุในโลกแห่งความจริง

ส่วนต่อไปจะดำน้ำลึกลงและอ้างอิงวัตถุเหล่านี้เมื่อคุณเรียนรู้วิธีเล่นทั้งเล่นซ้ำและเล่นเสียง 3D เดียวเมื่อคุณตรวจสอบวัตถุเหล่านี้ด้วยเทคนิคใหม่ที่กำลังจะมาถึง คุณสามารถทำนายได้อย่างแม่นยำยิ่งขึ้นว่าจะจับและส่งเสียงจากประสบการณ์ไปยังผู้เล่นและกลับกันได้อย่างไร

เล่นซ้ำเสียง

เล่นซ้ำเสียง 3D หรือเสียงทิศทางที่ทำซ้ำได้อย่างราบรื่นทันทีที่ผู้เล่นเชื่อมต่อกับเซิร์ฟเวอร์ เป็นเทคนิคการออกแบบเสียงทั่วไปเพื่อเพิ่มบรรยากาศของพื้นที่ 3D โดยทำให้รู้สึกมีชีวิตชีวาและมีชีวิตชีวานอกจากนี้การเล่นซ้ำเสียง 3D จะทำให้แหล่งเสียงสิ่งแวดล้อมของคุณสอดคล้องกัน เช่น ความสถิตของทีวีหรือเสียงกระหึ่มของน้ำตก; หากเสียงเหล่านี้หยุดกะทันหัน สภาพแวดล้อมจะรู้สึกไม่สมจริง

เพื่อสาธิตแนวคิดนี้ ตรวจสอบวิธีที่เสียง 3D ต่อไปนี้สำหรับน้ำตกขนาดใหญ่สองแห่งหยุดทันทีที่เสียงเล่นซ้ำสิ้นสุดในขณะที่น้ำฟังดูเหมือนจะดึงผู้เล่นเข้าสู่สภาพแวดล้อมภายนอกในตอนแรก การเปลี่ยนแปลงทางการได้ยินอย่างกะทันหันเป็นสิ่งที่น่าตกใจและไม่เป็นธรรมชาติต่อวิธีที่น้ำตกจะปฏิบัติในโลกแห่งความจริง

เช่นเดียวกันตัวอย่างใช้เทคนิคนี้สำหรับน้ําตกช็อคโกแลตไหลและปรับปริมาณตามระยะห่างของผู้เล่นจากตัวเร่งเสียงเมื่อผู้เล่นอยู่ไกลน้อยกว่า 20 สตัด เอมิตเตอร์จะเปิดเสียงด้วยระดับเสียงเต็มเมื่อผู้เล่นเคลื่อนที่ไปไกลขึ้น เสียงสลัดจะลดลงในระดับเสียงทุก 20 สตัดจากตัวเร่งเสียงสิ่งนี้จําลองเสียงในโลกแห่งความจริงที่ลดระดับเสียงลงเมื่อคุณห่างจากแหล่งกําเนิด

เพื่อสร้างซ้ำเสียง 3D ในตัวอย่าง บ้านขนมปังขิง - เสียงเสร็จสมบูรณ์ ไฟล์สถานที่:

  1. เปิดใช้งานผู้ฟังเริ่มต้นที่แนบมากับตัวละครผู้เล่นของคุณ

    1. ในหน้าต่าง สํารวจ เลือก SoundService 2. ในหน้าต่าง คุณสมบัติ ตั้ง ตำแหน่งผู้ฟังเริ่มต้น เป็น ตัวละคร เมื่อคุณเรียกใช้ประสบการณ์ เครื่องยนต์จะทำงานโดยอัตโนมัติ:
      • สร้าง AudioListener ภายใต้ตัวละครผู้เล่นแต่ละตัว Humanoid.RootPart เพื่อให้คุณสามารถได้ยินเสียงเปลี่ยนแปลงในลำโพงโลกแห่งความจริงตามตำแหน่งและขนาดของแหล่งเสียงภายในประสบการณ์
      • สร้าง AudioDeviceOutput ภายใต้ บริการเสียง
  2. ในหน้าต่าง สํารวจ ค้นหาไปที่ พื้นที่ทํางาน > WaterfallAudioObject จากนั้น:

    1. ใส่วัตถุ ผู้เล่นเสียง เพื่อสร้างแหล่งเสียงสำหรับน้ำตก
    2. ใส่วัตถุ เอาต์พุตเสียง เพื่อส่งสตรีมตำแหน่งจาก WaterfallAudioObject 3. ใส่วัตถุ สาย เพื่อส่งสตรีมจากเล่นเพลงไปยังตัวเร่งเสียง
  3. เลือก ผู้เล่นเสียง จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง AssetID เป็น rbxassetid://1516791621 เพื่อเล่นเพลงเสียงฝน 2. เปิดใช้งาน การเล่นซ้ำ เพื่อให้เสียงซ้ำไปโดยไม่มีที่ติ

  4. เลือก ตัวปล่อยเสียง จากนั้นในหน้าต่าง คุณสมบัติ ตั้ง การลดระดับเสียง เป็น {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} เพื่อให้เสียงลดลงอย่างต่อเนื่องทุก 20 สตัดจากตัวปล่อยเสียง

  5. เลือก สาย จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง SourceInstance ให้กับ AudioPlayer ผู้เล่น 2. ตั้ง เป้าหมายInstance ให้กับ AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเอาต์พุตเสียงเฉพาะนี้ภายในน้ำตก

  6. กลับไปที่หน้าต่าง สํารวจ ใส่ สคริปต์ ใน WaterfallAudioObject แล้วเปลี่ยนชื่อเป็น LoopWaterfallMusic ตั้งค่าคุณสมบัติ RunContext ของมันเป็น ไคลเอนต์ จากนั้นใส่โค้ดต่อไปนี้ในสคริปต์:


    local audioPlayer = script.Parent
    audioPlayer:Play()

    สคริปต์เริ่มต้นด้วยการประกาศตัวแปรเพื่อแทนที่พ่อของสคริปต์ AudioPlayerสคริปต์จะตั้งแหล่งเสียงเพื่อเล่นตั้งแต่ช่วงเวลาที่ผู้เล่นเข้าร่วมประสบการณ์จนถึงช่วงเวลาที่พวกเขาออกจากประสบการณ์

  7. ทดสอบประสบการณ์เพื่อฟังเสียงฝนช็อคโกแลตเล่นซ้ำเมื่ออวาตาร์ของคุณอยู่ใกล้กับน้ำตกเมื่อคุณหมุนหัวของตัวละครของคุณเพื่อมองในทิศทางที่แตกต่างกันเสียงจะเปลี่ยนไปอย่างไดนามิกตามตำแหน่งของเอมิตเตอร์ในพื้นที่ 3D

เสียงยิงเดียว

เสียง 3D ยิงเดียว หรือเสียงทิศทางที่เล่นเพียงครั้งเดียวในเวลาและตำแหน่งที่กำหนดจนกว่าผู้เล่นจะกระตุ้นมันอีกครั้ง ให้ผู้เล่นมีบริบทเกี่ยวกับการกระทำของพวกเขา สภาพแวดล้อม และตัวละครรอบพวกเขาการใช้ประเภทข้อเสนอแนะทางการได้ยินในประสบการณ์ของคุณเป็นสิ่งสำคัญเพราะช่วยให้ผู้เล่นสามารถตัดสินใจได้อย่างยุติธรรม เช่น หลีกเลี่ยงศัตรูที่กำลังจะมาหรือหยิบสิ่งของที่มีประโยชน์

ส่วนต่อไปนี้ให้รายละเอียดการดำเนินการสำหรับสถานการณ์การเล่นเกมทั่วไปที่ผู้เล่นต้องการข้อเสนอแนะทันเวลาและทิศทางรวมถึงกิจกรรมการเล่นเกมสถานการณ์และบทสนทนาตัวละครที่ไม่สามารถเล่นได้

ข้อเสนอแนะ

เมื่อผู้เล่นกระตุ้นเหตุการณ์สถานการณ์ที่สำคัญภายในสภาพแวดล้อมของพวกเขา เช่น ปลดล็อกพื้นที่เล่นเกมใหม่หรือเรียกยิงของศัตรู ก็เป็นสิ่งสำคัญที่พวกเขาต้องเข้าใจว่าอยู่ในพื้นที่ 3D ข้อเสนอแนะพวกเขาอาจพลาดข้อมูลที่สำคัญสำหรับการเล่นเกมของพวกเขา ส่งผลให้เกิดความผิดหวังเมื่อไม่ทราบว่าจะไปที่ไหนหรือทำอะไรต่อไป

เพื่อสาธิตว่าทำไมสิ่งนี้จึงเป็นสิ่งสำคัญ มาดูการออกอากาศเสียง 3D แบบเดียวจากแม่แบบ Laser Tag ที่เล่นจากเบลาสเตอร์ของผู้เล่นแต่ละคน:

  • เสียงป๊อปลึกเล่นสำหรับทุกการระเบิดที่ผู้เล่นยิงจากเบลาสเตอร์ของพวกเขา
  • เสียงคลิกและหุ่นยนต์บี๊ปเล่นในแต่ละครั้งที่ผู้เล่นรีโหลดบลาสเตอร์ของพวกเขาด้วยรอบใหม่

ทั้งสองเสียงนี้ให้ความตระหนักถึงสถานการณ์โดยแจ้งผู้เล่นที่อยู่ใกล้เคียงทั้งหมดถึงทิศทางที่ระเบิดกําลังมาจากเพื่อให้พวกเขาสามารถตัดสินใจได้อย่างมีข้อมูลว่าจะเข้าร่วมในความสนุกสนานหรือหลีกเลี่ยงอันตรายที่อาจเกิดขึ้น

ตัวอย่างใช้เทคนิคเดียวกันนี้เพื่อให้ผู้เล่นตระหนักถึงสถานการณ์เกี่ยวกับรางวัลสําหรับการสําเร็จภารกิจหลักภายในประสบการณ์หลังจากที่พวกเขารวบรวมลูกอมทั้งสามแล้ว ประตูสู่บ้านขนมปังขิงจะเปิดขึ้นเพื่อให้ผู้เล่นสามารถเข้าถึงสิ่งที่อยู่ภายในได้

เนื่องจากไม่มีคำสั่งซื้อที่เฉพาะเจาะจงที่ผู้เล่นต้องรวบรวมลูกอม จึงเป็นสิ่งสำคัญที่ผู้เล่นตระหนักถึงการเปิดประตูไม่ว่าลูกอมที่พวกเขารวบรวมล่าสุดจะเป็นอะไรเสียงตำแหน่งทำให้เป็นไปได้เพื่อให้ผู้เล่นตระหนักถึงความสำเร็จและสถานที่ที่พวกเขาต้องไปต่อไปโดยไม่คำนึงถึงระยะห่างและทิศทางจากประตู

เพื่อสร้างการตอบรับเสียง 3D จากอีเวนต์ยิงเดียวใหม่ในตัวอย่าง บ้านขนมปังขิง - เสียงเสร็จสมบูรณ์ ไฟล์สถานที่:

  1. ในหน้าต่าง สํารวจ ค้นหาไปที่ พื้นที่ทํางาน > ประตู จากนั้น:

    1. ใส่วัตถุ เล่นเสียง เพื่อสร้างแหล่งเสียงสำหรับระดับเสียง
    2. ใส่วัตถุ เอาต์พุตเสียง เพื่อส่งสตรีมตำแหน่งจาก ประตู 3. ใส่วัตถุ สาย เพื่อส่งสตรีมจากเล่นเพลงไปยังตัวเร่งเสียง
  2. เลือก ผู้เล่นเสียง จากนั้นในหน้าต่าง คุณสมบัติ ตั้ง AssetID เป็น rbxassetid://5930776613

  3. เลือก สาย จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง SourceInstance ให้กับ AudioPlayer ผู้เล่น 2. ตั้ง เป้าหมายInstance ให้กับ AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเอาต์พุตเสียงเฉพาะนี้ภายในระดับเสียง

  4. กลับไปที่หน้าต่าง สํารวจ ค้นหา ServerScriptService จากนั้นใส่ สคริปต์ แล้วเปลี่ยนชื่อเป็น GumdropService ตั้งค่าคุณสมบัติ RunContext ของมันเป็น เซิร์ฟเวอร์ จากนั้นใส่โค้ดต่อไปนี้ลงในสคริปต์:


    -- กําลังเริ่มตัวแปร
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local TweenService = game:GetService("TweenService")
    -- โมดูล
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- ตัวแปร
    local gumdropsFolder = Workspace.Gumdrops
    local gumdrops = gumdropsFolder:GetChildren()
    local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAME
    local GUMDROP_AMOUNT_TO_ADD = 1
    local function updatePlayerGumdrops(player, updateFunction)
    -- อัปเดตตาร์ gumdrop
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- ตารางอันดับgumdrop
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- ตรวจสอบว่าผู้เล่นได้รวบรวมลูกอมสามอันหรือไม่
    if newGumdropAmount >= 3 then
    -- เล่นเสียงอีเวนต์ประตูเมื่อผู้เล่นรวบรวมลูกอมสามอัน
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- เคลื่อนย้ายประตูให้เคลื่อนลง
    local doorPart = Workspace.Door
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})
    tween:Play()
    end
    end
    -- การกำหนดตัวจัดการอีเวนต์
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- ผู้เล่นแตะลูกอม
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Enabled", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    print("Player collected gumdrop")
    end
    end
    end
    -- การตั้งค่าผู้ฟังอีเวนต์
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Enabled", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    สคริปต์นี้เริ่มต้นด้วยการเริ่มต้นบริการ Workspace , Players , ServerStorage และ TweenService เพื่อให้สามารถอ้างอิงถึงบุตรหลานและฟังก์ชันของพวกเขาได้จากนั้นต้องใช้ ลีดเดอร์บอร์ด และ PlayerData โมดูลใน ServerStorage; โมดูลเหล่านี้มีความรับผิดชอบในการสร้างและอัปเดตลีดเดอร์บอร์ดในมุมขวาบนของหน้าจอที่ติดตามจํานวนลูกบอลที่ผู้เล่นรวบรวมในสภาพแวดล้อม

    ฟังก์ชันของสคริปต์ updatePlayerGumdrops เป็นที่ที่ส่วนใหญ่ของงานเกิดขึ้นเพื่อกระตุ้นเสียง 3D สําหรับการตอบรับอีเวนต์ และต้องใช้อาร์กิวเมนต์สองตัว:

    • player - ผู้เล่นที่รวบรวม gumdrop
    • updateFunction - ฟังก์ชันการโทรกลับที่อัปเดตปริมาณ gumdrop ที่รวบรวมของผู้เล่น

    เมื่อผู้เล่นชนกับ gumdrop สคริปต์:

    • รับมูลค่าการรวบรวมของลูกอมใหม่ของผู้เล่นโดยการโทรไปที่ฟังก์ชัน PlayerData.updateValue
    • อัปเดตลีดเดอร์บอร์ดด้วยจำนวนใหม่นี้โดยโทรไปที่ฟังก์ชัน Leaderboard.setStat
    • ตรวจสอบเพื่อดูว่าจำนวนมากกว่าหรือเท่ากับ 3 หรือไม่

    เมื่อค่านี้มากกว่าหรือเท่ากับ 3 คำสั่ง:

    • เล่นเพลงเสียง 3D จากเครื่องเล่นเสียงไปยังตัวเร่งเสียง
    • เคลื่อนเส้นประตูไปตามแนวนอน 15 สตัดด้านล่างตำแหน่งปัจจุบัน

    ส่วนที่เหลือของสคริปต์มีหน้าที่รับผิดชอบในการตรวจจับสิ่งใดที่ชนกับ gumdrop เป็นผู้เล่นเพื่อให้สามารถกระตุ้นเสียงไม่สมบูรณ์ได้สำหรับการตอบรับความคิดเห็นเกี่ยวกับการรวบรวมสำหรับข้อมูลเพิ่มเติมเกี่ยวกับส่วนนี้ของสคริปต์ ดู เพิ่มเสียง 2D - ข้อเสนอแนะการเล่นเกม

  5. ทดสอบประสบการณ์เพื่อฟังเสียงประตูสไลด์หลังจากที่คุณรวบรวมลูกอมทั้งสามในสภาพแวดล้อมทั้งหมดเมื่อคุณหมุนกล้องเสียงจะเปลี่ยนไปอย่างไดนามิกในลำโพงโลกแห่งความจริงของคุณเพื่อให้คุณได้ยินตามตำแหน่งของเอมิตเตอร์ในพื้นที่ 3D

การโต้ตอบของวัตถุ

เมื่อผู้เล่นโต้ตอบกับวัตถุ 3D ภายในสภาพแวดล้อมของพวกเขา เช่น เปิดสวิตช์ไฟหรือหยิบอาวุธ ก็เป็นสิ่งสำคัญที่จะต้องให้ข้อเสนอแนะทันทีเพื่อให้พวกเขาเข้าใจได้อย่างชัดเจนว่าพวกเขากำลังโต้ตอบกับวัตถุอย่างไร วิธี ที่พวกเขากำลังโต้ตอบการจับคู่ของความคิดเห็นทั้งภาพและเสียงเสริมสร้างความสัมพันธ์ระหว่างสาเหตุและผลกระทบระหว่างการกระทำของผู้เล่นและการตอบสนองทางสิ่งแวดล้อม

เพื่อขยายความคิดนี้, ลองดู 3D เสียงเดียวถัดไปจากตัวอย่าง พืช สำหรับการไหลของผู้ใช้สำหรับการปลูกกะหล่ำ:

  • เสียงคลิกอ่อนเล่นเมื่อผู้เล่นปลูกเมล็ด
  • เสียงเปียกเหมือนการสาดเมื่อผู้เล่นรดน้ำพืชที่เติบโตของพวกเขา
  • เสียงคลิปเล่นเมื่อผู้เล่นรวบรวมพืชที่โตเต็มที่
  • เสียง thud อ่อนเล่นเมื่อผู้เล่นวางกะหล่ำลงในเกวียน

เสียงเหล่านี้ทั้งหมดเสริมการโต้ตอบระยะใกล้ของผู้เล่น กุญแจ กับวัตถุที่เปลี่ยนรูปในพื้นที่ เป็นเจ้าของการให้ฟอร์มหลายรูปแบบของการตอบสนองทางสัมผัสเหล่านี้ช่วยให้การโต้ตอบของวัตถุ 3D ของคุณยังคงเป็นไปได้และเป็นธรรมชาติสำหรับผู้เล่นจำนวนมากที่สุดเท่าที่เป็นไปได้

เพื่อให้ตัวอย่างที่แตกต่างของวิธีที่คุณสามารถกำหนดการโต้ตอบของวัตถุกับหลายรูปแบบของการตอบสนองทางประสาทสัมผัสได้ ข้อเสนอแนะ3D peppermint ภายในบ้านขนมปังขิงเมื่อผู้เล่นไม่ได้โต้ตอบกับปุ่ม มันจะดูเหมือนลูกอมปีปองทั่วไป แต่เมื่อพวกเขาก้าวเข้าสู่ปุ่มตัวอย่าง:

  • เล่นเพลงเสียงกริ่งเฉลิมฉลอง
  • ย้อมด้านข้างของปุ่มด้วยสีเขียว
  • ย้ายปุ่มลงสู่พื้น

จากที่นี่ คุณสามารถเชื่อมโยงการโต้ตอบนี้กับการกระทำเกมที่ไม่ซ้ำกันทั้งหมด เช่น ปลดล็อกไอเทมหรือเรียกใช้ความสามารถพิเศษ

มุมมองเริ่มต้น
>

สถานะกด

เพื่อสร้างใหม่การโต้ตอบเสียง 3D ของวัตถุยิงเดียวในตัวอย่าง บ้านขนมปังขิง - เสียงเสร็จสมบูรณ์ ไฟล์สถานที่:

  1. ในหน้าต่าง สํารวจ ค้นหาไปที่ พื้นที่ทํางาน > ปุ่มเสียง 3D จากนั้น:

    1. ใส่วัตถุ เล่นเสียง เพื่อสร้างแหล่งเสียงสำหรับปุ่ม
    2. ใส่วัตถุ เอาต์พุตเสียง เพื่อส่งสตรีมตำแหน่งจาก 3DAudioButton 3. ใส่วัตถุ สาย เพื่อส่งสตรีมจากเล่นเพลงไปยังตัวเร่งเสียง
  2. เลือก ผู้เล่นเสียง จากนั้นในหน้าต่าง คุณสมบัติ ตั้ง AssetID เป็น rbxassetid://1846248593

  3. เลือก สาย จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง SourceInstance ให้กับ AudioPlayer ผู้เล่น 2. ตั้ง เป้าหมายInstance ให้กับ AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเอาต์พุตเสียงเฉพาะนี้ภายในปุ่ม

  4. กลับไปที่หน้าต่าง สํารวจ ใส่ สคริปต์ ใน ปุ่มเล่นเสียงเมื่อกด แล้วเปลี่ยนชื่อเป็น เล่นเสียงเมื่อกด จากนั้นใส่โค้ดต่อไปนี้ในสคริปต์:


    local TweenService = game:GetService("TweenService")
    local buttonModel = script.Parent.Parent
    local buttonPart = buttonModel.ButtonPart
    local buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayer
    local tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)
    local buttonTweenByIsPressed = {
    -- กด
    [true] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size / Vector3.new(2, 1, 1),
    Color = Color3.fromRGB(75, 151, 75),
    }),
    -- ค่าเริ่มต้น
    [false] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size,
    Color = Color3.fromRGB(196, 40, 28),
    }),
    }
    local function onIsPlayingChanged()
    local isPlaying = buttonPressedAudioPlayer.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonPart.Touched:Connect(function(_hit)
    buttonPressedAudioPlayer:Play()
    end)

    สคริปต์เริ่มต้นโดยรับ:

    • The TweenService เพื่อให้สามารถแอนิเมชั่นส่วนของปุ่มที่ยื่นออกมาจากพื้นได้
    • โมเดลพ่อของสคริปต์ ปุ่มเสียง 3D * ส่วนของปุ่มที่ยื่นออกมาจากพื้น
    • ผู้เล่นเสียงที่เกี่ยวข้องพร้อมเสียงเพลงเฉลิมฉลองของคุณ

    สคริปต์จะกำหนด:

    • วัตถุ TweenInfo ที่ระบุว่าแอนิเมชั่นของปุ่มจะเล่นด้วยสไตล์แอนิเมชั่นเอกประสงค์
    • วัยรุ่นสองคนที่แทนที่สถานะกดหรือไม่กดปุ่ม
      • สถานะที่กด true จะย้ายปุ่มลงเล็กน้อยลงสู่พื้นและย้อมสีด้านข้างของชิ้นส่วนด้วยสีเขียว
      • สถานะไม่กด false จะย้ายปุ่มกลับไปที่ตำแหน่งเดิมและลบสีก่อนหน้า

    ส่วนที่เหลือของสคริปต์เป็นที่ที่ส่วนใหญ่ของการทำงานเกิดขึ้นสำหรับการตอบรับข้อเสนอแนะการโต้ตอบของวัตถุดังนั้นมาดูกันว่าฟังก์ชัน onIsPlayingChanged และผู้ฟังอีเวนต์ทำงานร่วมกันอย่างไร

    1. buttonPart.Touched ฟังเพื่อให้ผู้เล่นแตะปุ่มแล้วเรียกฟังก์ชัน Play() เพื่อเริ่มเล่นเสียงที่เกี่ยวข้องจากเครื่องเล่นเสียงกระบวนการนี้สลับคุณสมบัติ AudioPlayer.IsPlaying จาก false เป็น true
    2. buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") ฟังคุณสมบัติของผู้เล่นเสียงเพื่อเปลี่ยนแปลง IsPlaying จากนั้นเรียกฟังก์ชัน onIsPlayingChanged
    3. ฟังก์ชัน onIsPlayingChanged ใช้ข้อมูลนี้เพื่อเรียกการเปลี่ยนแปลงวัยรุ่นที่เปลี่ยนรูปลักษณ์ของมันในพื้นที่ 3D
    4. เพื่อป้องกันไม่ให้ผู้เล่นรีสตาร์ทเสียงโดยไม่ได้ตั้งใจหากพวกเขากระโดดบนปุ่มอย่างรวดเร็วในช่วงเวลาสั้น ๆ buttonPressedAudioPlayer.Ended รอให้ผู้เล่นเสียงจบการเล่นก่อนที่จะเรียกฟังก์ชัน onIsPlayingChanged อีกครั้ง

    สิ่งสำคัญคือต้องทราบว่าอีเวนต์ onIsPlayingChanged จะเกิดขึ้นเฉพาะเมื่อมันเปลี่ยนจาก false เป็น true ซึ่งหมายความว่ามันจะไม่เกิดขึ้นเมื่อเปลี่ยนจาก true เป็น falseนี่คือพฤติกรรมที่ตั้งใจไว้เนื่องจากมีการซับซ้อนกับเวลาในการสําเนาคุณสมบัติจากเซิร์ฟเวอร์ไปยังไคลเอนต์เนื่องจากเหตุนี้ การเหตุการณ์ Ended จึงจะได้รับและฟังในตัวอย่างนี้เพื่อครอบคลุมทั้งสองกรณี

  5. ทดสอบประสบการณ์เพื่อฟังเสียงฉลองเมื่อตัวละครผู้เล่นสัมผัสปุ่ม 3D ในบ้านขนมปังขิงเมื่อคุณเดินออกจากปุ่ม ระดับเสียงจะลดลง

บทสนทนาตัวละคร

การให้เสียงทิศทางจากตัวละครที่ไม่สามารถเล่นได้ (NPC) ช่วยให้ผู้เล่นสามารถนําไปสู่จุดสนใจภายในสภาพแวดล้อมของพวกเขาและเพิ่มความลึกให้กับการโต้ตอบของพวกเขากับตัวละครอื่น ๆในความเป็นจริงในเกมที่ขับเคลื่อนด้วยเรื่องราว นักออกแบบเกมจำนวนมากใช้บทสนทนาตัวละครเพื่อสอนผู้เล่นเกี่ยวกับตัวละคร พันธมิตร และศัตรู หรือโลกเองอย่างกลยุทธ์

ตัวอย่างทั่วไปของเทคนิคนี้รวมถึง:

  • สไตล์การสนทนา เพื่อตั้งโทนของเกมของคุณ
  • Banter เพื่อสอนผู้เล่นเกี่ยวกับความสัมพันธ์ของตัวละคร
  • การสนทนาศัตรู เพื่อสารภาพแรงจูงใจหรือตำแหน่งของพวกเขาเกี่ยวกับผู้เล่น
  • ตัวละครผู้เล่นพูดความคิดของพวกเขาออกมาอย่างดังเพื่อนำผู้เล่นไปสู่สิ่งที่พวกเขาควรทำต่อไป เช่น รักษาตัวเอง ไอเท็มหรือค้นหาไอเทม * ตัวละครพันธมิตรพูดคุยกับตัวละครผู้เล่น เพื่อเปิดเผยรายละเอียดโลกในประสบการณ์ เช่น ประวัติศาสตร์ วัฒนธรรม และปัญหาสังคม

เพื่อสาธิตว่าสิ่งนี้สามารถดูเป็นอย่างไรในการปฏิบัติ มาดูออดิโอ 3D ยิงเดียวต่อไปนี้จาก เกินความมืด โชว์เคสที่เล่นเป็นระยะๆ เมื่อผู้เล่นอยู่ในพื้นที่ล็อบบี้หลักของสถานีอวกาศ

โดยใช้สถานีอวกาศเป็นตัวละคร คลิปโต้ตอบนี้จะให้ผู้เล่นบริบทและความรู้ที่สำคัญเกี่ยวกับการตั้งค่าโดยรวมตัวอย่างเช่น จากประโยคเดียวนี้ผู้เล่นเรียนรู้:

  • พวกเขาอยู่ในอวกาศ โดยเฉพาะอย่างยิ่งบนสถานีอวกาศที่ชื่อว่า Kerr-Newman Deep Space Relay 14
  • สภาพแวดล้อมของพวกเขาเป็นอนาคตและเปิดกว้าง
  • พวกเขาเป็นผู้เยี่ยมชมและอาจออกเร็ว ๆ นี้

รายละเอียดเหล่านี้รวมกันทำให้ผู้เล่นอยู่ภายในสภาพแวดล้อมของพวกเขาและเพิ่มความรู้สึกเร่งด่วนให้กับภารกิจของพวกเขาอย่างไรก็ตาม หากผู้เล่นไม่ทราบว่าภารกิจหลักของพวกเขาคืออะไร คุณยังสามารถใช้บทสนทนาตัวละครเพื่อแจ้งให้ผู้เล่นทราบถึงสิ่งที่คุณต้องการให้พวกเขาทำภายในประสบการณ์ของคุณ

เพื่อให้เห็นภาพ ตัวอย่างใช้ ปริมาณเสียง หรือภูมิภาคที่มองไม่เห็นภายในพื้นที่ 3D เพื่อกระตุ้นการโต้ตอบตัวละครจากมนุษย์หิมะเพื่อนำผู้เล่นไปรวบรวมลูกกลิ้งสามอันเพื่อเปิดประตูบ้านของเขาเนื่องจากเป็นหนึ่งในสิ่งแรกที่ผู้เล่นเห็นเมื่อพวกเขาเข้าร่วมประสบการณ์ ผู้เล่นมีแนวโน้มที่จะกระตุ้นการสนทนาและรู้ว่าพวกเขาต้องทำอะไรเพื่อประสบความสำเร็จ

ปริมาณรอบมนุษย์หิมะใช้การตอบรับความชนกันเพื่อเล่นเสียงเมื่อผู้เล่นเข้าสู่ภูมิภาค 3D

เพื่อสร้างใหม่บทสนทนาตัวละครแบบยิงเดียว 3D เสียงในตัวอย่าง บ้านขนมปังขิง - เสียงเสร็จสมบูรณ์ ไฟล์สถานที่:

  1. ในหน้าต่าง สํารวจ ค้นหาไปที่ พื้นที่ทํางาน > ปริมาณการสนทนา จากนั้น:

    1. ใส่วัตถุ เล่นเสียง เพื่อสร้างแหล่งเสียงสำหรับระดับเสียง
    2. ใส่วัตถุ เอาต์พุตเสียง เพื่อส่งสตรีมตำแหน่งจาก Volume ของบทสนทนา 3. ใส่วัตถุ สาย เพื่อส่งสตรีมจากเล่นเพลงไปยังตัวเร่งเสียง
  2. เลือก ผู้เล่นเสียง จากนั้นในหน้าต่าง คุณสมบัติ ตั้ง AssetID เป็น เพื่อเล่นเสียงสอนในเชิงใช้งานสำหรับวัตถุประสงค์ของประสบการณ์

  3. เลือก สาย จากนั้นในหน้าต่าง คุณสมบัติ 1. ตั้ง SourceInstance ให้กับ AudioPlayer ผู้เล่น 2. ตั้ง เป้าหมายInstance ให้กับ AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเอาต์พุตเสียงเฉพาะนี้ภายในระดับเสียง

  4. กลับไปที่หน้าต่าง สํารวจ ค้นหาไปที่ StarterPlayer > StarterCharacterScripts , ใส่ สคริปต์ท้องถิ่น , เปลี่ยนชื่อเป็น PlayAudioWhenInVolume และวางโค้ดต่อไปนี้ลงในสคริปต์ท้องถิ่น:


    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local humanoid = script.Parent:WaitForChild("Humanoid")
    local volumeDetector = Workspace.DialogueVolume
    local trigger = humanoid:WaitForChild("Animator")
    local debounce = false
    local localPlayer = Players.LocalPlayer
    volumeDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
    if hitPlayer ~= localPlayer then
    return
    end
    debounce = true
    local audioPlayer = Workspace.DialogueVolume.AudioPlayer
    audioPlayer:Play()
    audioPlayer.Ended:Wait()
    debounce = false
    end)

    สคริปต์นี้เริ่มต้นโดยรับบริการพื้นที่ทำงานและผู้เล่นเพื่อให้สามารถอ้างอิงถึงบุตรหลานและฟังก์ชันของพวกเขาได้สำหรับแต่ละตัวละครผู้เล่นที่โหลดหรือเกิดใหม่กลับเข้าสู่ประสบการณ์แล้ว สคริปต์จะรอ:

    • วัตถุของตัวละคร Humanoid และ Animator

    • วัตถุระดับเสียงในพื้นที่ทำงานชื่อ DialogueVolume เมื่อมีอะไรชนกับระดับเสียง ฟังก์ชันตัวจัดการเหตุการณ์ Touched จะได้รับบรรพบุรุษคนแรกที่เป็น Model ซึ่งควรเป็นตัวละครถ้า BasePart ที่ชนกับระดับเสียงเป็นลูกหลานของรูปแบบตัวละครหากเป็นเช่นนั้นฟังก์ชันจะ:

    • ตั้งค่าการชะลอลงเป็น true

    • ปิด

    • ตั้งค่า debounce กลับเป็น false

    การตั้งค่าการชะลอจาก false ไปยัง true ไปยัง false อีกครั้งหลังจากที่เสียงเสร็จสิ้นการเล่นเป็นรูปแบบการชะลอที่ป้องกันไม่ให้เสียงถูกกระตุ้นซ้ำแล้วซ้ำอีกเนื่องจากผู้เล่นไม่หยุดชนกับระดับเสียงสำหรับข้อมูลเพิ่มเติมเกี่ยวกับลายลักษณ์นี้ debounce ดู ตรวจจับการชนกัน

  5. ทดสอบประสบการณ์เพื่อฟังบทสนทนาตัวละครสอนขณะที่ตัวละครผู้เล่นสัมผัสปริมาณรอบตุ๊กตาหิมะ