โครงการอ้างอิงพืช

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

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

Plant project banner

โครงการนี้มุ่งเน้นไปที่กรณีใช้งานทั่วไปที่คุณอาจพบในขณะที่พัฒนาประสบการณ์บน Roblox โดยทั่วไป คุณจะพบโน้ตเกี่ยวกับความแตกต่างระหว่างการตัดสินใจที่ดีที่สุดสำหรับประสบการณ์ของคุณเอ

รับไฟล์

  1. ไปที่หน้าประสบการณ์ Plant
  2. คลิกปุ่ม และ แก้ไขในสตูดิโอ

ใช้กรณี

พืช ครอบคลุมการใช้งานต่อไปนี้:

  • ข้อมูลเซสชันและข้อมูลผู้เล่นคงอยู่
  • การจัดการมุมมอง UI
  • เครือข่ายคลาวด์
  • ประสบการณ์ผู้ใช้ครั้งแรก (FTUE)
  • การซื้อเงินทุนที่แข็งแกร่งและเงินทุนที่นุ่มนวล

นอกจากนี้โครงการนี้แก้ปัญหาชุดแคบของปัญหาที่ใช้ได้กับหลายประสบการณ์ รวมถึง:

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

โปรดทราบว่ามีกรณีการใช้งานหลายรายการในประสบการณ์นี้ที่เล็กเกินไป แนวคิดเกินไป หรือไม่แสดงให้เห็นว่ามีวิธีแก้ปัญหาสำหรับการออกแบบที่น่าสนใจ; สิ่งเหล่านี้ไม่ได้รับการรองรับ

โครงสร้างโครงการ

การตัดสินใจครั้งแรกเมื่อสร้างประสบการณ์คือการตัดสินใจว่าจะสร้างโครงสร้าง โครงการ ในลักษณะใด ซึ่งรวมถึงสถานที่ที่จะวางตำแหน่งรายการที่เฉพาะใน รหัสและวิธีการจัดระเบ

แบบข้อมูล

ตารางต่อไปนี้อธิบายว่าบริการคอนเทนเนอร์ในตัวอย่างข้อมูลรุ่นของข้อมูลจะถูกวางใน

บริการประเภทของ Instances
Workspace

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

Lighting

ผลกระทบทางบรรยากาศและแสงสว่าง.

ReplicatedFirst

มีลักษณะลูกโดยสารที่เล็กที่สุดที่จำเป็นสำหรับหน้าจอการโหลดและการเริ่มต้นเกม ยิ่งมีลักษณะลูกโดยสารที่วางใน Class.ReplicatedFirst มากเท่าไหร่ ก็จะยิ่งทำให้รอนานขึ

  • ในโฟลเดอร์ ตัวอย่าง มี GUI หน้าจอการโหลด. > ในโฟลเดอร์ ที่เริ่มต้น มีรหัส GUI แล
ReplicatedStorage

ใช้เป็นคอนเทนเนอร์การเก็บข้อมูลสำหรับทุกตัวอย่างที่จำเป็นต้องเข้าถึงทั้งในลูกค้าและเซิร์ฟเวอร์.

ใน คลังขึ้นอยู่ ฟอลเดอร์มีบางห้องสมุดของบุคคลที่สามที่ใช้โดยโครงก

ServerScriptService

มี Script ที่ทำหน้าที่เป็นจุดเข้าถึงสำหรับทุกโค้ดด้านเซิร์ฟเวอร์ในโครงการ.

ServerStorage

ใช้เป็นคอนเทนเนอร์เก็บข้อมูลสำหรับทุกรุ่นที่ไม่จำเป็นต้องเคลื่อนย้ายไปยังลูกค้า.

  • ในไดเร็กทอรี ตัวอย่าง มีแบบฟอร์ม ฟาร์ม ตัวอย่าง คัดลอกจากนี้จะถูกวางใน 0> Class.Workspace0> เมื
SoundService

มีวัตถุ Sound ที่ใช้สำหรับเอฟเฟ็กต์เสียงในเกม ภายใต้ SoundService วัตถุเหล่านี้ไม่มีตําแหน่งและไม่ได้จําลองในพื้นที่ 3D

แต้มการเข้า

โค้ดส่วนใหญ่จะจัดรหัสอยู่ใน ModuleScripts ที่สามารถนำเข้าได้ท

สำหรับเกม Plant ไมโครเกม การใช้ LocalScript ที่เป็นจุดเริ่มต้นสำหรับรหัสลูกค้าทั้งหมด และ Script ที่เป็นจุดเริ่มต้นสำหรับรห

รายการต่อไปนี้อธิบายความสัมพันธ์ของทั้งสองวิธี:

  • เว็บไซต์ Script และเว็บไซต์ LocalScript ตรงกัน
  • การควบคุมมากขึ้นเกี่ยวกับลำดับที่ซอฟต์แวร์ต่างๆ เริ่มต้นเพราะทุกโค้ดได้รับการเริ่มต้นจากสคริปเดียว
  • สามารถส่งตัวอุปกรณ์ได้โดยอ้างอิงระหว่างระบบ

สถาปัตยกรรมระดับสูง

ระบบระดับสูงสุดในโครงการได้รับการอธิบายด้านล่าง บางระบบมีความซับซ้อนมากกว่าระบบอื่น ๆ Class

Plant project systems architecture diagram

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

เซิร์ฟเวอร์

ระบบต่อไปนี้เกี่ยวข้องกับเซิร์ฟเวอร์

ระบบคำอธิบาย
เครือข่าย
  • สร้าง all RemoteEvent และ RemoteFunction รินสถานะตัวอย่าง. > 0> เปิดเผยวิธีการส่งและฟังข้อความจากลูกค้า. 0> >0>
PlayerDataServer เซิร์ฟเวอร์

บันทึกและโหลดข้อมูลผู้เล่นที่คงที่โดยใช้ Class.DataStoreService . เก็บข้อมูลผู้เล่นในหน่วยความจำและวาดลายสัญลักษณ์บนคลายันต

ตลาด
  • จัดการธุรกรรมเงินเครื่องมืออ่อนจากลูกค้า。
  • เปิดเผยวิธีการขายพืชที่เก็บเกี่ยวได้。 >
CollisionGroupManager รุ่น
  • กำหนดโมเดลตัวละครผู้เล่นให้กับ กลุ่มความสามัคคี นั้น.
  • กำหนดกลุ่มความสามัคคีให้กับตัวละครผู้เล่นไม่สามารถสามัคกับรถพ่วงพืชได้. >
FarmManagerServer
  • สร้างรุ่นฟาร์มของผู้เล่นอีกครั้งจากข้อมูลผู้เล่นเมื่อพวกเขาเข้าร่วมเกม。 > ลบรุ่นฟ
กระเป๋าผู้เล่น
  • สร้างวัตถุต่างๆ ที่เกี่ยวข้องกับอายุการใช้งานของผู้เล่นและให้วิธีการเก็บกู้เหล่านี้.
เล่น TagPlayers
  • เพิ่ม CollectionService แท็กให้กับวัตถุผู้เล่นและตัวละครทั้งหมด.
FtueManagerServer เซิร์ฟเวอร์
  • ในระหว่าง FTUE ให้สำเร็จแต่ละสเตจและรอให้สำเร็จ.
CharacterSpawner
  • เรียกตัวละครใหม่เมื่อพวกเขาตาย หมายเหตุว่า Players.CharacterAutoLoads ถูกปิดใช้งานจึงทำให้การเรียกตัวละครถูกระงับจนกว่าข้อมูลของผู้เล่นจะโหลด

ลูกค้า

ระบบต่อไปนี้เกี่ยวข้องกับลูกค้า

ระบบคำอธิบาย
เครือข่าย

รอให้เซิร์ฟเวอร์สร้างตัวอักษรทั้งหมด Class.RemoteEvent และ Class.RemoteFunction

PlayerDataClient

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

ตลาด客戶端
  • สกุลเงิน.
การเดินทางท้องถิ่นของฉันจัดการผู้จัดการ

เปิดเผยวิธีการที่จะปรับปรุง Class.Humanoid.WalkSpeed|WalkSpeed หรือ Class.Humanoid.JumpHeight|JumpHeight ของตัวละครผ่านตัวคูณเพื่อหลีกเลี่ยงความขัดแย้งเมื่อปรับปรุงค่าเหล่า

FarmManagerClient

ฟังสำหรับเฉพาะป้ายชื่อ Class.CollectionService ที่ถูกใช้ในตัวแทนและสร้าง "การกระทํา" ที่แนบมาให้กับตัวแทนเหล่านี้ ส่วน "กา

UI การตั้งค่า

เริ่มต้นระดับ UI ทั้งหมดให้เห็นได้ในส่วนต่างๆ ของเกมโลกของเกม. เริ่มต้นระดับกล้องพิเศษสำหรับเมนูเมื่อเปิดใช้งานเมนู เริ่มต้นระดับการ

FtueManagerClient
  • กำหนดสเตจ FTUE บนลูกค้า.
การวิ่งตัวละคร
  • ใช้ LocalWalkJumpManager เพื่อเพิ่ม WalkSpeed เมื่อตัวละครผู้เล่นอยู่นอกฟาร์มของพวกเขา. >

การสื่อสารระหว่างลูกค้าและเซิร์ฟเวอร์

ประสบการณ์ 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 โดย

อาคารระดับสูง

Plant project UI architecture diagram

ชั้นและส่วนประกอบ

ใน พืช ทั้งหมดรูปแบบ UI เป็น Layer หรือ Component

  • Layer จะถูกอธิบายว่าเป็นกลุ่มระดับกลุ่มสูงสุดที่หุ้มชุด UI ที่กำหนดล่วงหน้าใน ReplicatedStorage อาจมีส่วนประกอบหลายอย่างหรืออาจเก็บรวบรวมล็อกอิค์ของตั
  • Component เป็นส่วนประกอบ UI ที่ใช้ซ้ำได้ เมื่อวัตถุประกอบใหม่ถูกสร้างขึ้นมันจะเคลือนเทมเพลตจาก ReplicatedStorage โดยในตัวของมันอาจมีส่วนประกอบอื่น ตัวอย่างของส

ดูการจัดการ

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

พืช ใช้ปัญหานี้ด้วย UIHandler ระบบที่จัดการเมื่อชั้น UI ควรมองเห็นได้หรือไม่ ทุกชั้นในเกมจัดประเภทเป็น HUD หรือ 0> Menu0> และความโปร่งใสของพ

  • สถานะที่เปิดใช้งานของ Menu และ HUD ชั้นสามารถเปิด/ปิดได้
  • เฉพาะชั้น HUD เท่านั้นที่จะปรากฏหากไม่มีชั้น Menu เปิดใช้งาน
  • เปิดใช้งาน Menu ชั้นถูกเก็บไว้ในสแต็คและมีเพียงชั้นเดียว Menu เท่านั้นที่ปรากฏในขณะนี้ เมื่อเปิดใช้งาน

วิธีนี้ใช้งานได้ง่ายเพราะช่วยให้ผู้ชายสามารถนำทางได้ด้วยประวัติ หากเปิดเมนูจากเมนูอื่น การปิดเมนูใหม่จะแสดงเมนูเก่าอีกครั้ง

UI ชั้นนอกลงทะเบียนตัวเองด้วย UIHandler และมีสัญญาณที่กระตุ้นเมื่อความโปร่งใสของมันควรเปลี่ยนแปลง

อ่านเพิ่มเติม

จากภาพรวมทั่วไปของโครงการ พืช คุณอาจต้องการสำรวจแนวคิดและหัวข้อที่เกี่ยวข้องต่อไป