Başlamadan önce
Realtime Database özelliğini kullanabilmeniz için:
Unity projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.
Unity projeniz zaten Firebase kullanıyorsa kaydedilip yapılandırıldı.
Unity projeniz yoksa şunu indirebilirsiniz: örnek uygulama.
Firebase Unity SDK'sını (özellikle
FirebaseDatabase.unitypackage
) şuraya ekleyin: derleyip toparlarsınız.
Firebase'i Unity projenize eklemenin hem Firebase konsolunda ve açık Unity projenizde (örneğin, Firebase yapılandırma dosyalarını konsoldan indirip bu dosyalara bunları Unity projenize ekleyin).
Verileri Kaydetme
Firebase Realtime Database cihazına veri yazmak için beş yöntem vardır:
Yöntem | Yaygın kullanım alanları |
---|---|
SetValueAsync() |
Belirli bir yola veri yazma veya değiştirme (ör.
users/<user-id>/<username> |
SetRawJsonValueAsync() |
Verileri ham Json ile yazın veya değiştirin. Örneğin:
users/<user-id>/<username> |
Push() |
Veri listesine ekleyin. Her aradığınızda
Push() , Firebase, ayrıca kullanılabilecek benzersiz bir anahtar oluşturur
benzersiz bir tanımlayıcı olarak,
user-scores/<user-id>/<unique-score-id> . |
UpdateChildrenAsync() |
Verilerin tamamını değiştirmeden, tanımlanmış bir yolun anahtarlarından bazılarını güncelleyin. |
RunTransaction() |
Eşzamanlı güncellemelerle bozulabilecek karmaşık verileri güncelleyin. |
DatabaseReference alma
Veritabanı'na veri yazmak için DatabaseReference
örneğinin olması gerekir:
using Firebase; using Firebase.Database; public class MyScript: MonoBehaviour { void Start() { // Get the root reference location of the database. DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference; } }
Bir referanstaki verileri yazma, güncelleme veya silme
Temel yazma işlemleri
Temel yazma işlemleri için, verileri belirtilen bir referansa kaydetmek ve bu yoldaki mevcut verileri değiştirmek üzere SetValueAsync()
'ü kullanabilirsiniz. Mevcut JSON türlerine karşılık gelen türleri iletmek için bu yöntemi aşağıdaki gibi kullanabilirsiniz:
string
long
double
bool
Dictionary<string, Object>
List<Object>
Türlendirilmiş bir C# nesnesi kullanıyorsanız nesneyi ham JSON'a dönüştürmek ve SetRawJsonValueAsync()
'ı çağırmak için yerleşik JsonUtility.ToJson()
işlevini kullanabilirsiniz.
Örneğin, aşağıdaki gibi görünen bir Kullanıcı sınıfınız olabilir:
public class User { public string username; public string email; public User() { } public User(string username, string email) { this.username = username; this.email = email; } }
SetRawJsonValueAsync()
uygulamasına sahip bir kullanıcıyı aşağıdaki şekilde ekleyebilirsiniz:
private void writeNewUser(string userId, string name, string email) { User user = new User(name, email); string json = JsonUtility.ToJson(user); mDatabaseRef.Child("users").Child(userId).SetRawJsonValueAsync(json); }
SetValueAsync()
veya SetRawJsonValueAsync()
bu şekilde kullanılırsa verilerin üzerine yazılır
belirtilen konumda (tüm alt düğümler dahil) yer alır. Ancak nesnenin tamamını yeniden yazmadan da alt nesneyi güncelleyebilirsiniz. Kullanıcıların profillerini güncellemelerine izin vermek istiyorsanız kullanıcı adını aşağıdaki gibi güncelleyebilirsiniz:
mDatabaseRef.Child("users").Child(userId).Child("username").SetValueAsync(name);
Veri listesine ekle
Çok kullanıcılı uygulamalarda bir listeye veri eklemek için Push()
yöntemini kullanın.
Push()
yöntemi, yeni bir anahtar oluşturulmasını her seferinde benzersiz bir anahtar
alt öğesi, belirtilen Firebase referansına eklenir. Bu araçları kullanarak
her yeni öğe için otomatik olarak oluşturulan anahtarlara sahip olduğundan, bazı müşteriler
yazma çakışmaları olmadan aynı anda aynı konuma alt öğe ekleme. İlgili içeriği oluşturmak için kullanılan
Push()
tarafından oluşturulan benzersiz anahtar bir zaman damgasına dayalı olduğundan liste öğeleri
kronolojik olarak otomatik olarak sıralanır.
Aşağıdakileri almak için Push()
yönteminin döndürdüğü yeni verilere referansı kullanabilirsiniz.
alt yayıncının otomatik olarak oluşturduğu anahtarın değerini veya çocuk için veri ayarlayın. Telefon etme
Push()
referansındaki Key
,
otomatik olarak oluşturulan anahtardır.
Belirli alanları güncelle
Diğer alt düğümlerin üzerine yazmadan bir düğümün belirli alt düğümlerine aynı anda yazmak için UpdateChildrenAsync()
yöntemini kullanın.
UpdateChildrenAsync()
çağrısı yapılırken alt düzey alt değerleri şu şekilde güncelleyebilirsiniz:
anahtar için bir yol belirterek. Veriler ölçeklendirilmek üzere birden fazla konumda depolanıyorsa
isterseniz, bu verilerin tüm örneklerini
verilerin yayılması. Örneğin,
oyunda şunun gibi bir LeaderboardEntry
sınıfı olabilir:
public class LeaderboardEntry { public string uid; public int score = 0; public LeaderboardEntry() { } public LeaderboardEntry(string uid, int score) { this.uid = uid; this.score = score; } public Dictionary<string, Object> ToDictionary() { Dictionary<string, Object> result = new Dictionary<string, Object>(); result["uid"] = uid; result["score"] = score; return result; } }
Oyun, bir LeaderboardEntry oluşturmak ve bunu aynı anda son puan feed'ine ve kullanıcının kendi puan listesine güncellemek için aşağıdaki gibi bir kod kullanır:
private void WriteNewScore(string userId, int score) { // Create new entry at /user-scores/$userid/$scoreid and at // /leaderboard/$scoreid simultaneously string key = mDatabase.Child("scores").Push().Key; LeaderBoardEntry entry = new LeaderBoardEntry(userId, score); Dictionary<string, Object> entryValues = entry.ToDictionary(); Dictionary<string, Object> childUpdates = new Dictionary<string, Object>(); childUpdates["/scores/" + key] = entryValues; childUpdates["/user-scores/" + userId + "/" + key] = entryValues; mDatabase.UpdateChildrenAsync(childUpdates); }
Bu örnekte, şuna ait girişleri içeren düğümde bir giriş oluşturmak için Push()
kullanılmıştır:
/scores/$key
alanındaki tüm kullanıcıları ve anahtarı
Key
. Bu anahtar, kullanıcının iş sayfasında ikinci bir giriş oluşturmak için kullanılabilir.
skor /user-scores/$userid/$key
.
Bu yolları kullanarak, bir bölgedeki birden fazla konumda aynı anda güncelleme yapabilirsiniz.
tek bir UpdateChildrenAsync()
çağrısıyla JSON ağacını oluşturabilirsiniz (örneğin,
örnek, her iki konumda da yeni girişi oluşturur. Eş zamanlı güncellemeler yapıldı
ya tüm güncellemeler başarılı olur ya da başarısız olur.
Verileri silin
Verileri silmenin en basit yolu, söz konusu verilerin konumuna referans vererek RemoveValue()
işlevini çağırmaktır.
Başka bir yazma işleminin değeri olarak null
değerini belirterek de silebilirsiniz
SetValueAsync()
veya UpdateChildrenAsync()
gibi bir işlem. Bunu kullanabilirsiniz
tek bir API'de birden fazla alt öğeyi silmek için UpdateChildrenAsync()
ile teknik
çağrısına bir tıklama URL'si eklemeniz gerekir.
Verilerinizin kaydedildiği zamanı öğrenin.
Verilerinizin Firebase Realtime Database sunucusuna ne zaman kaydedildiğini öğrenmek için
bir devamlılık ekleyebilirsiniz. Hem SetValueAsync()
hem de UpdateChildrenAsync()
işlemin tamamlandığını size bildiren bir Task
döndürür. Öğe
herhangi bir nedenle başarısız olursa Görevler IsFaulted
Hatanın neden oluştuğunu belirten Exception
özelliği.
Verileri işlem olarak kaydetme
Eşzamanlı etkenlere göre bozulabilecek verilerle çalışırken
artımlı sayaçlar gibi değişiklikleri yapmak için
işlemin işleyiş şekli.
Bu işleme bir Func
atarsınız. Bu güncelleme (Func
) geçerli durumu alır
bağımsız değişken olarak sunar ve istediğiniz yeni durumu döndürür.
yazma. Başka bir istemci konuma yazarsa yeni değeriniz
güncelleme fonksiyonunuz yeni geçerli kod
değeri gösterilir ve yazma işlemi yeniden denenir.
Örneğin, bir oyunda kullanıcıların bir skor tablosunu en yüksek beş puan:
private void AddScoreToLeaders(string email, long score, DatabaseReference leaderBoardRef) { leaderBoardRef.RunTransaction(mutableData => { List<object> leaders = mutableData.Value as List<object> if (leaders == null) { leaders = new List<object>(); } else if (mutableData.ChildrenCount >= MaxScores) { long minScore = long.MaxValue; object minVal = null; foreach (var child in leaders) { if (!(child is Dictionary<string, object>)) continue; long childScore = (long) ((Dictionary<string, object>)child)["score"]; if (childScore < minScore) { minScore = childScore; minVal = child; } } if (minScore > score) { // The new score is lower than the existing 5 scores, abort. return TransactionResult.Abort(); } // Remove the lowest score. leaders.Remove(minVal); } // Add the new high score. Dictionary<string, object> newScoreMap = new Dictionary<string, object>(); newScoreMap["score"] = score; newScoreMap["email"] = email; leaders.Add(newScoreMap); mutableData.Value = leaders; return TransactionResult.Success(mutableData); }); }
İşlem kullanmak, birden fazla kullanıcı aynı anda puan kaydediyorsa veya istemcide eski veriler varsa skor tablosunun yanlış olmasını önler. İşlem reddedilirse sunucu, mevcut değeri istemciye döndürür. İstemci de işlemi güncellenmiş değerle tekrar çalıştırır. Bu işlem, İşlem kabul edildi veya çok fazla deneme yapıldı.
Çevrimdışı veri yazma
Bir istemcinin ağ bağlantısı kesilirse uygulamanız düzgün çalışmaya devam eder.
Firebase veritabanına bağlı her istemcinin kendi dahili sürümü bulunur olabilir. Veriler yazıldığında, bu yerel sürüme yazılır. tıklayın. Firebase istemcisi bu verileri uzak veritabanı ile senkronize eder sağlamak için "en iyisini" yaparak .
Sonuç olarak, veritabanına yapılan tüm yazmalar yerel etkinlikleri hemen, sunucuya herhangi bir veri yazıldığından emin olabilirsiniz. Böylece uygulamanız, ağ gecikmesinden veya bağlantısından etkilenmeden yanıt vermeye devam eder.
Bağlantı yeniden kurulduğunda uygulamanız uygun veri kümesini alır Böylece istemcinin, istemcinin bunu gerçekleştirmesine gerek kalmadan mevcut sunucu durumuyla herhangi bir özel kod yazabilirsiniz.