3. Log tự định nghĩa

Nhận thấy những hàm log cơ bản là không đủ để đáp ứng tất cả những yêu cầu của người dùng, chúng tôi cung cấp phương pháp giúp người dùng có thể tự thiết kế bản tin log lên server.

TL;DR : phi thẳng tới ví dụ :)))

1. Thiết kế bản ghi

Các bản ghi dữ liệu của người dùng, để tiện xử lý và thống kê, cần được phân loại vào dựa theo event, với các bản ghi của mỗi event có cấu trúc tương đồng với nhau. Với C#, các event được coi là tương đồng với class, và cấu trúc được định nghĩa bởi các trường của class.

Để khai báo 1 event log, ta tạo ra 1 class kế thừa từ 1 trong 2 class:

  • PlainFlexLog: class log gốc, không cung cấp bất kỳ thông tin thêm nào ngoài các trường trong class.

  • BaseFalconLog: class log cơ bản, cung cấp các thông tin thêm cơ bản của người chơi, bao gồm:

    • abTesting: lấy tự động theo FalconAbTesting, tham khảo thêm tại đây

    • accountId: nếu không có gì đặc biệt thì mặc định lấy theo deviceId

    • appVersion

    • deviceId

    • gameId, gameName

    • installDay: lưu ở local, sẽ bị reset nếu xóa đi cài lại

    • level: được cập nhật theo levelLog, hoặc người dùng tự cài đặt giá trị

    • platform

    • retentionDay: tính theo installDay

    • clientCreateDate: thời gian tạo log object, theo epoch time millis

    • apiId: tổng số Object của event hiện tại đã từng tạo(tính cả log hiện tại)

    • country : tự động thu thập ip và country người gửi ở phía server

Trong class vừa tạo, ta khai báo các trường thông tin thêm cần thiết. Sau đó, khi cần log, ta tạo new Object của event đó rồi gọi hàm send().

Chú ý:

  • class nên có attribute [Serializable] và các trường cần được để public.

  • Việc tạo event không được thực hiện với các hàm của attribute [RuntimeInitializeOnLoadMethod] do các giá trị nền của SDK được khởi tạo ở đây.

  • Giá trị về abTesting sẽ được lấy ngay tại thời điểm tạo object log (tức có thể không phải là giá trị mới nhất lấy từ server), nên nếu giá trị abTesting có quan trọng với việc thống kê, hãy check FalconConfig.UpdateFromNet trước khi tạo log. Tham khảo về abTesting tại đây.

  • Tuyệt đối không tạo trường có tên createdDate hoặc các tên tương tự cụm từ này do server có insert 1 trường tên như vậy để quản lý bản ghi. Nếu muốn gán timestamp vào bản ghi xin hãy điền vào trường clientCreateDatecó sẵn trong log. Nếu bản ghi vi phạm điều này sẽ tự động bị loại bỏ.

2. Về kiểu của trường dữ liệu

Một trường của log có thể có các kiểu dữ liệu sau:

  • Number

    • Sô nguyên: byte, short, int, long, bigInt

    • Số thực: float, double, bigDecimal

  • DateTime

  • Boolean

  • String

  • Object (cần là Serializable): Object khi lên db sẽ bị trải phẳng, ngăn cách bởi ký tự '$'

Khi một bản ghi được gửi lên server, toàn bộ meta về các kiểu của trường dữ liệu trong bản ghi sẽ được lưu lại để xử lý các bản ghi sau, vì vậy các bản ghi sau có kiểu dữ liệu lệch với bản ghi trước sẽ bị coi là không hợp lệ và loại bỏ (Các kiểu dữ liệu số sẽ được tự động chuyển đổi lẫn cho nhau, nên không phải lo về trường hợp như int không chấp nhận float :v) . Vì vậy nếu như muốn đổi kiểu dữ liệu của trường( do test, yêu cầu thực tế, ...) thì chúng tôi không thể hỗ trợ phần này và tốt nhất là bạn nên đổi tên trường và coi nó như 1 trường mới ._.|||||

3. VD

Yêu cầu: Với mỗi người chơi khi cài game, ta cần log event xem người chơi cài là organic hay inorganic. Log event này cần cung cấp các thông tin bao gồm loại người chơi(organic/inorganic), deviceId, playerMediationId, thời gian cài, appVersion,... Thông tin này có thể được cung cấp từ phía hệ thống của Unity, cùng với mediation mà game đang sử dụng, và mediation cần được init trước khi gọi hàm.

3.1. Khai báo class

[Serializable]
public class PlayerTypeLog : BaseFalconLog
{
    public String playerMediationId;
    public String playerType;
    
    public PlayerTypeLog(string playerMediationId, string playerType)
    {
        this.playerMediationId = playerMediationId;
        this.playerType = playerType;
    }
}

Class kế thừa BaseFalconLog sẽ cung cấp rất nhiều thông tin tự động như deviceId, thời gian cài, ... Và chỉ còn 2 thông tin là playerMediationId, playerType cần ta chủ động thu thập từ phía Mediation.

3.2. Sử dụng trong code

public class PlayerDataCollectObject : MonoBehaviour
{
    private IEnumerator Start()
    {
        //Check xem người chơi này đã từng gửi log lên chưa 
        //do mỗi người chơi chỉ cần log 1 lần là đủ
        if (PlayerPrefs.HasKey("Player Type Detect"))
        {
            yield break;
        }
        
        //Khởi tạo Mediation
        MediationService.Init();

        //Đợi Mediation khởi tạo xong
        while (!MediationService.InitComplete) yield return null;

        //Lấy giá trị từ Mediation
        string playerMediationId = MediationService.PlayerMediationId;
        var playerMediationType = MediationService.IsPlayerOrganic ? "Organic" : "InOrganic";

        //Tạo log mới và gửi
        new PlayerTypeLog(playerMediationId, playerMediationType).Send();
        
        //Lưu key vào PlayerPrefs để tránh phải log trùng lặp những lần sau
        PlayerPrefs.SetString("Player Type Detect", "Detected");
    }
}

Last updated