leonscottkfm

Unreal MVP
31 May 2015
1,491
5
213
63
28
(34) İstanbul Avrupa
store.steampowered.com
Evet bilgili arkadaşları içeri davet ediyorum. Benim bilgi burada bitti gibi. Fakat ben açıklama yapınca siz anlayacaksınız.
Gerek uygulamalar gerek bazı oyunlar olsun arkada çalışan servisler barındırırlar.
Örneğin GTA gibi bir oyun düşünelim FIVEM mesela. Arkada banksystem var. Bu banksystem fiziksel bir şey değil. Fakat bir banka servisi arkada çalışıyor. Ya da mülk edinme sistemi gibi sistemler. Fakat bunlar doğrudan haritada script olarak çalışmıyor.
Mesela Unrealde mülk sistemi yapmak istesek bir BP kodlayıp haritaya mı atmalıyız? Mülk sistemim fiziksel olmak zorunda değil. PropertySystem diye bir şey kodlayıp bunu arkada çalıştıramaz mıyız?
Chat GPT nin söylediğine göre bunlara subsystem deniyormuş. GameInstanceye bağlı olarak çalışan alt Instanceler olarak geçiyormuş. Fakat ben böyle bir şeye ulaşamadım motor içerisinde.
Mesela meslek sistemi yapacağız diyelim. Property System , Bank System vs uzar gider. Tüm bu sistemler için BP ler kodlayıp haritaya mı atmak gerekiyor?
Bu sistemi PlayerPawnda yapamazsın. PlayerController de yapılmaz, PlayerState de yapılmaz, GameModede de yapılmaz. Nerede yapacağız? Bunlar farklı farklı modular sistemler çünkü servis olarak çalışmaları gerekiyor.
Tek bir GameInstanceye de bu kadar şey yığamayız. Farklı levellerde de çalışmaları gerekebilir. Örneğin oyuncu farklı bir moda farklı haritada giriş yapar fakat bank system o an devam etmek zorunda.

Dediğim şeyi tam anlatamamış olabilirim. Fakat anlarsınız diye düşünüyorum.
Mesela gün/zaman döngüsü de bir subsystemdir. Böyle global sistemler var. Fakat bunlar ne sıradan haritaya atılan BP ne de başka yerlere yazılabiliyor.

Mesela elimde banksystem_BP bulunacak fakat bu haritada olmayacak global çalışacak. Oyuncunun parasına sürekli faiz ekleyecek mesela örnek veriyorum. Oyuncu hangi atm objesinden erişirse erişsin bu servisle iletişim kurabilecek. Fakat bu servis asla bir dünyada bulunan bp olmayacak.
Yani dışarıdan external bir bp ile işlem yapılacak.
GameInstance gibi düşünebiliriz bunu. GameInstance dünyada yok oyun boyunca çalışan bir şey. Harita değişse bile veri tutar. BankSystemi de GameInstanceden türetilmiş alt dal gibi bir servis içerisinde bulunmalı. Bunu nasıl yaparız? Yani o bir actör olmayacak. Arkada çalışan bir servis olacak.

Mesela en basitinden bir vergi kuralı yazacağız diyelim. Tüm ürünlerin vergi çarpanı subsystemdeki vergi miktarına göre ayarlanıyor. Fakat bunu ayarlayan sistem haritada bulunan bir aktör değil. Dolayısıyla ben o çarpanı artırdıgımda şak diye her şeyin fiyatı fırlayacak.
Manager yani aslında. Kural belirleyici sistem.

Tüm araçların yenilenme olayı denilen bir şey yapalım mesela. Her araç 10 dakikada bir spawn noktasına geri dönsün ve sıfırlansın. Yol ortasında bırakılan araç park yerinde yeniden spawn olsun diyelim. Bu kod nereye yazılır? Hiçbir yere. Gamemodeye yazsan ben modu değiştirmek isteyebilirim. Oyuncuyla alakası olmadığından PC ya da playerstateye de yazılamaz. GameInstanceye yazsak mantılı olur fakat o da çok şişer. Oyun ayarları vs bir ton şeyi oraya mı yazacağız?

Subsystem lazım işte böyle şeyler için. Mesela GameInstanceden türetilmiş bir alt sınıf subsystem içine yazsak. Desek ki arkada 5 dakika say sonra tüm araçlara mesaj gönder. Tüm araçlara yenilenmesi gerektiğini iletir ve hepsi kendini yeniler. Fakat işte bunu nerede yapacağız? Bu tip sistemler için BP yazıp haritaya mı atacağız hepsini? Saçmalıktan ibaret olurdu. Sistem bunlar çünkü bir aktör değiller. Başka haritaya geçtiğimde ne olacak? Oraya da mı atacağız tek tek.
Olayın Plugin yazmak ile alakası yok bu arada. O bambaşka bir olay.

Böyle bir sistem de hata verme riski de çok düşüyor. Subsystem olursa. Tak çıkar gibi bir şeye dönüşüyor. Varsa çalışır yoksa çalışmaz.
Ben araştırdım C++ için GameInstanceSubsystem diye bir şey var. Main Game Instancene alt küme olan GameInstanceler bağlıyorsun subsystem şeklinde. Init oluyorlar ve ona göre aksiyon alınıyor. Fakat BP için böyle bir şey bulamadım.

Mesela oyun içi hile izleme sistemi yapmaya çalışsak bu da bir subsystem. Haritada bulunan bir aktör olamaz böyle bir şey. GameModede de bulunamaz çünkü oyun modu değişebilir. GameInstancede bulunabilir. Tüm oyun boyu izler ana menüde bile işlem uygulanabilir mesela oyuna girmesi engellenebilir. Makine banlanır GameInstancede makine okunabilir.
Ya çok önerilmez ama örnek veriyorum işte. Global merkezi sistemlerde BP yapıp haritaya atmakla iş çözülmüyor. Sürekli servis gibi arkada çalışan sistemler yapmak için bir çözüm arıyorum sadece.

Örnek vermek gerekirse : Faction/Wanted Level hesaplama/Reputation ve clanlar gibi şeyler.
Böyle şeyler GameState de barınabilir aslında. Fakat yine de olayın local kısımları var.
 
Son düzenleme:
Evet bilgili arkadaşları içeri davet ediyorum. Benim bilgi burada bitti gibi. Fakat ben açıklama yapınca siz anlayacaksınız.
Gerek uygulamalar gerek bazı oyunlar olsun arkada çalışan servisler barındırırlar.
Örneğin GTA gibi bir oyun düşünelim FIVEM mesela. Arkada banksystem var. Bu banksystem fiziksel bir şey değil. Fakat bir banka servisi arkada çalışıyor. Ya da mülk edinme sistemi gibi sistemler. Fakat bunlar doğrudan haritada script olarak çalışmıyor.
Mesela Unrealde mülk sistemi yapmak istesek bir BP kodlayıp haritaya mı atmalıyız? Mülk sistemim fiziksel olmak zorunda değil. PropertySystem diye bir şey kodlayıp bunu arkada çalıştıramaz mıyız?
Chat GPT nin söylediğine göre bunlara subsystem deniyormuş. GameInstanceye bağlı olarak çalışan alt Instanceler olarak geçiyormuş. Fakat ben böyle bir şeye ulaşamadım motor içerisinde.
Mesela meslek sistemi yapacağız diyelim. Property System , Bank System vs uzar gider. Tüm bu sistemler için BP ler kodlayıp haritaya mı atmak gerekiyor?
Bu sistemi PlayerPawnda yapamazsın. PlayerController de yapılmaz, PlayerState de yapılmaz, GameModede de yapılmaz. Nerede yapacağız? Bunlar farklı farklı modular sistemler çünkü servis olarak çalışmaları gerekiyor.
Tek bir GameInstanceye de bu kadar şey yığamayız. Farklı levellerde de çalışmaları gerekebilir. Örneğin oyuncu farklı bir moda farklı haritada giriş yapar fakat bank system o an devam etmek zorunda.

Dediğim şeyi tam anlatamamış olabilirim. Fakat anlarsınız diye düşünüyorum.
Mesela gün/zaman döngüsü de bir subsystemdir. Böyle global sistemler var. Fakat bunlar ne sıradan haritaya atılan BP ne de başka yerlere yazılabiliyor.

Mesela elimde banksystem_BP bulunacak fakat bu haritada olmayacak global çalışacak. Oyuncunun parasına sürekli faiz ekleyecek mesela örnek veriyorum. Oyuncu hangi atm objesinden erişirse erişsin bu servisle iletişim kurabilecek. Fakat bu servis asla bir dünyada bulunan bp olmayacak.
Yani dışarıdan external bir bp ile işlem yapılacak.
GameInstance gibi düşünebiliriz bunu. GameInstance dünyada yok oyun boyunca çalışan bir şey. Harita değişse bile veri tutar. BankSystemi de GameInstanceden türetilmiş alt dal gibi bir servis içerisinde bulunmalı. Bunu nasıl yaparız? Yani o bir actör olmayacak. Arkada çalışan bir servis olacak.

Mesela en basitinden bir vergi kuralı yazacağız diyelim. Tüm ürünlerin vergi çarpanı subsystemdeki vergi miktarına göre ayarlanıyor. Fakat bunu ayarlayan sistem haritada bulunan bir aktör değil. Dolayısıyla ben o çarpanı artırdıgımda şak diye her şeyin fiyatı fırlayacak.
Manager yani aslında. Kural belirleyici sistem.

Tüm araçların yenilenme olayı denilen bir şey yapalım mesela. Her araç 10 dakikada bir spawn noktasına geri dönsün ve sıfırlansın. Yol ortasında bırakılan araç park yerinde yeniden spawn olsun diyelim. Bu kod nereye yazılır? Hiçbir yere. Gamemodeye yazsan ben modu değiştirmek isteyebilirim. Oyuncuyla alakası olmadığından PC ya da playerstateye de yazılamaz. GameInstanceye yazsak mantılı olur fakat o da çok şişer. Oyun ayarları vs bir ton şeyi oraya mı yazacağız?

Subsystem lazım işte böyle şeyler için. Mesela GameInstanceden türetilmiş bir alt sınıf subsystem içine yazsak. Desek ki arkada 5 dakika say sonra tüm araçlara mesaj gönder. Tüm araçlara yenilenmesi gerektiğini iletir ve hepsi kendini yeniler. Fakat işte bunu nerede yapacağız? Bu tip sistemler için BP yazıp haritaya mı atacağız hepsini? Saçmalıktan ibaret olurdu. Sistem bunlar çünkü bir aktör değiller. Başka haritaya geçtiğimde ne olacak? Oraya da mı atacağız tek tek.
Olayın Plugin yazmak ile alakası yok bu arada. O bambaşka bir olay.

Böyle bir sistem de hata verme riski de çok düşüyor. Subsystem olursa. Tak çıkar gibi bir şeye dönüşüyor. Varsa çalışır yoksa çalışmaz.
Ben araştırdım C++ için GameInstanceSubsystem diye bir şey var. Main Game Instancene alt küme olan GameInstanceler bağlıyorsun subsystem şeklinde. Init oluyorlar ve ona göre aksiyon alınıyor. Fakat BP için böyle bir şey bulamadım.

Mesela oyun içi hile izleme sistemi yapmaya çalışsak bu da bir subsystem. Haritada bulunan bir aktör olamaz böyle bir şey. GameModede de bulunamaz çünkü oyun modu değişebilir. GameInstancede bulunabilir. Tüm oyun boyu izler ana menüde bile işlem uygulanabilir mesela oyuna girmesi engellenebilir. Makine banlanır GameInstancede makine okunabilir.
Ya çok önerilmez ama örnek veriyorum işte. Global merkezi sistemlerde BP yapıp haritaya atmakla iş çözülmüyor. Sürekli servis gibi arkada çalışan sistemler yapmak için bir çözüm arıyorum sadece.

Örnek vermek gerekirse : Faction/Wanted Level hesaplama/Reputation ve clanlar gibi şeyler.
Böyle şeyler GameState de barınabilir aslında. Fakat yine de olayın local kısımları var.
"mülk edinme sistemi gibi sistemler"

Bunların çoğunluğu büyük şirketlerin oyun servisleri veya bulut cozumu veya AAA sirketlerin devasa veritabani cozumleri ile çalışıyor.

Amazon Cozumleri:

Oracle Cozumleri:


Yani bilgileri oradan alıp kaydedebilirsin.

Basit olarak şöyle oluyor

Kullanıcı Sisteme Giris Yapti -> Server Uzerinden Bir Protokol Istegi Yolladi (Mesela JSON HTTP Request) -> Server Ona Bir Mesaj Gonderdi -> Kullanici Bu Bilgileri decode etti ve oyun dunyasindaki dedicated server bu bilgileri diger kullanicilara replicate etti.

GameInstance bir singleton sinfi yani, kendisi oyun calistirildiginda local olarak baslatiliyor ve ornegini(instance) butun her yerde bulabilirsiniz. Bunun subsystem ile alakasi yok.

Ufak maliyet hesabi:

En ucuz cozum:
Bence MySQL ile yapilan veritabani islemleri, etkili, ucuz ve maliyetsiz. Buyuk ve harika calisan cloud serverlara veya API ihtiyac yok.

Orta Seviye Cozum:
Custom Cloud + Node JS Server + Maria DB
veya
Amazon Game Services

Pahali Cozum:
Oracle game services ile anlasirdim SunSystems bu isin mukemmeliyet seviyesinde bir abidesi.
 
Son düzenleme:
Leveller arası geçiş yaparken datayı korumak istediğin herşey için Subsystem oluşturabilirsin, untickable her yerden ulaşabildiğin bir alternatif sunar sana (game settings, local player data, ses sistemi...) Online için sorarsan durum farklı tabii, kısaca cloud server üzerinde tutulması gerekiyor malum.
Yine kısaca mülk sistemi üzerinden konuşursak, basit çözüm: Bir adet DataAsset (çok ucuzdur, tick üzerinden bilgiyi çekmediğin sürece cast edip gerekli bilgileri istediğin gibi alırsın). Oyunun ilk başlagıcında bu data asset i, Subsystem a Set edersin oyun boyunca oradan gerekli static bilgiyi alır. Oynanış boyunca tüm değişiklikleri sub iletip save edebilirsin. Online iletişim içinse save değil de get/set server connection kullanırsın.

BP ile kullanılırmı hiç bilmiyordum şimdi senin için denedim ama üzgünüm, maalesef sadece cpp de çalışıyor. BP de alternatifin GameInstance ın kendisi bu durumda, hem local hem online trafiği sağlayabilir.