Tài liệu Steamworks
Hướng dẫn bắt đầu cho nhà phát triển

Tổng quan


API Steam Input được thiết kế để cho phép bạn dễ dàng hỗ trợ hoàn toàn các thiết bị Steam Input trong trò chơi của bạn. Chúng tôi định nghĩa khái niệm hỗ trợ hoàn toàn như sau:

  • Trò chơi của bạn dùng đúng biểu tượng theo loại tay cầm khi yêu cầu người chơi tương tác.
  • Màn hình thiết lập Steam Input sử dụng hành động trong trò chơi mà người chơi thực hiện, thay vì phím hay nút.
  • Bạn đã đăng một bộ thiết lập chính thức cho tay cầm mình hỗ trợ.
  • Trò chơi không ngăn người dùng tự tùy chỉnh cơ chế điều khiển. Điều này có nghĩa dùng kết hợp đồng thời thao tác chuột, bàn phím, hoặc tay cầm.
  • Khi trò chơi yêu cầu thao tác bàn phím (ví dụ đặt tên nhân vật), bạn dùng API để tự động mở giao diện nhập văn bản.
  • Trò chơi không có phần mềm khởi động yêu cầu thao tác chuột hay bàn phím - tốt hơn hết là không cần phần mềm khởi động.

Để đảm bảo người dùng có trải nghiệm tốt khi chơi trong phòng khách, chúng tôi khuyến nghị các điều sau:

  • Giao diện nên dễ đọc từ nhiều mét. Quy tắc là: khi chạy trò chơi ở độ phân giải 1920x1080, phông chữ nên có kích cỡ tối thiểu 24px.
  • Mặc định khởi động trò chơi ở chế độ toàn màn hình khi người dùng chạy Steam Big Picture (biến số môi trường "SteamTenfoot" sẽ được đặt)
  • Điểm cộng, lần đầu khởi chạy phát hiện độ phân giải màn hình của người dùng và đặt độ phân giải của bạn cho khớp với nó.

Trường hợp dùng phổ biến

Tôi đang thêm hỗ trợ API Steam Input trước khi phát hành trò chơi của mình


Tuyệt! Làm theo hướng dẫn kỹ thuật trong triển khai hỗ trợ API Steam Input.

Tôi đang thêm hỗ trợ API Steam Input cùng với các thư viện đầu vào khác


Hoàn toàn không vấn đề gì nếu phát hành tương tác tay cầm với cả Steam Input, và nếu bạn định hỗ trợ API Steam Input sau đợt ra mắt hoặc đưa lên nền tảng khác, bạn sẽ dễ thấy mình gặp phải tình huống này. Có vài điều cần lưu ý:

1. Cẩn trọng với việc lựa chọn hành động analog
Chúng tôi sẽ đi chi tiết về chủ đề này sau nhưng tóm tắt ngắn gọn là:
  • Bạn luôn luôn nên kèm theo hành động kiểu chuột cho các điều khiển dạng con trỏ hoặc camera cần độ chính xác cao. Bỏ qua đầu vào kiểu chuột có thể chấp nhận được trong thể loại hai cò hoặc thể thao trong đó vị trí cần trỏ được dùng để định hướng ngắm.
  • Tránh dùng chuột hệ thống (tùy chọn "os_mouse") trừ phi có lý do phù hợp để cần nó. Có thể quyết định nếu đầu vào nên đến từ chuột thật so với tay cầm là một phần quan trọng trong việc thiết kế UX tốt.
  • Bạn nên dựa vào bộ thiết lập để chỉnh độ nhạy (ví dụ như không lọc dữ liệu Steam Input đầu vào), hoặc nên dùng một tùy chọn độ nhạy chuyên biệt cho Steam Input tách biệt so với chuột hệ thống.

2. Nhất quán về tính năng tự động ngắm (auto-aim) bằng cần trỏ
Nếu bạn có chức năng tự động ngắm hoặc hỗ trợ ngắm với cần trỏ analog XInput, hãy cân nhắc áp dụng nó lên cả thiết bị Steam Input, hoặc chí thiểu áp dụng cho các mẫu tay cầm truyền thống được tùy chỉnh qua Steam Input. Bạn có thể gọi GetInputTypeForHandle để xác định một mẫu tay cầm hoặc triển khai hành động camera riêng cho kiểu chuột và cần trỏ.

3. Dùng SDL bản 2.0.8 hoặc hơn, nếu được
Nếu đang dùng SDL (Simple DirectMedia Layer), một trong các thư viện trò chơi xuyên nền tảng phổ biến nhất để xử lý đầu vào, hãy nhớ dùng phiên bản mới nhất, hoặc tối thiểu từ bản 2.0.8 trở lên. Phiên bản này cho phép Steam bảo SDL phớt lờ các đầu vào cho tay cầm được thiết lập bởi Steam Input, từ đấy tránh lỗi hai lần đầu vào.

4. Có kế hoạch cho tay cầm Xbox
Nếu trò chơi đã phát hành và có hỗ trợ XInput mà bạn định giữ nguyên, bạn có thể muốn để mặc định tay cầm Xbox vào đường của XInput. Nếu là trò chơi nhiều người chung máy, bạn sẽ muốn đảm bảo rằng có thể hỗ trợ đầu vào từ cả hai đường cùng lúc hoặc đưa tất cả tay cầm vào trong Steam Input.

Tôi muốn trò chơi không dùng API Steam Input của mình hoạt động tốt với Steam Input


Đầu tiên, xin được khuyến nghị tham khảo bài viết Năm quy luật vàng về đầu vào của Zach Burke.

Tóm tắt lại, chúng là:

  1. Biểu tượng trên màn hình nên khớp với thiết bị đầu vào
  2. Con trỏ chuột nên khớp với thiết bị đầu vào
  3. Tất cả các thiết bị phải hoạt động mọi lúc
  4. Có thể dùng Dpad, cần trỏ analog và chuột để điều hướng menu
  5. Trò chơi cần phải tạm dừng nếu tay cầm mất kết nối

Đấy là những quy tắc chung hợp lý mà bạn nên làm theo nếu có thể. Và chúng tôi xin nhấn mạnh thêm:

Nên đồng thời dùng được cả đầu vào tay cầm và chuột cùng lúc

Hầu hết trò chơi cho phép tương tác chuột, hoặc tay cầm, nhưng không phải cả hai cùng lúc, và đây là nguyên nhân chủ đạo gây ra vấn đề về tương thích với hệ thống Steam Input.

Thêm vào đó:

  1. Đặt một thiết lập khuyến nghị cho tất cả các loại tay cầm
    Như thế Steam không cần phải báo người dùng chọn một thiết lập khi khởi chạy. Thêm nữa, bạn không cần phải cung cấp thiết lập cho cả tay cầm Xbox 360 và Xbox One -- chỉ cần làm cho một mẫu thì mẫu còn lại cũng sẽ hoạt động.
  2. Đăng ký các tay cầm bạn không mặc định hỗ trợ vào Steam Input
    Nếu không tích hợp hỗ trợ sẵn cho các loại tay cầm này, bạn nên dùng trang đối tác để đăng ký chúng dùng Steam Input. Xem phần dưới của mục này để biết thêm thông tin.
  3. Nếu không định cho phép dùng song song tay cầm/chuột...
    ...chí ít hãy làm sao để tùy chỉnh được vùng chết, gia tốc, và độ nhạy của cần trỏ. Giả lập cần trỏ cho bàn rê hoạt động bằng cách liên tục vuốt cần trỏ ảo, vậy nên chúng rất nhạy cảm với các thông số này. Để đạt kết quả tốt, bạn sẽ muốn cho phép độ nhạy rất cao, vùng chết có về 0 và đường gia tốc tuyến tính. Thiết lập tay cầm cho Shadow of War là một ví dụ tốt.
  4. Cho phép người dùng chọn biểu tượng xuất hiện kiểu Xbox hay PS4 qua menu hoặc phát hiện loại thiết bị qua API của chúng tôi
    Khi Steam gửi đầu vào tay cầm, nó sẽ hiện trong trò chơi như kiểu tay cầm Xbox, thay vì thiết bị thông thường. Điều này hữu dụng vì nó cho phép người chơi dùng thiết bị mà thông thường không hoạt động được, nhưng cũng có nghĩa việc kiểm thông thường cho ID thiết bị USB v.v... sẽ không có tác dụng và bạn sẽ cần gọi một hàm helper từ Steam. Điều quan trọng cần lưu ý là kể cả khi bạn đã hỗ trợ tay cầm, trong trò chơi vẫn có thể phải thông qua Steam Input do người dùng truyền phát trò chơi qua Steam Remote Play hoặc chủ động sử dụng Steam Input để thiết lập thiết bị của họ.

Bạn có thể đọc thêm về việc này tại trang Phương pháp tối ưu giả lập tay cầm qua Steam Input.

Nhập văn bản


Nhập văn bản trên màn hình về mặt kỹ thuật không phải là một phần của ISteamInput, thay vào đó được tìm thấy tại ISteamUtils.

Một số tham khảo nhanh:

Bạn có thể thấy chúng hữu dụng cho dù có đang dùng Steam Input hay không.

Triển khai hỗ trợ API Steam Input


Quy trình triển khai khá trực diện, và sẽ không mất quá vài ngày làm việc. Có bốn bước:

  1. Trong bộ soạn thảo văn bản, tạo một file các hành động trong trò chơi, để báo với Steam về các hành động trong trò chơi mà người chơi có thể gán vào tay cầm.
  2. Trong Steam, dùng giao diện thiết lập Steam Input để tạo thiết lập mặc định của bạn.
  3. Trong trò chơi, dùng API Steam Input để đọc hành động từ tay cầm, và lấy các biểu tượng nút tay cầm phù hợp để hiển thị.
  4. Cập nhật depot trò chơi của bạn với các binary mới, và đăng tải thiết lập của bạn làm thiết lập chính thức.

Bước 1 - Tạo một file hành động trong trò chơi


Bắt đầu bằng cách tải về file hành động trong trò chơi (IGA). Đặt nó vào trong thư mục "<Steam Install Directory>\controller_config" của bạn (tạo thư mục và đường dẫn nếu chưa có). Đổi tên file thành: "game_actions_X.vdf", trong đó X là AppID cho trò chơi Steam của bạn. Nếu không biết AppID trên Steam cho trò chơi, tìm nó bằng cách đăng nhập vào trang đối tác Steam.

Giờ mở file bằng công cụ soạn thảo văn bản bạn yêu thích. File ở trong định dạng tiêu chuẩn của Valve gọi là KeyValues, một định dạng đơn giản & dễ đọc. Bạn có thể tải về mẫu file hành động trong trò chơi hoặc Portal 2 IGA để tham khảo.

Để biết thêm chi tiết xem: File hành động trong trò chơi

Định dạng file


File IGA chứa mục "actions", liệt kê toàn bộ các bộ hành động (IGAS) trong trò chơi của bạn. Một IGAS mô tả toàn bộ hành động người chơi có thể thực thi trong ngữ cảnh của trò chơi - ví dụ như khi đang lái xe, đi bộ, hoặc điều hướng hệ thống menu. Với mỗi IGAS, giao diện công cụ thiết lập Steam Input sẽ tạo một thẻ để người chơi tùy chỉnh cách các hành động này được gán vào tay cầm.

Một đề mục IGAS trong file IGA nên có "title" làm key & value, và các mục phụ sau: "StickPadGyro", "AnalogTrigger", và "Button". Mỗi mục "StickPadGyro" và "AnalogTrigger" nên chứa một danh sách các IGA mà người chơi chỉ có thể gán vào cần trỏ/bàn rê/gyro và cò analog. Mục "Buttons" chứa các IGA chỉ có thể gán với đầu vào digital (như nút vật lý ABXY, hoặc bàn rê trong chế độ ABXY, hoặc nút cò không được dùng làm hành động AnalogTrigger).

Thiết kế IGA của bạn

Ngẫm một phút về tính năng trò chơi - nó có bao nhiêu chế độ riêng biệt? Với mỗi nơi cần cơ chế điều khiển riêng biệt thì bạn sẽ muốn tạo một bộ hành động. Hầu hết mọi trò chơi sẽ cần ít nhất một bộ hành động cho "Menu" và "trong trò chơi", số khác thì cần nhiều hơn. Trò chơi của bạn có trường hợp đặc biệt như điều khiển phương tiện hay menu đặc biệt trong khi chơi như bản đồ hoặc kho đồ, những lúc ấy thì tạo bộ hành động sẽ rất hữu ích.

Không phải cái nào cũng cần một bộ hành động riêng biệt, bạn có thể dùng lớp bộ hành động để xử lý các chế độ gần giống nhau. Ví dụ nếu có thể lái cả xe và tàu trong trò chơi, bạn có thể muốn có bộ hành động "phương tiện" với lớp bộ hành động "tàu" hoặc "xe" bên trên nó. Lớp bộ hành động duy trì bất kỳ thiết lập nào của bộ hành động bậc trên của nó, giúp việc sửa cũng như hiểu thiết lập trở nên dễ thở hơn cho cả đội ngũ phát triển và người dùng.

Để biết thêm chi tiết về lớp bộ hành động, xem: Lớp bộ hành động

Giới hạn về số lượng hành động

Hiện tại số hành động tối đa là 16 analog và 128 digital. Lưu ý quan trọng là hành động có thể chia sẻ giữa các bộ hành động nên trong hầu hết mọi trường hợp, bạn sẽ chỉ dùng một phần rất nhỏ trong số lượng hành động tối đa cho phép. Giới hạn này không phải cố định vậy nên nếu bạn có lý do để cần thêm, xin hãy báo cho chúng tôi.

Hành động nút (Button)


Định dạng cho hành động "Button" là như sau:

"<action name>" "#<localization key>"

<action name> là tên nội bộ bạn muốn đặt cho hành động này trong code trò chơi, khi giao tiếp với API Steam Input. <localization key> nên là tên cho mục bản địa hóa, bản dịch thuật (Xem mục Thêm bản địa hóa). Nhớ thêm ký tự '#' vào đầu key bản địa hóa của bạn.

Hành động cò cơ học (Analog Trigger)


Định dạng cho hành động "AnalogTrigger" cũng y như "Button". Hành động "AnalogTrigger" nên là hành động mà trò chơi sẽ hiểu thành đầu vào toàn phần analog, như tăng ga xe chẳng hạn. Nếu không có đầu vào kiểu đấy, hãy để trống mục này. Giao diện thiết lập Steam Input sẽ cho phép người chơi gán bất kỳ hành động "Button" nào vào nút cò vật lý nếu chúng hiện không được dùng làm hành động "AnalogTrigger".

Hành động cần trỏ, bàn rê và gyro (StickPadGyro)


Định dạng cho hành động "StickPadGyro" là như sau:

"<action name>" { "title" "#<localization key>" "input_mode" "<analog mode>" }

<action name><localization key> tương tự như các key khớp nhau trong định dạng "Button". <analog mode> sẽ giúp chúng ta diễn giải dữ liệu đến từ điều khiển vật lý, trước khi ta chuyển nó đến trò chơi của bạn qua API Steam Input.

<analog modes> hợp lệ thì sẽ như thế này:

  • "absolute_mouse" - khi bạn cần hành động có hành vi như chuột. Hữu dụng cho góc nhìn camera thứ nhất và thứ ba, hoặc con trỏ chuột thực sự.
  • "joystick_move" - là khi bạn dùng hành động để di chuyển nhân vật.

"absolute_mouse" vs. "joystick_move"

Chúng tôi muốn nhấn mạnh tầm quan trọng của việc tạo đầu vào camera cho trò chơi góc nhìn thứ nhất/ba của bạn hoặc bất cứ thứ gì cần con trỏ, bạn luôn luôn nên kèm theo một hành động kiểu "absolute_mouse" và phản hồi trước các delta như thể nó là một con chuột, vì dữ liệu 1:1 là cần thiết cho việc triển khai ngắm Gyro hoặc đầu vào bàn rê chất lượng tốt. Steam Input có thể chuyển đầu vào cần trỏ từ tay cầm thành kiểu "absolute_mouse" cho bạn nhưng do đồ thị gia tốc và vùng chết được áp dụng trong trò chơi, việc chuyển theo hướng ngược lại là không khả thi.

Sẽ không sao nếu kèm kiểu hành động "joystick_move" nếu bạn muốn tương quan y hệt khi ngắm bằng cần trỏ như bản build console, nhưng hãy kiểm tra xem có thể nhận đầu vào từ cả "absolute_mouse""joystick_move" cùng lúc, như thế thì tay cầm Playstation và Switch có thể dùng Gyro để ngắm cùng với cần trỏ. Bạn có thể muốn triển khai hành động digital cho "Đặt lại camera" để phương dọc camera về lại tâm. Nếu bạn có bật tự động ngắm cho tay cầm XInput xin vui lòng áp dụng cùng logic đó cho đầu vào cần trỏ qua API Steam Input và cân nhắc giảm bớt lượng tự động ngắm với bàn rê/gyro.

Có một thiết lập không bắt buộc cho hành động StickPadGyro để dùng "absolute_mouse" làm đầu vào cho chúng. Nếu đặt key "os_mouse" thành "1", chúng ta sẽ chuyển đầu vào từ người chơi đến hệ điều hành cũng như trò chơi của bạn. Nó hữu dụng nếu bạn có hiển thị con trỏ hệ điều hành và nên được điều khiển bởi hành động này.

Sau đây là ví dụ:

"menu_mouse" { "title" "#Menu_Mouse_Title" "input_mode" "absolute_mouse" "os_mouse" "1" }

Cảnh báo

  1. Chúng tôi cực kỳ không khuyến khích dùng tùy chọn "os_mouse" cho điều khiển camera. Nếu có phần nào của trò chơi khó đưa bản vá, hãy nhớ bạn luôn có thể có các hành động analog riêng biệt chỉ dùng trong menu so với bộ hành động trong trò chơi.
  2. Dùng "os_mouse" sẽ khiến đầu vào tay cầm bị điều khiển bởi độ nhạy chuột trong trò chơi và chỉ tác dụng với chơi đơn mạng nội bộ.

Bước 1.1 - Thêm bản địa hóa


Mục "localization" trong file IGA của bạn chứa danh sách ngôn ngữ, mỗi cái lại là một mục gồm các key & giá trị bản địa hóa. Ví dụ:

"localization" { "english" { "Action_Jump" "Jump" "Action_Camera" "Camera" } "german" { "Action_Jump" "Springen" "Action_Camera" "Kameraansicht" } }

Các hành động trong file IGA của bạn sau đó nên chỉ định tên của chúng bằng cách dùng đến key bản địa hóa mong muốn, với # làm tiền tố. Sau đây là ví dụ các hành động sử dụng key bản địa hóa bên trên:

"StickPadGyro" { "Camera" { "title" "#Action_Camera" "input_mode" "absolute_mouse" } } "Button" { "Jump" "#Action_Jump" }

Nếu ngôn ngữ mà trò chơi đang dùng không được tìm thấy dưới mục bản địa hóa, tiếng Anh sẽ được dùng làm dự phòng. Nếu không tìm thấy tiếng Anh, chuỗi sẽ được hiện y thế. Để biết chi tiết về các ngôn ngữ được hỗ trợ, vui lòng xem các ngôn ngữ được hỗ trợ đầy đủ

Bước 1.2 - Tiêu đề & mô tả


Các thiết lập cũng cần được bản địa hóa tiêu đề và mô tả. Nếu bạn chỉ tạo một thiết lập chính thức cho trò chơi thì đừng lo, chúng tôi sẽ cung cấp tiêu đề và mô tả mặc định, và bạn có thể hoàn toàn bỏ qua bước này. Nhưng nếu bạn muốn có nhiều thiết lập chính thức cho trò chơi, thì sẽ cần cung cấp bản dịch cho tiêu đề và mô tả của chúng.

Tiêu đề và mô tả của thiết lập nên được liệt kê cùng các key bản địa hóa còn lại của bạn. Key tiêu đề phải bắt đầu bằng "Title_", và key mô tả phải bắt đầu bằng "Description_". Sau đây là ví dụ:

"localization" { "Tiếng Việt" { "Title_Config1" "Thiết lập chính thức" "Description_Config1" "Thiết lập này được tạo bởi nhà phát triển của trò chơi X." "Title_Config2" "Thiết lập tay trái chính thức" "Description_Config2" "Thiết lập này được tạo bởi nhà phát triển của trò chơi X, và dành cho người dùng thuận tay trái." "Action_Jump" "Nhảy" "Action_Camera" "Camera" } }

Khi đăng một thiết lập (xem Bước 4 - Phát hành), bạn sẽ cần phải chọn tiêu đề và mô tả bản địa hóa nào mình muốn dùng.

Bước 2 - Tạo một thiết lập mặc định


Khi đã tạo một file IGA, và đảm bảo rằng nó ở đúng thư mục & được đặt tên để khớp với AppID cho trò chơi, bạn đã sẵn sàng để tạo một thiết lập.

Chạy Steam trong chế độ Big Picture, và tìm đến trang chi tiết cho trò chơi của bạn.

Chọn "Manage Game," (Quản lý trò chơi) rồi chọn "Configure Controller" (Thiết lập tay cầm). Nếu nhận lỗi nào tại bước này, chúng sẽ xác định vấn đề trong file IGA của bạn và bạn cần sửa chúng - sai lầm phổ biến là thiếu đóng ngoặc kép hoặc ngoặc đơn.

Nếu không gặp lỗi nào, bạn sẽ thấy một thiết lập tay cầm trống cho trò chơi, và nó sẽ nhận thức đầy đủ về các hành động trong trò chơi của bạn. Sử dụng giao diện này để tạo một thiết lập mặc định. Hãy nhớ đặt mặc định cho tất cả bộ hành động trong trò chơi, chứ không chỉ cái đầu tiên.

Khi đã có một thiết lập, hãy lưu riêng nó. Đừng đăng tải ngay, vì trò chơi chưa sẵn sàng để nhận các IGA.

Bước 3 - API Steam Input


Hãy nhớ lấy phiên bản API Steamworks mới nhất từ trang bắt đầu với Steamworks.

Steam Input cho phép gán phím tay cầm theo từng ứng dụng để quyết định xem cách gán nào hoạt động và Steam sẽ theo dõi cửa sổ ở nền trước. Điều này có thể khiến việc debug tay cầm trở nên phức tạp khi bạn đang thao tác với nó, bởi vì tay cầm sẽ thay đổi thiết lập của nó khi bạn chạm breakpoint trong công cụ debug. Có hai cách để bắt Steam khóa chọn cửa sổ của bạn cho việc debug, chạy đường dẫn URL Steam sau:
steam://forceinputappid/<your_game's_AppID or 0 to reset to normal operation>

hoặc thêm các tham số dòng lệnh sau trong lối tắt Steam của bạn:
-forcecontrollerappid <AppID_trò_chơi_của_bạn

LƯU Ý:

Khi nói "lối tắt Steam" chúng tôi muốn nói đến lối tắt của chính phần mềm Steam. Dòng lệnh phải được dán vào phần mềm Steam chứ không phải trò chơi của bạn.

Bạn cũng có thể tải render chính thức cho biểu tượng tay cầm hoặc nguồn PSD của chúng. Quá trình này chỉ cần thiết nếu bạn muốn dùng chúng làm khởi điểm cho phong cách hình họa của mình. Không thì bạn có thể dùng API để lấy đường dẫn file trực tiếp tới hình họa phù hợp cho bất kỳ đầu vào tay cầm nào (file ảnh này được đi cùng với chính phần mềm Steam).

Bước 3.1 - Tổng quan về API


API Steam Input được phát triển quanh hành động & bộ hành động trò chơi mà bạn định nghĩa trong file hành động trong trò chơi tại bước 1.

Để tham khảo toàn bộ về API, xem Interface ISteamInput

Tổng quan về tính năng như sau:

Các interface an toàn

Dữ liệu tay cầm được thu thập khi gọi ISteamInput::RunFrame. Thông thường nó được làm cho bạn với mỗi khung hình bởi SteamAPI_RunCallbacks. Tuy nhiên, nếu bạn có bật các interface phiên bản an toàn và thấy mình không nhận được dữ liệu thăm dò tốt, bạn sẽ cần gọi ISteamInput::RunFrame mỗi khung hình.

Có thể nhận biết nếu đã bật các interface phiên bản an toàn hay chưa bằng cách xem đã có #define này trong code của mình:
VERSION_SAFE_STEAM_API_INTERFACES

Bước 3.2 - Xử lý đầu vào


Với hành động digital, dữ liệu trả về bởi ISteamInput::GetDigitalActionData khá đơn giản:

bState: sẽ là true nếu hành động được gửi bởi tay cầm (nút được ấn, cò được kéo, v.v...)

Với hành động analog, dữ liệu trả về bởi ISteamInput::GetAnalogActionData chỉ hơi phức tạp hơn một chút:

x,y: sẽ phụ thuộc vào chế độ bạn gán cho hành động trong trò chơi bên trong file IGA. - "absolute_mouse": x & y sẽ là các delta từ vị trí trước đó của chuột. - "joystick_move": x & y sẽ là các giá trị từ -1 & 1, đại diện cho vị trí hiện tại của cần trỏ.

Khi làm code, nhớ đảm bảo bạn không ngăn người dùng kết hợp đồng thời các tín hiệu đầu vào khác nhau. Một lỗi phổ biến chúng tôi thấy trong các trò chơi là chúng bắt đầu phớt lờ tín hiệu đầu vào từ tay cầm khi thấy tín hiệu từ chuột & bàn phím, hoặc ngược lại.

Bước 3.3 - Biểu tượng nút trên màn hình

Để hiển thị thông báo trên màn hình cho tay cầm, bạn cần lấy các nguồn vật lý được gán vào một hành động trong trò chơi. Người chơi có thể đã gán hơn một nguồn vật lý vào cùng một hành động, vậy nên tốt nhất là giao diện nên xoay tua hiển thị mỗi nguồn. ISteamInput::GetDigitalActionOriginsISteamInput::GetAnalogActionOrigins sẽ trả về số lượng các nguồn cho một hành động cụ thể, và sẽ điền các phần được đưa qua mảng originsOut.

Với mỗi nguồn, bạn có thể dùng enum ISteamInput::EControllerActionOrigin để gán lại nguồn đó vào hình ảnh tương ứng. Khi bạn gọi hàm này với một enum nguồn, nó sẽ trả về một đường dẫn file nội bộ tới một file .png hay .svg cho biểu tượng nút tay cầm tương ứng từ bộ hình ảnh chính thức của Valve (được tìm thấy tại thư mục cài đặt phần mềm Steam). Phương pháp này hỗ trợ tất cả thiết bị phần cứng mà Steam Input nhận diện được (vậy nên một tay cầm PlayStation sẽ hiện nút PlayStation, và một tay cầm Xbox sẽ hiện nút Xbox v.v...). Tuyệt hơn nữa, cách này không sợ lỗi thời -- khi Valve thêm hỗ trợ cho phần cứng mới, hàm này sẽ tự động lấy các biểu tượng cập nhật mà không cần bạn phải biên dịch lại trò chơi với asset biểu tượng mới.

Bạn có thể tự cung cấp ảnh của riêng mình cho biểu tượng nút tay cầm, nhưng chúng tôi cật lực khuyến nghị đảm bảo rằng chúng không lỗi thời do Steam Input luôn luôn hỗ trợ thêm các thiết bị mới và điều duy nhất ngăn chúng không hoạt động tốt với trò chơi của bạn là khi ảnh biểu tượng bị hư hoặc trống không. Bạn có thể làm một trong hai điều sau:
  • dùng ảnh dự phòng trả về bởi ISteamInput::GetGlyphForActionOrigin khi không nhận diện được nguồn của một hành động
  • gọi ISteamInput::TranslateActionOrigin để nhận được ảnh biểu tượng gần nhất tồn tại khi phiên khi phiên bản Steamworks SDK còn tồn tại, ví dụ: nút chữ thập PS6 được dịch thành nút chữ thập PS5

Liên tục thăm dò thông tin!

Vui lòng lưu ý rằng người dùng có thể thay đổi thiết lập của họ bất kỳ lúc nào. Để hỗ trợ trường hợp này, chúng tôi đảm bảo rằng hàm ISteamInput::GetDigitalActionOriginsISteamInput::GetAnalogActionOrigins tốn cực kỳ ít tài nguyên để gọi.

Khi hiển thị thông báo trên màn hình, đừng lưu nhớ đệm các nguồn đó và tiếp tục hiện kết quả ban đầu. Thay vào đó, chúng tôi khuyến nghị bạn thu thập lại nguồn với mỗi khung hình, và hiển thị thông báo tương ứng. Bằng cách này, nếu người dùng quyết định đổi thiết lập của họ sau khi thấy thông báo, khi trở lại từ màn hình thiết lập thì các thông báo sẽ tự động cập nhật để khớp với nguồn mới.

Bước 4 - Phát hành


Một khi trò chơi hoạt động với tay cầm, bạn đã sẵn sàng để phát hành. Bạn sẽ cần ra mắt cập nhật trò chơi mới và công khai chính thức thiết lập. Thiết lập chính thức được tự động nạp khi người chơi khởi động trò chơi lần đầu tiên. Điều này cho phép người dùng kích hoạt trò chơi và nhảy vào chơi ngay mà không cần đi đến màn hình thiết lập.

Dưới đây là quy trình khuyến nghị:

Bước 4.1 - Cập nhật trò chơi của bạn

  • Cập nhật depot Steam với phiên bản trò chơi mới

Bước 4.2 - Phát hành thiết lập của bạn

  • Chạy Steam trong chế độ Big Picture và điều hướng đến thiết lập mặc định đã tạo trong mục thiết lập tay cầm.
  • Nhấn nút (Y), hoặc nhấp nút "Save as" (Lưu dưới dạng) ở cuối màn hình.
  • Chọn tựa & mô tả bản địa hóa mong muốn từ popup, thay đổi thành hồ sơ CÔNG KHAI, và nhấn nút PHÁT HÀNH.
  • Bạn sẽ nhận một thông báo xác nhận, kèm mã ID file của thiết lập công khai. Sao chép/lưu mã ID.

Bước 4.3 - Công bố thiết lập một cách chính thức

  • Mở trang trò chơi trên trang web đối tác Steamworks.
  • Chọn "Steam Input" từ thẻ "Ứng dụng".

    steamworks_steam_input.png

  • Cuộn tới mục có tên "Steam Input Template" (Mẫu Steam Input). Chọn "Custom Configuration" (Tùy chỉnh thiết lập) từ menu thả xuống. (Nếu không có kế hoạch thêm hỗ trợ cho tích hợp sẵn và chỉ muốn chọn từ các mẫu có sẵn của chế độ legacy, bạn có thể thực hiện điều đó tại đây).

    steamworks_steam_input_custom_config.png

    Và từ lựa chọn bên dưới, nhấp "Add Custom Configuration" (Thêm thiết lập tùy chỉnh).

    steamworks_steam_controller_custom2.png

  • Dán mã ID file của thiết lập công khai vào khung, rồi nhấp nút OK.

    steamworks_steam_controller_custom3.png

  • Như thường lệ, đăng các thay đổi cho ứng dụng trên trang đối tác.

Nếu muốn, bạn cũng có thể chỉ định nhiều thiết lập chính thức cho trò chơi của mình. Bạn sẽ muốn tạo một chế độ chính thức gọi là "Southpaw" (thuận tay trái) chẳng hạn.

Để làm điều này, hãy tạo nhiều thiết lập và phát hành từng cái thông qua bước 4.2. Sau đó, trong bước 4.3, dán tất cả ID file cho thiết lập vào khung, cách nhau bởi dấu phẩy (,). Cái đầu tiên trong danh sách sẽ được coi là có ưu tiên cao nhất, và sẽ được chọn làm mặc định cho người chơi mới. Đừng quên đặt Tiêu đề & mô tả cho từng cái.

Khi thiết lập chính thức của bạn được đăng, chúng sẽ hiện tại mục "Custom Configuration" (thiết lập tùy chỉnh):

steamworks_steam_input_branch_settings.png

Với mỗi thiết lập mà bạn có thể lấy liên kết trực tiếp, hãy xem nó dành cho loại tay cầm gì, điều khiển nhánh beta nào mà nó trên đó, hoặc gỡ bỏ hoàn toàn. Nếu bạn tạo mới một thiết lập chính thức, bạn có thể gỡ bỏ / thêm tính năng vào mục này để thay thế cái hiện có.

Đưa các tay cầm vào Steam Input


Tiếp theo, bạn nên thiết lập loại tay cầm nào sử dụng Steam Input - nếu bạn đang dùng API Steam Input, bạn sẽ muốn đánh dấu tùy chọn "Any Future Devices" (Bất kỳ thiết bị tương lai nào) để đảm bảo rằng các tay cầm mới sẽ mặc định hoạt động được mà không cần phải điều chỉnh thêm sau khi đã phát hành lên Steam.

steamworks_steam_input_optin_settings.png

Đánh dấu các ô này sẽ khiến các loại tay cầm đó tận dụng Steam Input thay vì quy trình đầu vào tiêu chuẩn của tay cầm.

Cập nhật thiết lập chính thức của bạn

Có hai cách để cập nhật thiết lập của bạn.
  1. Để thực hiện các thay đổi lớn như thêm/gỡ bỏ một bộ hành động mới hay thêm các hành động mới cần phải được gán, tải lên một thiết lập mới cho mỗi loại tay cầm được hỗ trợ và gỡ bỏ các thiết lập cũ. Bạn cũng nên vào trang tìm duyệt thiết lập Steam Input với tài khoản đã tạo thiết lập và đánh dấu xóa chúng bằng cách nhấp:

    steamworks_remove_community_config.png
  2. Để thực hiện một thay đổi tùy chọn như thêm ngôn ngữ mới cho tên bản địa hóa của hành động hay thêm tùy chọn hành động mới mà không cần phải được gán vào mỗi thiết lập, thì tải lên một thiết lập đơn lẻ và đánh dấu "Use Action Block" (dùng khối hành động) để đảm bảo khối hành động đó được ưu tiên dùng trên nhánh đã chọn.

    steamworks_steam_input_use_action_block.png

Mẹo

Các hành động chuyên cho menu

Chúng tôi khuyến nghị tạo một bộ hành động trong trò chơi dành riêng cho điều khiển menu, thay vì tái sử dụng các hành động từ bộ chính dành cho trò chơi. Hầu hết mọi khách hàng sẽ không cần chỉnh sửa bộ điều khiển menu này, nhưng đây là một cách dễ dàng để trao quyền cho người chơi có nhu cầu thực sự (như dành cho một số game thủ khuyết tật chẳng hạn).

Biểu tượng tùy chỉnh

Hệ thống Steam Input cũng có thể tạo một số kiểu dáng cho menu trên màn hình. Đặt biểu tượng .png của bạn vào <your base game directory>/TouchMenuIcons/*.png sẽ hiện chúng lên đầu trong danh sách cho các menu cảm ứng/tròn của trò chơi. Điều này cho phép bạn thiết lập menu tròn trên màn hình hay menu cảm ứng của riêng mình với biểu tượng được gán vào các hành động cụ thể mà không cần làm thêm code trò chơi/giao diện. Là nhà phát triển bạn có thể muốn làm thế kể cả khi không thực sự có bất kỳ menu tròn hay cảm ứng nào trong thiết lập mặc định của mình. Vì bất kỳ người dùng nào chỉnh sửa thiết lập cũng sẽ truy cập được vào chúng, người dùng sẽ có thể tạo được các menu đẹp theo chủ đề, sử dụng ảnh biểu tượng chính thức của bạn.