Tài liệu Steamworks
Lớp bộ hành động
Lớp bộ hành động là bộ gán nút hành động (không bắt buộc), có thể được đặt lên một bộ hành động sẵn có. Trái với bộ hành động, các lớp lấy hành động từ bộ hành động của nó và không thay thế hàng loạt những gì đang được sử dụng, mà chỉ áp dụng vài điều chỉnh nhỏ. Bao gồm thay đổi về thiết lập cũng như thêm hoặc xóa cấu hình gán từ bộ hành động gốc. Có thể áp dụng nhiều hơn một lớp tại một thời điểm và sẽ thực hiện liên tục.

Về cơ bản, không giới hạn số lượng lớp có thể dùng cùng một lúc, nhưng trên thực tế, quá nhiều lớp trong trình thiết lập sẽ gây rối rắm cho người dùng.

Lưu ý rằng:
  • Kích hoạt bộ hành động đang hoạt động sẽ không có tác dụng đối với các lớp.
  • Kích hoạt bộ hành động mới sẽ xóa các lớp hiện tại khỏi bộ cũ.
  • Kích hoạt lớp bộ hành động đang hoạt động sẽ không có tác dụng.
  • Kích hoạt lớp bộ hành động đang hoạt động sẽ không thay đổi thứ tự của nó trong ngăn xếp.
  • Bỏ kích hoạt rồi kích hoạt lại lớp bộ hành động sẽ đặt nó lên đầu ngăn xếp.
  • Gọi ActivateActionSetLayer ít tốn kém và có thể liên tục gọi một cách an toàn (nhưng xem callout bên dưới)

    Cẩn thận với nhiều lớp!

    Chỉ vì có thể áp dụng lại lớp hành động mỗi frame không có nghĩa là bạn nên làm thế, đặc biệt khi bạn dùng nhiều hơn một lớp. Lớp cuối cùng được áp dụng sẽ ghi đè bất kỳ thông tin xung đột nào có trước đó, vậy nên hãy cẩn thận áp dụng chúng đúng thứ tự. Code của bạn có thể dễ dàng dùng điều kiện thực hiện (race condition) hoặc các bug thời gian tinh vi khác để hoán đổi thứ tự.

    Lớp bộ hành động vốn để dành cho các trường hợp dùng khá 'ngách' và phương pháp tối ưu là áp dụng rồi gỡ bỏ chúng chỉ khi trạng thái trò chơi thay đổi cụ thể.

    Với trò chơi hỗ trợ Steam Input, nhà phát triển có thể định nghĩa các lớp bộ hành động được kích hoạt bằng code của trò chơi. Thêm vào đó, trong chế độ legacy, người chơi có thể tự định nghĩa các lớp bộ hành động và tương tác nào kích hoạt chúng, cũng như họ có thể định nghĩa các bộ hành động kích hoạt bởi người chơi.

    Ví dụ thực tiễn


    Tưởng tượng trò bắn súng theo lớp nhân vật với phương tiện. Trò chơi này có hỗ trợ Steam Input và tận dụng chức năng lớp bộ hành động. Với kiểu chơi căn bản, bộ hành động cơ bản luôn được kích hoạt và áp dụng cho việc chạy nhảy, lượm đồ, v.v.

    action_set_layers_basic_1.png

    Khi người chơi chọn nhân vật, một lớp phù hợp sẽ được áp dụng, ví dụ "bắn tỉa"

    action_set_layers_sniper_2.png

    Code có thể trông như thế này:

    void changeClass(EClassID myClass) { if(myClass == SNIPER) { SteamInput()->ActivateActionSetLayer( controllerHandle1, sniperLayerHandle ); } //logic cho nhiều lớp khác }

    Nếu người chơi vào hay ra khỏi phương hiện, cách điều khiển cho lớp phương tiện sẽ được bật/tắt trên các thay đổi trạng thái đấy, thêm hoặc gỡ cách điều khiển mới cho các chức năng đặc trưng cho phương tiện.

    action_set_layers_vehicle_1.png

    void changeVehicle(EVehicleID myVehicle, bool entering) { InputActionSetHandle_t layerHandle; if(myVehicle == AUTOMATIC) { layerHandle = automaticHandle; //hộp số tự động -- lái, tăng ga, thắng } else if(myVehicle == STICK_SHIFT) { layerHandle = stickShiftHandle; //hộp số tay -- lái, tăng ga, chân con, đổi số, v.v. } if(entering) { SteamInput()>ActivateActionSetLayer( controllerHandle1, layerHandle ); //áp dụng lớp bộ hành động phương tiện khi bạn vào trong } else { SteamInput()>DeactivateActionSetLayer( controllerHandle1, layerHandle ); //bỏ lớp bộ hành động phương tiện khi bạn ra khỏi } }

    Trong trò chơi này, người chơi có thể dùng vũ khí kể cả khi điều khiển phương tiện. Vậy nên khi nhân vật bắn tỉa nhắm bắn bằng súng ngắm, nó sẽ kích hoạt lớp bộ hành động thứ ba, dù người chơi đang đi bộ hay điều khiển phương tiện.

    action_set_layers_scope.png

    void useScope(bool entering) { if(entering) { SteamInput()->ActivateActionSetLayer( controllerHandle1, scopeHandle ); //áp dụng lớp ngắm bắn khi bạn ngắm } else { SteamInput()->DeactivateActionSetLayer( controllerHandle1, scopeHandle ); //bỏ lớp ngắm bắn khi ngừng ngắm } }

    Đây là cách toàn bộ các lớp kết hợp.

    action_set_layers_result_2.png

    Để ý các lớp không chỉ thêm hành động mới lên trên các lớp nền, chúng còn ghi đè các phím gán trước đó -- trong trường hợp này, chức năng "thắng" và "tăng ga" thuộc bộ điều khiển phương tiện ghi đè hành động "nhảy" và "tương tác" của lớp cơ bản, và "lái" ghi đè hành động "di chuyển" được gán trên bàn rê và cần trỏ của lớp cơ bản, và rồi sau đó ghi đè bởi hành động "ngắm" từ lớp bộ hành động ngắm bắn. Khi cả ba lớp bộ hành động được xếp lên trên cùng, hành động duy nhất còn lại từ lớp nền là "bắn".

    Chế độ Legacy


    Bạn có thể tạo các lớp bộ hành động gần y hệt như bộ hành động thông thường. Chỉ cần nhấp nút "Thêm lớp hành động" trong công cụ thiết lập:

    add_action_layer.png

    Từ đây, bạn có thể đặt tên cho lớp hành động và các phím gán cụ thể cho nó. Vì đây là lớp bộ hành động trong chế độ legacy, trò chơi không biết về nó và người chơi phải tự kích hoạt. Quyết định thao tác nào để kích hoạt lớp bộ hành động, và mở menu gán phím, rồi nhấp vào biểu tượng kích hoạt bộ hành động ở bên trái:

    bind_action_set.png

    Nó mở menu kích hoạt bộ hành động:

    change_action_set.png

    Trong trường hợp này chúng ta muốn áp dụng một lớp, chứ không kích hoạt bộ hành động. Chúng ta sẽ chọn "Áp dụng lớp hành động" từ menu thả xuống:

    apply_action_set_layer.png

    Cuối cùng, chúng ta cần chọn lớp nào muốn áp dụng:

    select_action_set_layer.png

    Chúng ta dùng quy trình tương tự để gán một phím riêng để gỡ bỏ lớp.
  翻译: