Hem temel oyun sistemlerini, hem de ana tasarım gereksinimlerinin herhangi bir hedefini desteklemek için aşağıdaki sistemleri kullandık.
KullanıcıYöneticisi
KullanıcıYöneticisi bir kavrama nesneyi bir şeye uygulamak için basit bir API sağladı, örneğin bir manav üzerine bir parça katmanlı giysi.Bu API'nin ana işlevi UseManager.AddUse (etiketler, hedef nesneler, mesafe, başarılı olma, hiçbir şey donatılmamış, yanlış donatılmış, ekstra veri) olup, bir dizi etiketi hedef nesnelerine bağlar.Bir oyuncu bir etiketle bir nesneye sahip olduğunda ve bir hedef nesneye tıkladığında, başarılı geri çağrılma işlevi çağrılır.Diğer çağrı işlevleri, bir oyuncuya bir tıklama yapılmadan veya yanlış bir öğe türüyle yapılmadan ekstra görsel bilgi göstermemize izin verdi.
Bir görev bitirildiğinde veya belirli bir öğe "kullanıldığında" genellikle yararlı olan "kullanım"ı UseManager.RemoveUse ile kaldırabiliriz.Ayrıca, AddUseTargets ve RemoveUseTargets ile hedefleri ekleyebilir veya kaldırabiliriz.
Vurgular
Bir oyuncu bir ilgi alanındaki bir öğeye yakın olduğunda, örneğin bir balina, o öğe çevresinden öne çıkmasını istedik.Bunu uygulamak için, oyuncunun etrafında dönen bir küre kullanan LocalScript adlı bir VurgulananÖğeler oluşturduk ve Touched ve TouchEnded etkinliklerine bağlandık.The getHighlight fonksiyonu, dokunulmuş bir meshe veya ebeveynleri kullanarak bir GetTaggedObjectUpHierarchy yardımcı işlevi ile birkaç etiket kontrol eder.Herhangi bir vurgunun gerekmediği durumda, bir NoHighlight etiketi kullanarak zorla kaldırabiliriz.Ancak, gerekli olsa da çeşitli diğer etiketlere uymuyorsa, bunu Önemli etiketi kullanarak zorlayabiliriz.
Bu LocalScript yeni bir motor özelliğini kullanır Highlight , bir nesnenin hatırlatıcısını çizer ve/veya nesnenin içini tanımlanmış bir renkle doldurur; bu özelliknasıl kullanılacağına ilişkin daha fazla bilgi için, Nesneleri Vurgulama bakın. Highlights ve fare imleci OnItemIndicator sistemleri birlikte çalışır, bu yüzden Highlights yalnızca bir meshevine vurgu ihtiyacı olup olmadığını belirlemez, ayrıca OnItemIndicator için bir mesh türü de sağlar.
HighlightItemsFunc diğer müşteri sistemleriyle iletişim kurmak için kullanılır.Örneğin, Etkinlik Yöneticisi bunu belirli kesintilerde bir Etkinleştir komutu kullanarak etkinleştirir veya devre dışı bırakır ve OnItemIndicator bir nesnenin türünü sorgulamak için kullanır.Bir öğe artık mevcut olmadığını tespit etmek için, örneğin bozuk bir oda yok edildiğinde, CollectionService.GetInstanceRemovedSignal 'ye bağlanırız.
Bilgi ve Düşünce Balonları
Lore ve Düşünce balonları 2 benzer sistemdir.Lore, çocuklarının boyutlandırma ve yeniden boyutlandırmasını kontrol etmek için bir ekran üzeri UI konteyneri olarak kullanır ve çocuklarının ve , ve Lore oyuncunun ekranda herhangi bir yere tıklayarak kaldırmasını bekler.Benzer şekilde, düşünce balonları bir çocuk BillboardGui ile yabancı nesnelere bir TextLabel kullanır ve belirli bir süre ve bekleme süresi boyunca ekranın tümünü almayan metin olmadan 3B uzayda diyalog görüntüler ve belirli bir süre ve bekleme süresi boyunca ekranın tümünü almayan metin olmadan 3B uzayda diyalog görüntüler.Bu sistemlerin arkasındaki tasarım hakkında daha fazla bilgi için, Lore ve Düşünce balonları görün.
Lore, LoreManger LocalScript.Tıklanır veya dokunurken, bir yardımcı işlev kullanarak bir ışın atışı ateş eder utils.RaycastAlongPointingDir ve bir OyuncuÇarpışmaGrubu grup.Bir tıklama altındaki veya ebeveynlerden birinin bir meshi Lore veya Düşünce balonu etiketine sahipse, arayüzü görüntüleriz.Metin, başlık ve görüntü, nesnedeki LoreText, LoreCaption ve LoreImage öznitelikleri tarafından tanımlanır.
Işını inşa etmek için Camera.ViewportPointToRay veya Camera.ScreenPointToRay kullandığımızı unutmayın, dokunulmadığında veya dokunulduğunda çağrıldığına bağlı olarak.Koordinatlar biraz farklı koordinat sistemlerinde bulunur.fareiçin, FareButon1 için onları Class.UserInputService.InputEnded``:Connect 'dan alıyoruz ve dokunma cihazları için onları Class.UserInputService.TouchTapInWorld``:Connect 'dan alıyoruz.
Düşünce balonları genel olarak benzerdir, bir meshe veya ebeveynlerinin bir Düşünce balonu etiketine sahip olup olmadığını kontrol etmek için bir ışın atışı kullanır.Ayrıca, düşünce metni özniteliğini metin için kullanır ve dünyada UI'yi konumlandırmak için kullanılan bir Düşünce balonu etiketi.Aynı pozisyonel nesneyi kullanan ancak farklı metin içeren düşünce balonlarının farklı bekleme süreleri vardır.
Özel durumlar
Lore'un birkaç özel durumu var, bunlardan biri bozulmuş balinalar.Bir oyuncu bozuk bir mühürü tıkladığında, bilgi arayüzü görüntülenir ve bir görev başlatmak için bir tıklama bekler, bu da oyun akışını etkiler.Bu, bağlanabilir ile lore UI'sini talep etmek için kullanılan tarafından ele alınır.Lore'un oyuncu tarafından "susatıldığı" zamanı bildirmek için Lore sistemine bir geri arama sağlanır GameStateClient oyuncu tarafından.Başka bir özel durum, Düşünce balonları ve Lore etiketlerinin aynı nesneye sahip olduğu durumdur.Bu durumda, bilgi ve düşünce balonu metninin örtüşmesini önlemek için, bilgi balonunu kapatıldıktan sonra düşünce balonunu çalıştırıyoruz. LoreManager ayrıca oyuncu odanın kilidini alana kadar devre dışı bırakılan kapılara tıklarken küçük bir sahne göstererek özel bir durumu ele alır.
OnItemIndicator nesnesi
Oyuncu belirli ilgi alanlarına baktığında ekranın merkezinde farklı simgeler göstermek istiyoruz.Müşteri kodu OnItemindicator , kamerada bir ışın atar ve sonuçları analiz eder.Sonuçlara dayanarak, OnItemIndicator2 ScreenGui 'de bir görüntü ayarlar.
İlgili herhangi bir öğe vurulmadığında, varsayılan simge küçük bir noktadır.Herhangi bir simgeyi belirli bir çerçeveye ekleyerek OnItemIndicator dize özniteliğini kullanarak onItemIndicatorImages , Hand, Eye veya DoorCurrentlyLocked gibi isimleri kullanarak belirleyebiliriz.Özellik yalnızca nadir durumlarda gereklidir ve çoğu zaman mevcut diğer etiketler veya sistemler ikon türünü sağlar.Daha fazla ayrıntı için Update işlevine bakın.
Bazı tür kontroller öncelikli bir sırayla yapılır.OnItemIndicator geçersizleştirmesinden sonra, "el" simgesi için kavranabilir veya çekme dolabı olup olmadığını utils.CanGrabModel(model) veya utils.GetTaggedObjectUpHierarchy("Drawer2", model) aracılığıyla kontrol ederiz.Bundan sonra, vurgu durumunu, öğe türlerini ve hangi simgeyi kullanacağını belirleyen HighlightManager çağırıyoruz.Örneğin:
highlightItemsFunc:Invoke({"GetType", curInst})
Lore ve Düşünce Balonu etiketleri daha sonra etiketleri kontrol ederek kontrol edilir.Kapılar için, 2 farklı simgeye sahibiz: KapıŞuAndaKapalı ve KapıHerZamanKilitli . DoorManager kapıların açılabilir veya kapatılabileceği doğru veya yanlış DoorEnabled özniteliğini ayarlar ve özniteliğin varlığını ve değerini kullanırız.Kapı gibi görünen ancak açılmayan nesnelerin Kapı Kilitli etiketi vardır.
KapıYöneticisi
Kapı Yöneticisi bir Kapı Etiketi ve Kapıların açılmasını ve kapanmasını yönetmek için kullanır.Kapı, dokunarak ve touchEnded dokunarak bağlandığımız ön ve arka taraf tetiklerine sahiptir.Önden ve arkadan bir kapıyı açmak ve kapatmak için gençler yarattık.Biz bir oyuncularYakın haritasını koruyoruz (oyuncuların tetiklere dokunması, ön ve arka taraf için ayrı ayrı.
Her kapının basit bir durum sistemi vardır, DoorState (Kapalı, Açılıyor, Açılıyor, Kapanıyor), geçişler için kullanılan gençlerle.Bir kapının dış sistemlerden açılmasını veya kapanmasını etkinleştirebilir veya devre dışı bırakabiliriz, bunun için DoorManager.EnableDoor 'yi arayarak bir DoorEnabled özniteliği ayarlayabiliriz.
Uzman Animatör
The MasterAnimator LocalScript animasyonlu görüntüler oynar (tekstür atlası), TV ekranlarını animasyonlaştırmak için kullandığımız.Resimleri gezinmek için, bir dizi parametre bilmemiz gerekiyordu: satır ve sütun sayısı, toplam çerçeve, periyotlar, görüntü boyutları ve bir dizi görüntü ID'si.Sistem, çapraz olarak birden fazla görüntü animasyonu yapmamıza izin verdi, her biri muhtemelen altgörüntülerin sütunlarına ve kolonlarına bölündü.Bu verileri öznitelikler veya değerler aracılığıyla sağlayabiliriz, ancak bu deneyimde yardımcı kodlar kullandık.UpdateImageAnimations(dT) zaman ve parametreleri kullanarak göstermemiz gereken görüntü veya altgörüntüyü hesaplar.Yeni bir görüntüye geçmemiz gerekiyorsa, Görüntüyü ayarladık.Herhangi bir alt görüntüyü değiştirmemiz gerekiyorsa, ImageRectOffset ayarlarız.
Animasyonlu bir SurfaceGui özniteliği olan bir nesne, ana hedefi tüm parametleri döndüren bir ModuleScript fonksiyonu sağlamak olan bir Animatör Animator.GetParams 'a sahip olurdu.Bu, İmajAnimasyonu etiketini ve böyle nesneleri toplamak ve Animatörü bulmak için altında bulunan Animatörü bulmak için kullanan MasterAnimatör'e yardımcı olur.Ardından Animatör ModuleScript gerektirmek için pcall'u kullanır ve üzerinde çağrır GetParams .
Yerel Alan Animasyonları
The Yerel Alan Animasyonları LocalScript bir Yerel Alan Rotasyonu etiketi kullanarak çoğunlukla "kozmetik" nesneleri belirli bir dönme hızı ve X, Y veya Z ekseninde gecikme ile döndürür.Oyuncuların etkileşime giremeyeceği uzak nesneler için veya çok fazla simülasyona etki etmeyen daha küçük nesneler için bunu kullandık. , ve değerleri aracılığıyla tanımlanan parametler.Uygulama ayrıntıları için, Dönen Bulut Örüntüleri görün.
Başlık Lambası Yöneticisi
The Başlık Lambası Yöneticisi kullanıcılar kafalarının üzerindeki spot ışığını açık veya kapalı geçiştirmek için ekranda seçtiğinde, HeadlampEvent kullanarak sunucuya yorumlar gönderir ve kapağı açıp kapatma sesleri geçer.Bir karakter eklenir veya onların ı değiştirilirse, fonksiyonu ışık başlığı şablonunu klonlar ve YüzÖnBağlantıdanBazıOfsetlerVeDöndürmelerKullanarak ışığı konumlandırır.
Koltuk Yöneticisi
Oyuncuların bir nesneye oturabilecekleri yakınında otomatik olarak oturmasını istemiyoruz.Bunun yerine, kullanıcıların oturmak için bir koltuğun yakınında tıklamalarını istiyoruz. KoltukYöneticisi betiği bir Koltuk etiketine dayanarak ekler ve tıklanınca çağrır.Oyuncuları bir odanın normal ve yozlaşmış durumları arasında ışınladığımızda, oyuncuların oturmasına izin veremeyiz çünkü CFrame koordinat değişikliği çalışmayacak, bu yüzden SeatManager ışınlanbirkaç saniye önce ve sonra oturmayı devre dışı bırakacak veya etkinleştirecek bir işlevselliğe sahip olmayacaktır.
DrawerManager Yöneticisi
Çekmece Yöneticisi betiği bir Çekmece2 etiketi ve kullanarak çekmeleri açmak veya kapatmak için tıklamayı ele alır ve herhangi bir eşdeğer ses çalar.Açma ve kapatma eylemi, PrismaticConstraint için HedefPozisyonu ayarlayarak yapılır.
Öldürme Hacimleri
Ana oyun alanının birkaç alanında, elektrik kıvılcımları ve evin başlangıcına yakın su gibi, bir oyuncu Humanoid.Health seviyesini 0 aldığında, bir oyuncunun Öldürme Hacmi etiketi ile gireceği bir hacimde ayarlarını değiştirebilir. Öldürme Hacimleri betiği, bir oyuncunun bir hacime girdiğini belirlemek için Touched:Connect kullanır ve ardından sağlığını 0 azaltır.
Oyuncu Görevi Yeniden Doğma
Oyuncu Görevinin Yeniden Doğması scripti bir RespawnVolume etiketi ve dokunulduğunda oyuncuların yeniden doğmasını sağlayan hacimleri ele almak için kullanır.Bu hacimleri, çok sayıda görevin boşluklarına veya oyuncunun düşebileceği hareketli platformlara sahip olduğu için, yozlaşmış odalara yerleştirdik.Dokunulduğunda, senaryo küçük bir Işınlanma_Zıplama sahne oynar ve GameStateFunc komutuyla çağrır GameEvents.PlayerRespawn.
GameEvents.PlayerRespawn işlemi sırasında, senaryo bunu sağlarsa RespawnPositions kullanabilir, eğer görev yapılandırması bunu sağlıyorsa.Aksi takdirde, özel görev için TeleportPositions kullanır.Bir "kontrol noktası" sistemimiz yok, bu yüzden sadece oyuncunun yeniden doğduğu yerden en yakın Respawn veya Teleport noktalarını seçiyor, tek dikey, "2D" mesafe kullanarak.
Küçük yardımcı sistemler
PiyanoYöneticisi
The PiyanoYöneticisi scripti bir Piyano etiketi ve CollectionService ekleyerek ClickDetectors ve klavye üzerinde tıklanınca bir piyano sesi çalar ekler.
RitüelDestek
Oyuncuların mühür yerleştirdiği koridorda, her bir mühür yerleştirildiğinde değişen karmaşık bir yapı vardır.Örneğin, yerleştirilen kaplumbağa sayısına bağlı olarak, belirli olaylar ışıkları ve ışınları etkinleştirmek/devre dışı bırakmak, belirli nesnelerin transparansını değiştirmek vb. için oynar.The RitualSupport ModuleScript is a small wrapper over EventManager:Invoke calls for those events, providing parameters to the event, such as what "root object" to play it on, depending upon what specific seal was placed.
Yeniden Yaratılabilir Yönetici
Bazı tutulabilir nesneler oynanışiçin önemlidir, örneğin filler, ve bir oyuncu onları bir yere bırakırsa kaybolmalarını istemedik.Bir nesnenin Geri Yüklenebilir etiketine sahip olması durumunda, Geri YüklenebilirYönetici kodu, sisteme eklenirken dönüşümünü hatırlar.Bir oyuncu böyle bir nesneyi bıraktığında, yakalama sistemi çağrır restorableManager.StartTracking .Eşya beş saniye içinde tekrar alınmazsa, Geri Yüklenebilir Yönetici kodu onu orijinal dönüşüme yerleştirir ve izleme süresini sıfırlar.
Portallar
Birkaç görevde, oyuncuları dönen bir platformdan düşen oyuncuları yeniden canlandıranlar gibi kısa bir mesafe içinde ışınladık.Bu tür bir ışınlanmayı kurmayı basitleştirmek için, senaryoda "Portallar" olarak adlandırdığımız bir yardımcı işlev ProcessPortal DemoUtils kullanılır.Örneğin, P1 başlangıç tetikleyici tanımlayan parça ise ve P2 hedef oyuncu dönüşümünü tanımlayan parça ise, aşağıdaki kod parçacığı bu portal işlevini tanımlayabilir:
P1.Touched:Connect(function(otherPart) utils.ProcessPortal(otherPart, P2) end)
İşlem Portalı diğerParçanın bir insan olup olmadığını kontrol eder, oyuncuyu bir CFrame koordinat değişikliği aracılığıyla teleport eder ve Teleport_Jump etkinliğini kullanarak geçişi gizlemek için küçük bir sahne çağırır Etkinlik Yöneticisi .
Yapılandırma senaryoları
Birkaç yapılandırma, veri tanımı ve ortak işlevsellik kılavuzumuz var: DemoConfig . Görev tanımları. Oyun durumları için enumerasyonlar, istemci-sunucu iletişimi için olaylar. DemoGlobalSettings .Bir dünyagelişiriz, ancak diğerlerinde serbest bırakırız (ve oynatırız).Komut, placeID'yi kontrol eder ve çeşitli hileleri ve hata ayıklama işlevini etkinleştirir/devre dışı bırakır. DemoUtils .Çeşitli yarar işlevleri.Dönüşümlerle başa çıkmak.Görünürlüğü ayarlama, sabitlenmiş veya diğer özellikler.Bir kutuda bir nokta kontrol ediliyor.Dalgalı isimle hiyerarşide nesneler bulmak.Modelerleri geçici olarak "uzak bir yere" taşımak ve daha sonra geri getirmek için kullanılabilecek TempStorage yönetimi ().Tıklama dedektör yardımcılarına tıklayın.Destek alınıyor.Etiketlerin kontrolü için destek (özellikle hiyerarşide).Tetikleyicileri Etkinlik Yöneticisine bağlama. Ses Araçları . Bir dizi ağırlıklı rastgele ses çalmak için birkaç işlev. Yakalama Kullanıcısı . Yakalama için yardımcı işlevler.