พืช เป็นประสบการณ์การอ้างอิงที่ผู้เล่นปลูกและรดน้ำเมล็ดพันธุ์ เพื่อให้พวกเขาสามารถเก็บเกี่ยวและขายพืชที่เกิดขึ้นในภายหลัง
โครงการนี้มุ่งเน้นไปที่กรณีใช้งานทั่วไปที่คุณอาจพบในขณะที่พัฒนาประสบการณ์บน Roblox โดยทั่วไป คุณจะพบโน้ตเกี่ยวกับความแตกต่างระหว่างการตัดสินใจที่ดีที่สุดสำหรับประสบการณ์ของคุณเอ
รับไฟล์
- ไปที่หน้าประสบการณ์ Plant
- คลิกปุ่ม ⋯ และ แก้ไขในสตูดิโอ
ใช้กรณี
พืช ครอบคลุมการใช้งานต่อไปนี้:
- ข้อมูลเซสชันและข้อมูลผู้เล่นคงอยู่
- การจัดการมุมมอง UI
- เครือข่ายคลาวด์
- ประสบการณ์ผู้ใช้ครั้งแรก (FTUE)
- การซื้อเงินทุนที่แข็งแกร่งและเงินทุนที่นุ่มนวล
นอกจากนี้โครงการนี้แก้ปัญหาชุดแคบของปัญหาที่ใช้ได้กับหลายประสบการณ์ รวมถึง:
- การปรับแต่งพื้นที่ในสถานที่ที่เกี่ยวข้องกับผู้เล่น
- การจัดการความเร็วของตัวละครผู้เล่น
- การสร้างวัตถุที่ติดตามตัวละครรอบ
- ตรวจจับส่วนใดของโลกที่ตัวละครอยู่
โปรดทราบว่ามีกรณีการใช้งานหลายรายการในประสบการณ์นี้ที่เล็กเกินไป แนวคิดเกินไป หรือไม่แสดงให้เห็นว่ามีวิธีแก้ปัญหาสำหรับการออกแบบที่น่าสนใจ; สิ่งเหล่านี้ไม่ได้รับการรองรับ
โครงสร้างโครงการ
การตัดสินใจครั้งแรกเมื่อสร้างประสบการณ์คือการตัดสินใจว่าจะสร้างโครงสร้าง โครงการ ในลักษณะใด ซึ่งรวมถึงสถานที่ที่จะวางตำแหน่งรายการที่เฉพาะใน รหัสและวิธีการจัดระเบ
แบบข้อมูล
ตารางต่อไปนี้อธิบายว่าบริการคอนเทนเนอร์ในตัวอย่างข้อมูลรุ่นของข้อมูลจะถูกวางใน
บริการ | ประเภทของ Instances |
---|---|
Workspace | มีโมเดลคงที่ที่แทนที่โลก 3D โดยเฉพาะอย่างยิ่งส่วนของโลกที่ไม่เป็นของผู้เล่น คุณไม่จำเป็นต้องสร้าง ปรับแต่ง หรือทำลายรุ่นนี้ในเวลาท |
Lighting | ผลกระทบทางบรรยากาศและแสงสว่าง. |
ReplicatedFirst | มีลักษณะลูกโดยสารที่เล็กที่สุดที่จำเป็นสำหรับหน้าจอการโหลดและการเริ่มต้นเกม ยิ่งมีลักษณะลูกโดยสารที่วางใน Class.ReplicatedFirst มากเท่าไหร่ ก็จะยิ่งทำให้รอนานขึ
|
ReplicatedStorage | ใช้เป็นคอนเทนเนอร์การเก็บข้อมูลสำหรับทุกตัวอย่างที่จำเป็นต้องเข้าถึงทั้งในลูกค้าและเซิร์ฟเวอร์. ใน คลังขึ้นอยู่ ฟอลเดอร์มีบางห้องสมุดของบุคคลที่สามที่ใช้โดยโครงก |
ServerScriptService | มี Script ที่ทำหน้าที่เป็นจุดเข้าถึงสำหรับทุกโค้ดด้านเซิร์ฟเวอร์ในโครงการ. |
ServerStorage | ใช้เป็นคอนเทนเนอร์เก็บข้อมูลสำหรับทุกรุ่นที่ไม่จำเป็นต้องเคลื่อนย้ายไปยังลูกค้า.
|
SoundService | มีวัตถุ Sound ที่ใช้สำหรับเอฟเฟ็กต์เสียงในเกม ภายใต้ SoundService วัตถุเหล่านี้ไม่มีตําแหน่งและไม่ได้จําลองในพื้นที่ 3D |
แต้มการเข้า
โค้ดส่วนใหญ่จะจัดรหัสอยู่ใน ModuleScripts ที่สามารถนำเข้าได้ท
สำหรับเกม Plant ไมโครเกม การใช้ LocalScript ที่เป็นจุดเริ่มต้นสำหรับรหัสลูกค้าทั้งหมด และ Script ที่เป็นจุดเริ่มต้นสำหรับรห
รายการต่อไปนี้อธิบายความสัมพันธ์ของทั้งสองวิธี:
- เว็บไซต์ Script และเว็บไซต์ LocalScript ตรงกัน
- การควบคุมมากขึ้นเกี่ยวกับลำดับที่ซอฟต์แวร์ต่างๆ เริ่มต้นเพราะทุกโค้ดได้รับการเริ่มต้นจากสคริปเดียว
- สามารถส่งตัวอุปกรณ์ได้โดยอ้างอิงระหว่างระบบ
สถาปัตยกรรมระดับสูง
ระบบระดับสูงสุดในโครงการได้รับการอธิบายด้านล่าง บางระบบมีความซับซ้อนมากกว่าระบบอื่น ๆ Class
แต่ละระบบเหล่านี้เป็น "singleton" ในที่ว่ามันเป็นคลาสที่ไม่ใช่ตอนที่ได้รับการริเริ่มโดยสคริปต์ start ในขณะที่คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ รูปแบบ singleton ในภายหลังในคู
เซิร์ฟเวอร์
ระบบต่อไปนี้เกี่ยวข้องกับเซิร์ฟเวอร์
ระบบ | คำอธิบาย |
---|---|
เครือข่าย |
|
PlayerDataServer เซิร์ฟเวอร์ | บันทึกและโหลดข้อมูลผู้เล่นที่คงที่โดยใช้ Class.DataStoreService . เก็บข้อมูลผู้เล่นในหน่วยความจำและวาดลายสัญลักษณ์บนคลายันต |
ตลาด |
|
CollisionGroupManager รุ่น |
|
FarmManagerServer |
|
กระเป๋าผู้เล่น |
|
เล่น TagPlayers |
|
FtueManagerServer เซิร์ฟเวอร์ |
|
CharacterSpawner |
|
ลูกค้า
ระบบต่อไปนี้เกี่ยวข้องกับลูกค้า
ระบบ | คำอธิบาย |
---|---|
เครือข่าย | รอให้เซิร์ฟเวอร์สร้างตัวอักษรทั้งหมด Class.RemoteEvent และ Class.RemoteFunction |
PlayerDataClient | เก็บข้อมูลผู้เล่นในหน่วยความจำเกี่ยวกับเกมที่กำลังจะมาถึงในเร็ว ๆ นี้ในหน่วยความจำของเรานั้นเองด้วยการเขียนโปรแกรมและสัญญาณเพื่อการเขียนโปรแกรมและการสมัครรวมกับข้อม |
ตลาด客戶端 |
|
การเดินทางท้องถิ่นของฉันจัดการผู้จัดการ | เปิดเผยวิธีการที่จะปรับปรุง Class.Humanoid.WalkSpeed|WalkSpeed หรือ Class.Humanoid.JumpHeight|JumpHeight ของตัวละครผ่านตัวคูณเพื่อหลีกเลี่ยงความขัดแย้งเมื่อปรับปรุงค่าเหล่า |
FarmManagerClient | ฟังสำหรับเฉพาะป้ายชื่อ Class.CollectionService ที่ถูกใช้ในตัวแทนและสร้าง "การกระทํา" ที่แนบมาให้กับตัวแทนเหล่านี้ ส่วน "กา |
UI การตั้งค่า | เริ่มต้นระดับ UI ทั้งหมดให้เห็นได้ในส่วนต่างๆ ของเกมโลกของเกม. เริ่มต้นระดับกล้องพิเศษสำหรับเมนูเมื่อเปิดใช้งานเมนู เริ่มต้นระดับการ |
FtueManagerClient |
|
การวิ่งตัวละคร |
|
การสื่อสารระหว่างลูกค้าและเซิร์ฟเวอร์
ประสบการณ์ Roblox ส่วนใหญ่มีส่วนที่เกี่ยวข้องกับการสื่อสารระหว่างลูกค้าและเซิร์ฟเวอร์ นี่อาจรวมถึงคำขอของลูกค้าเพื่อให้เซิร์ฟเวอร์ปฏิบัติการตามการดำเนินการบางอย่างและการเรียกร้องขอของเซิร์ฟเวอร
ในโครงการนี้การสื่อสารระหว่างเครื่องคอมพิวเตอร์และเซิร์ฟเวอร์จะใช้งานได้อย่างเต็มที่โดยการจำกัดการใช้งานของ RemoteEvent และ RemoteFunction โอเคจต์เพื่อลดจำนวนก�
- การเลียนแบบผ่านระบบ ข้อมูลผู้เล่น
- การเลียนแบบผ่าน คุณสมบัติ .
- การเลียนแบบผ่าน แท็ก
- การส่งข้อความ โดยตรง ผ่านโมดูล เครือข่าย
การเลียนแบบผ่านระบบข้อมูลผู้เล่น
ระบบข้อมูลผู้เล่น permit data to be associat ข้อมูลกับผู้เล่นซึ่งอยู่ระหว่างเซสชันบันทึก ระบบนี้ให้การเลียนแบบจากลูกค้าไปยังเซิร์ฟเวอร์และชุดของ API ที่สามารถใช้เพื่อสอบถามข้
เช่น โดยไม่ต้องยิง UpdateCoins``Class.RemoteEvent เพื่อบอกให้ลูกค้าว่ามีเหรียญเท่าไหร่ คุณสามารถโทรต่อไปและให้ลูกค้าสมัครรับได้ผ่านกิจกรรม PlayerDataClient.updated
PlayerDataServer:setValue(player, "coins", 5)
แน่นอน นี่ใช้ได้เฉพาะกับการเลียนแบบระหว่างเซิร์ฟเวอร์และค่าที่คุณต้องการให้อยู่ระหว่างเซสชัน แต่นี่ใช้ได้กับจำนวนมากของกรณีในโครงการรวมถึง:
- สเตจ FTUE ปัจจุบัน
- คลังไอเท็ม
- จำนวนเหรียญที่ผู้เล่นมี
- สถานะของฟาร์มของผู้เล่น
การเลียนแบบโดยการใช้ลักษณะ
ในสถานการณ์ที่ต้องการให้เซิร์ฟเวอร์เลียนแบบค่าที่กำหนดเฉพาะให้กับลูกค้าที่เป็น Instance คุณสามารถใช้ คุณสมบัติ ได้ โรบ็อกจะเลียนแบบคุ
นี่เป็นประโยชน์อย่างมากสำหรับตัวอินสแตนซ์ที่ถูกสร้างขึ้นในระหว่างการประมวลผล เนื่องจากค่าตัวละครถูกติดตั้งในตัวอินสแตนซ์ใหม่ก่อนที่จะเป็นพ่อของร
คุณยังสามารถอ่านลักษณะลูกศรจากแผนผังของข้อมูลได้โดยตรงจากลูกค้าหรือเซิร์ฟเวอร์ด้วยวิธี GetAttribute() และสมัครรับการเ
การเลียนแบบผ่านแท็ก
CollectionService ช่วยให้คุณใช้ป้ายชื่อสตริงกับ Instance คุณสามารถใช้ป้ายชื่อนี้เพื่อจัดประเภทตัวอย่างและวาดรูปแบบนี้ไปยังลูกค้า
เช่นเดียวกับป้ายชื่อ CanPlant บนเซิร์ฟเวอร์จะถูกประยุกต์บนเซิร์ฟเวอร์เพื่อแสดงให้เห็นว่าโถแจกนั้นสามารถรับต้นไม้ได้
ส่งข้อความโดยตรงผ่านโมดูลเครือข่าย
สำหรับสถานการณ์ที่ไม่มีตัวเลือกก่อนหน้านี้ใช้งานได้ คุณสามารถใช้การโทรเครือข่ายผ่านโมดูล เครือข่าย ได้
พืช ใช้การโทรเครือข่ายโดยตรงสำหรับคำขอของลูกค้าที่หลากหลายรวมถึง:
- การรดน้ำต้นไม้
- การปลูกเมล็ด
- ไอเท็ม
ข้อเสียใจกับการใช้ปendekatanนี้คือต้องใช้การกำหนดค่าบางอย่างที่เฉพาะเจาะจงซึ่งอาจเพิ่มความซับซ้อนของโครงการ แม้ว่าจะได้รับการหลีกเลี่ยงไปยังที่มีประสิทธิภาพเป็นพิเศษสำหรับการสื่อสารระหว่างเซิร์ฟ
คลาสและ Singletons
คลาสในโครงการ พืช สามารถสร้างและทำลายได้ สถานะคลาสของมันสร้างขึ้นจากวิธีการประมวลผลแบบ idiomatic ของ Lua ด้วยการเปลี่ยนแปลงหลายอย่างเพื่อเปิดใช้งานการตรวจสอบข้
การเริ่มต้น
หลายคลาสในโครงการมีความสัมพันธ์กับหนึ่งหรือมากกว่า Instances วัตถุของคลาสที่กำหนดได้สร้างโดยวิธีการ new() ซึ่งเหมือนกับวิธีที่จุดมุ่งหมายถูกสร้างใ
รูปแบบนี้ใช้สำหรับวัตถุที่มีการแสดงผลทางกายภาพในรุ่นข้อมูล และวัตถ
ตอบสนองตามหมายเลข
เหมือนที่อธิบายไว้ข้างต้น, หลายคลาสในโครงการนี้มีรูปแบบข้อมูลที่เป็นตัวแทนของคลาสและได้รับการจัดการโดยมัน
โดยทั่วไปแล้วไม่เคยสร้างตัวอินสแตนซ์เหล่านี้เมื่อมีวัตถุ
การแต่งตั้ง
แม้ว่าจะสามารถใช้การมีสมบัติได้ใน Lua โดยใช้ metatables ได้ แต่โครงการเลือกที่จะอนุญาตให้คลาสขยายตัวกันผ่าน การแต่งตั้ง เมื่อผสานคลาสผ่าน
แอ็คชันCloseButton ซึ่งหุ้มคลุมคลาส Button คลาส
ทำความสะอาด
คล้ายกับวิธีการที่ Instance สามารถถูกทำลายด้วยวิธี Destroy() เมื่อคลาสที่สามารถเรียกได้สามารถ
บทบาทของวิธีการ destroy() คือการทำลายใด ๆ ของตัวอย่างที่สร้างขึ้นโดยวัตถุ, การเชื่อมต่อใด ๆ และโทร destroy() บนเด็กวัตถุ
ตัวเลือก
Singletons, ตามที่ชื่อแนะนำ, Roblox
singletons แตกต่างจากคลาสที่เป็นไปได้ด้วยความจริงที่ว่าพวกเขาไม่มีวิธี new() วิธี แทนที่จะเป็นวิธี ModuleScript โด
คำอธิบายประเภทที่เข้มงวด
Luau รองรับการพิมพ์แบบก้าวหน้าซึ่งหมายถึงว่าคุณสามารถเพิ่มคำอธิบายประเภทต่างๆ Robloxในโครงการนี้ strict ตรวจส
ระเบียบาทคลาส
วิธีการสร้างคลาสใน Lua ที่กำหนดไว้คือ อธิบายได้ดี อย่างไรก็ตามมันไม่เหมาะกับการพิมพ์ Luau มากนัก ใน Lua วิธีการง่ายที่สุดสำหรับการรับประเภทของคลาสคือวิธี Global.Rob
type ClassType = typeof(Class.new())
นี่เป็นการทำงาน แต่มันไม่มีประโยชน์เมื่อคลาสของคุณเริ่มด้วยค่าที่มีอยู่เฉพาะในตอนที่เรนเซ็ตเท่านั้น เช่น Player วัตถุ
เพื่อสนับสนุนความนิ่งของการใช้งานในระดับภาษา โครงการ พืช ใช้สร้างที่แก้ไขด้วยภาษา Lua ที่แตกต่างกันในหลายวิธีบางอย่างอาจรู้สึกไม่ชัดเจน:
- คำอธิบายของ self ถูกดัดผมซ้ำกันทั้งในประกาศชนิดและในผู้สร้าง นี่จะแสดงภาระการดูแลรักษา แต่คำเตือนจะปรากฏขึ้นหากความสอดคล้องกันของสองคำอธิบายล้มเหลว
- วิธีการคลาสจะประกาศด้วยดอทดังนั้น self จึงสามารถประกาศได้อย่างชัดเจนว่าเป็นของประเภท ClassType ได้ วิธีการยังสามารถเรียกด้วยคอลอนตามที่คาดไว้ได้
--! ข้อควรระวัง
local MyClass = {}
MyClass.__index = MyClass
export type ClassType = typeof(setmetatable(
{} :: {
property: number,
},
MyClass
))
function MyClass.new(property: number): ClassType
local self = {
property = property,
}
setmetatable(self, MyClass)
return self
end
function MyClass.addOne(self: ClassType)
self.property += 1
end
return MyClass
การแปลงรูปปั้นหลังล็อก
ในเวลาเขียน, ประเภทของค่าไม่ได้หดตัวหลังจากประกาศเงื่อนไขการรักษาความปลอดภัย ตัวอย่างเช่น, ตามคำแนะนำด้านล่าง, ประเภทของ optionalParameter ไม่ได้หดตัวเป็น number
--! ข้อควรระวัง
local function foo(optionalParameter: number?)
if not optionalParameter then
return
end
print(optionalParameter + 1)
end
เพื่อแก้ไขปัญหานี้ใหม่ตัวแปรจะถูกสร้างขึ้นหลังจากการป้อนชื่อของพวกเขาด้วยวิธีการแสดงผลอย่างชัดเจน
--! ข้อควรระวัง
local function foo(optionalParameter: number?)
if not optionalParameter then
return
end
local parameter = optionalParameter :: number
print(parameter + 1)
end
การเดินทางผ่าน DataModel Hierarchies
ในบางกรณีต้องใช้เวลานานเกินไปในการสแกนรุ่นข้อมูลของต้นไม้ของเอเจนต์ที่สร้างขึ้นในเวลาที่เร็วที่สุด นี่เป็นความท้าทายที่น่าสนใจสำหรับการตรวจสอบประเ
หนึ่งในการเข้าถึงความท้าทายนี้คือการโยนไปยัง any แล้วปรับแต่งใหม่ ตัวอย่างเช่น:
local function enableVendor(vendor: Model)
local zonePart: BasePart = (vendor :: any).ZonePart
end
ปัญหากับวิธีนี้คือมันส่งผลการอ่านได้ แทนที่นี้โครงการใช้โมดูลทั่วไปที่เรียกว่า getInstance สำหรับการสแกนรุ่นของข้อมูลที่มีการนำเสนอในระดับภายในที่เรียกว่า any
local function enableVendor(vendor: Model)
local zonePart: BasePart = getInstance(vendor, "ZonePart")
end
เมื่อเครื่องมือชนิดต่างๆ เข้าใจแนวข้อมูลเหล่านี้มากขึ้น ก็อาจไม่จำเป็นต้องมีลักษณะเช่นนี้อีกต่อไป
ระบบสาธารณูปโภค
พืช รวมถึงหลากหลายของ 2D ผู้ใช้งานอินเทอร์เฟซที่ซับซ้อนและง่าย สิ่งเหล่านี้รวมถึงไอเท็มที่ไม่ใช่ตัวโดยตรงเช่นตัวนับเหรียญและเมนูใช้งานติดต่อกันที่ซับซ้อนเช่นร้านค้า
การเข้าถึง UI
คุณสามารถเปรียบเทียบได้อย่างอิสระ Roblox UI กับ DOM ของ HTML เพราะมันเป็นระดับของวัตถุที่อธิบายสิ่งที่ผู้ใช้ควรเห็น การใช้ การประกาศ และ การประกาศ
ใกล้ชิด | ข้อดีและข้อเสีย |
---|---|
ความเป็นผู้ปกครอง | รหัส |
การประกาศ | ในการประกาศวิธีการ สถานะของตัวแทน UI จะประกาศอย่างชัดเจนและการใช |
พืช ใช้การใช้งาน ใช้งานในทางกลับกัน ภายใต้แนวคิดที่แสดงให้เห็นว่าการแปลงเป็นสิ่งที่มีประสิทธิภาพมากขึ้นในการจัดการ UI บน Roblox โดย
อาคารระดับสูง
ชั้นและส่วนประกอบ
ใน พืช ทั้งหมดรูปแบบ UI เป็น Layer หรือ Component
- Layer จะถูกอธิบายว่าเป็นกลุ่มระดับกลุ่มสูงสุดที่หุ้มชุด UI ที่กำหนดล่วงหน้าใน ReplicatedStorage อาจมีส่วนประกอบหลายอย่างหรืออาจเก็บรวบรวมล็อกอิค์ของตั
- Component เป็นส่วนประกอบ UI ที่ใช้ซ้ำได้ เมื่อวัตถุประกอบใหม่ถูกสร้างขึ้นมันจะเคลือนเทมเพลตจาก ReplicatedStorage โดยในตัวของมันอาจมีส่วนประกอบอื่น ตัวอย่างของส
ดูการจัดการ
ปัญหาการจัดการ UI ที่พบบ่อยคือการจัดการมุมมอง โครงการนี้มีหลายเมนูและรายการ HUD บางอย่างที่ฟังการป้อนข้อมูลของผู้ใช้และการจัดการอย่างระมัดระวังเมื่อพวกเขามองเห็นหรือเปิดใช้งานได้ต้องการการจัดก
พืช ใช้ปัญหานี้ด้วย UIHandler ระบบที่จัดการเมื่อชั้น UI ควรมองเห็นได้หรือไม่ ทุกชั้นในเกมจัดประเภทเป็น HUD หรือ 0> Menu0> และความโปร่งใสของพ
- สถานะที่เปิดใช้งานของ Menu และ HUD ชั้นสามารถเปิด/ปิดได้
- เฉพาะชั้น HUD เท่านั้นที่จะปรากฏหากไม่มีชั้น Menu เปิดใช้งาน
- เปิดใช้งาน Menu ชั้นถูกเก็บไว้ในสแต็คและมีเพียงชั้นเดียว Menu เท่านั้นที่ปรากฏในขณะนี้ เมื่อเปิดใช้งาน
วิธีนี้ใช้งานได้ง่ายเพราะช่วยให้ผู้ชายสามารถนำทางได้ด้วยประวัติ หากเปิดเมนูจากเมนูอื่น การปิดเมนูใหม่จะแสดงเมนูเก่าอีกครั้ง
UI ชั้นนอกลงทะเบียนตัวเองด้วย UIHandler และมีสัญญาณที่กระตุ้นเมื่อความโปร่งใสของมันควรเปลี่ยนแปลง
อ่านเพิ่มเติม
จากภาพรวมทั่วไปของโครงการ พืช คุณอาจต้องการสำรวจแนวคิดและหัวข้อที่เกี่ยวข้องต่อไป
- อีเวนต์รีโมทและคอลแบ็ค — ทุกอย่างเกี่ยวกับอีเวนต์รีโมทและคอลแบ็คสำหรับการสื่อสารระหว่างเครือข่ายลูกค้า-เซิร์ฟเวอร์
- UI — รายละเอียดเกี่ยวกับวัตถุผู้ใช้และการออกแบบใน Roblox