การเผยแพร่ที่จัดการของ Play

เอกสารนี้จะแสดงวิธีเผยแพร่เกมใน Google Play Games บน PC โดยใช้การติดตั้งที่จัดการโดย Play

การติดตั้งที่จัดการโดย Play ช่วยให้ Google Play จัดการการติดตั้ง อัปเดต และถอนการติดตั้งเกมโดยใช้ไฟล์เกมและข้อมูลเมตาที่คุณระบุในไฟล์ Windows App Bundle (WAB)

ก่อนเริ่มต้น

ผสานรวม Google Play Games SDK เข้ากับเกม

แพ็กเกจเกมเป็นไฟล์ WAB

หากต้องการสร้างไฟล์ WAB ของการติดตั้งที่จัดการโดย Play ให้ทำตามขั้นตอนต่อไปนี้

  1. ดาวน์โหลดเครื่องมือเผยแพร่ของ Play คุณเรียกใช้เครื่องมือนี้ได้ในบรรทัดคำสั่งของ Windows หรือ Powershell

  2. สร้างไฟล์การกำหนดค่าการเผยแพร่ใน Play โดยใช้ชื่อใดก็ได้ เช่น play_publishing_config.xml โดยใช้รูปแบบต่อไปนี้

    <?xml version="1.0" encoding="UTF-8"?>
    <play-publishing-config version="1.0">
      <!-- Application metadata: This section contains basic information about your game. -->
      <application>
        <package-name>PACKAGE_NAME</package-name>
        <version-name>VERSION_NAME</version-name>
      </application>
    
      <!-- Game files: This section specifies which game files to include in the bundle and how to treat them. -->
      <game-files>
        <file-set>
          <root-folder-path>PATH_TO_ROOT_FOLDER</root-folder-path>
          <!-- absolute or relative to the parent directory of the config xml -->
          <!-- Exclusions: A list of files or folders to exclude from the bundle.
               This is useful for removing development files, temporary data, or redundant assets. -->
          <exclusions>
            <file-path>REGEX_PATTERN_OF_EXCLUDED_FILES</file-path>
            <file-path>PATH_TO_BE_EXCLUDED</file-path>
          </exclusions>
    
          <!-- File attributes: Define special handling for certain files during installation and updates. -->
          <file-attribute value=FILE_ATTRIBUTE_VALUE>
            <file-path>PATH_TO_FILE</file-path>
            <file-path>REGEX_PATTERN_OF_FILE_ATTRIBUTE_FILES</file-path>
          </file-attribute>
        </file-set>
      </game-files>
    
      <!-- This file represents the startup process for this game. Google Play Games for PC should start
          this process when user clicks on "Play" on this game. -->
      <launch-command>
        <path>PATH_TO_LAUNCH_FILE</path>
        <arguments>ARGUMENTS</arguments>
      </launch-command>
    
      <!-- Lifecycle operations: Custom actions to be performed during the game's installation and uninstallation. -->
      <lifecycle-operations>
        <!-- Install operations: These actions run when the game is installed. 'requiresElevation="true"'
            will trigger a UAC prompt for administrator rights. There are three types of install
            operations that can be specified. An instance of each is listed below. -->
        <install-operation requiresElevation=INSTALL_OPERATION_REQUIRES_ELEVATION>
          <operation-identifier>OPERATION_IDENTIFIER_STRING</operation-identifier>
          <execute-file>
            <path>PATH_TO_INSTALL_EXECUTE_FILE</path>
            <arguments>ARGUMENTS</arguments>
          </execute-file>
        </install-operation>
    
        <install-operation requiresElevation=INSTALL_OPERATION_REQUIRES_ELEVATION>
          <operation-identifier>OPERATION_IDENTIFIER_STRING</operation-identifier>
          <update-registry baseKey=BASE_KEY>
            <sub-key>SUB_KEY_PATH</sub-key>
            <value-name>VALUE_NAME</value-name>
            <value type=REGISTRY_VALUE_TYPE>VALUE_TEXT</value>
          </update-registry>
        </install-operation>
    
        <!-- Uninstall operations: These actions run before the game is uninstalled. -->
        <uninstall-operation requiresElevation=UNINSTALL_OPERATION_REQUIRES_ELEVATION>
          <execute-file>
            <path>PATH_TO_UNINSTALL_EXECUTE_FILE</path>
            <arguments>ARGUMENTS</arguments>
          </execute-file>
        </uninstall-operation>
      </lifecycle-operations>
    </play-publishing-config>

    แทนที่ค่าต่อไปนี้

    • PACKAGE_NAME: ชื่อแพ็กเกจของเกม นี่คือตัวระบุที่ไม่ซ้ำกันซึ่งจะเชื่อมโยงกับเกมของคุณใน Google Play เช่น com.yourcompany.yourgame ชื่อแพ็กเกจต้องเป็นไปตามกฎต่อไปนี้
      • ต้องมีอย่างน้อย 2 ส่วน (จุด 1 จุดขึ้นไป)
      • แต่ละกลุ่มต้องขึ้นต้นด้วยตัวอักษร
      • อักขระทั้งหมดต้องเป็นตัวอักษรและตัวเลขคละกันหรือขีดล่าง ([a-zA-Z0-9_])
    • VERSION_NAME: สตริงเวอร์ชันของเกม ซึ่งอาจเป็นสตริงใดก็ได้ แต่ต้องไม่ซ้ำกันใน WAB ทั้งหมดที่อัปโหลดสำหรับเกมของคุณ เช่น 1.0, 1.0.1-beta, 2025.11.24, v1.rc1
    • PATH_TO_ROOT_FOLDER: เส้นทางไปยังโฟลเดอร์รูท ที่มีไฟล์เกม ระบบจะเพิ่มไฟล์ทั้งหมดในโฟลเดอร์นี้ลงในแพ็กเกจ ยกเว้นไฟล์ที่ระบุไว้ในการยกเว้น เส้นทางนี้อาจเป็นแบบสัมบูรณ์หรือแบบสัมพัทธ์กับไดเรกทอรี ที่มีไฟล์ play_publishing_config.xml

    • exclusions: (ไม่บังคับ) ระบุเส้นทางหรือรูปแบบไฟล์ สำหรับไฟล์ภายใน PATH_TO_ROOT_FOLDER เพื่อยกเว้นจาก กลุ่ม คุณระบุองค์ประกอบ file-path หลายรายการภายในองค์ประกอบ exclusions ได้ เส้นทางแสดงได้ 2 วิธี ดังนี้

      • เป็นเส้นทางของไฟล์: เส้นทางไปยังไฟล์ที่จะยกเว้น
      • เป็นสตริงนิพจน์ทั่วไป: ระบบจะยกเว้นไฟล์ทั้งหมดที่ตรงกับสตริงนิพจน์ทั่วไปจากแพ็กเกจ ใช้ไวยากรณ์ RE2
    • file-attribute: (ไม่บังคับ) กำหนดแอตทริบิวต์สำหรับ ไฟล์ที่เฉพาะเจาะจงหรือไฟล์ที่ตรงกับรูปแบบนิพจน์ทั่วไป

      • FILE_ATTRIBUTE_VALUE: อาจมีสถานะใดสถานะหนึ่งดังต่อไปนี้
        • SKIP_UPDATE: ในระหว่างการอัปเดต แอตทริบิวต์นี้จะบอกให้ระบบคัดลอกไฟล์เฉพาะในกรณีที่ยังไม่มีไฟล์นั้นอยู่ เพื่อรักษาการเปลี่ยนแปลงใดๆ ในไฟล์ที่มีอยู่
        • MODIFIED_ON_DEVICE: ใช้สำหรับไฟล์ที่ต้องอัปเดต แต่แก้ไขในอุปกรณ์ได้หลังการติดตั้ง ระบบจะดาวน์โหลดไฟล์ใหม่แบบเต็มและเขียนทับเวอร์ชันที่ติดตั้งไว้ในระหว่างการอัปเดต หากไฟล์นี้แตกต่างจากเวอร์ชันที่ติดตั้งระหว่างการตรวจสอบความสมบูรณ์ของการติดตั้ง ระบบจะไม่ถือว่าการติดตั้งเสียหาย
      • file-path: ระบุไฟล์สำหรับแอตทริบิวต์นี้ คุณใส่เอลิเมนต์ file-path ได้หลายรายการภายในเอลิเมนต์ file-attribute แต่ละรายการ แต่ละเส้นทางสามารถ แสดงได้ 2 วิธี ดังนี้
        • เป็นเส้นทางของไฟล์: เส้นทางไปยังไฟล์ที่จะเชื่อมโยงแอตทริบิวต์นี้ด้วย
        • เป็นสตริงนิพจน์ทั่วไป: ระบบจะเชื่อมโยงไฟล์ทั้งหมดที่ตรงกับสตริงนิพจน์ทั่วไป กับค่าแอตทริบิวต์ ใช้ไวยากรณ์ RE2
    • PATH_TO_LAUNCH_FILE: เส้นทางไปยังไฟล์ที่เรียกใช้งานได้ซึ่งใช้เพื่อ เปิดเกม

    • ARGUMENTS: (ไม่บังคับ) อาร์กิวเมนต์บรรทัดคำสั่ง องค์ประกอบ <arguments> ใช้เพื่อส่งอาร์กิวเมนต์ไปยังไฟล์ที่เรียกใช้งานได้ซึ่งระบุไว้ใน <launch-command>, <install-operation> หรือ <uninstall-operation> การใช้องค์ประกอบ <arguments> แต่ละครั้งจะมีผลกับไฟล์ที่เรียกใช้งานได้ซึ่งกำหนดไว้ข้างๆ เท่านั้น ซึ่งจะช่วยให้คุณระบุอาร์กิวเมนต์ที่แตกต่างกันสำหรับไฟล์ที่เรียกใช้งานได้ที่แตกต่างกัน

      • หากไฟล์ที่เรียกใช้งานได้มีอาร์กิวเมนต์หลายรายการ ให้คั่นด้วยการเว้นวรรค
      • เพิ่มอาร์กิวเมนต์ด้วย -- หรือ - หากไฟล์ที่เรียกใช้งานต้องใช้ ตัวอย่าง
        <arguments>--package_name --version_name</arguments>
    • lifecycle-operations: (ไม่บังคับ) การดำเนินการที่กำหนดเองเพื่อ ดำเนินการระหว่างการติดตั้งหรือถอนการติดตั้งเกม

      • install-operation: การดำเนินการที่จะเรียกใช้เมื่อติดตั้งเกม คุณระบุการดำเนินการติดตั้งได้ 2 ประเภท ได้แก่ execute-file และ update-registry
      • uninstall-operation: การดำเนินการที่จะเรียกใช้ก่อนถอนการติดตั้งเกม ระบบจะเปลี่ยนกลับการดำเนินการ update-registry โดยอัตโนมัติในระหว่างการถอนการติดตั้ง
      • INSTALL_OPERATION_REQUIRES_ELEVATION: ระบุว่าการดำเนินการติดตั้งต้องเรียกใช้ด้วยสิทธิ์ของผู้ดูแลระบบหรือไม่

        • "true": เรียกใช้ในฐานะผู้ดูแลระบบ
        • "false": เรียกใช้ในฐานะผู้ใช้ปัจจุบัน โดยจะเป็นค่าเริ่มต้นหากไม่ได้ระบุ
      • UNINSTALL_OPERATION_REQUIRES_ELEVATION: ระบุว่าการดำเนินการถอนการติดตั้งต้องเรียกใช้ด้วยสิทธิ์ของผู้ดูแลระบบหรือไม่

        • "true": เรียกใช้ในฐานะผู้ดูแลระบบ
        • "false": เรียกใช้ในฐานะผู้ใช้ปัจจุบัน โดยจะเป็นค่าเริ่มต้นหากไม่ได้ระบุ
      • operation-identifier: สตริงที่ไม่ซ้ำกันเพื่อระบุ install-operation

      • execute-file: เรียกใช้ไฟล์ที่เรียกใช้งานได้

        • PATH_TO_INSTALL_EXECUTE_FILE: เส้นทางไปยัง ไฟล์ที่เรียกใช้งานได้เพื่อเรียกใช้ระหว่างการติดตั้ง
        • PATH_TO_UNINSTALL_EXECUTE_FILE: เส้นทางไปยัง ไฟล์ที่เรียกใช้งานได้เพื่อเรียกใช้ก่อนการถอนการติดตั้ง
      • update-registry: สร้างหรืออัปเดตรายการรีจิสทรีของ Windows

        • BASE_KEY: กำหนดคีย์รูทที่จะใช้ในรีจิสทรีของ Windows ค่าที่ยอมรับ: HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_PERFORMANCE_DATA และ HKEY_USERS เมื่อดำเนินการ update-registry ให้ตั้งค่า requiresElevation="true" ในองค์กรระดับบนสุด install-operation โดยอิงตาม baseKey ที่ใช้ ดังนี้
          • HKEY_LOCAL_MACHINE หรือ HKEY_CURRENT_CONFIG ตั้งค่า requiresElevation="true"
          • HKEY_CURRENT_USER: ไม่จำเป็นต้องใช้ requiresElevation="true"
          • HKEY_CLASSES_ROOT: ตั้งค่า requiresElevation="true" เฉพาะในกรณีที่เขียนไปยังส่วนระดับเครื่อง ไม่จำเป็นสำหรับส่วนที่เฉพาะเจาะจงผู้ใช้
          • HKEY_USERS: มีโปรไฟล์สำหรับผู้ใช้ทั้งหมด ตั้งค่า requiresElevation="true" เมื่อแก้ไขโปรไฟล์อื่นที่ไม่ใช่ของผู้ใช้ปัจจุบัน (เช่น ผู้ใช้รายอื่นหรือ .DEFAULT)
        • SUB_KEY_PATH: แสดงเส้นทางไปยังคีย์ที่เฉพาะเจาะจงภายในรีจิสทรีของ Windows ซึ่งซ้อนอยู่ภายใต้baseKeyหลัก
        • VALUE_NAME: ระบุชื่อของรายการข้อมูลที่คุณต้องการแก้ไขภายในคีย์ย่อยที่กำหนด
        • REGISTRY_VALUE_TYPE: แอตทริบิวต์นี้ระบุประเภทข้อมูลของค่าที่จะเขียนลงในรีจิสทรี ค่าที่รองรับคือ STRING สำหรับสตริง หรือ DWORD สำหรับตัวเลข 32 บิต
        • VALUE_TEXT: ข้อมูลที่จะจัดเก็บในคีย์รีจิสทรี

    วิธีใช้นิพจน์ทั่วไป

    คุณสามารถใช้นิพจน์ทั่วไปของไวยากรณ์ RE2 ในfile-path แท็กเพื่อใช้การยกเว้นหรือแอตทริบิวต์ไฟล์กับกลุ่มไฟล์ อย่าลืมใช้เครื่องหมายทับ / เป็นตัวคั่นไดเรกทอรี และใช้แบ็กสแลช \ เพื่อหลีกเลี่ยงอักขระนิพจน์ทั่วไปพิเศษ เช่น ใช้ \. เพื่อจับคู่กับจุดทศนิยม . หรือ \d เพื่อจับคู่กับตัวเลข

    ตัวอย่างที่พบบ่อยมีดังนี้

    • จับคู่ไฟล์ทั้งหมดที่มีนามสกุลที่เฉพาะเจาะจง (เช่น .log) ในไดเรกทอรีใดก็ได้

      ใช้ .*\.log เพื่อจับคู่เส้นทางที่ลงท้ายด้วย .log เช่น game.log หรือ logs/errors.log

      <file-path>.*\.log</file-path>
    • จับคู่ไฟล์และไดเรกทอรีย่อยทั้งหมดภายในโฟลเดอร์ที่เฉพาะเจาะจง (เช่น "temp")

      ใช้ temp/.* เพื่อจับคู่เส้นทางทั้งหมดที่ขึ้นต้นด้วย temp/ เช่น temp/data.txt หรือ temp/saves/file.sav

      <file-path>temp/.*</file-path>
    • จับคู่ไฟล์ที่ตรงกับรูปแบบในโฟลเดอร์ที่เฉพาะเจาะจง

      ใช้ assets/level\d\.dat เพื่อจับคู่ assets/level1.dat, assets/level2.dat แต่ ไม่ใช่ assets/other.dat

      <file-path>assets/level\d\.dat</file-path>
    • จับคู่ชื่อโฟลเดอร์เมื่อปรากฏที่ใดก็ได้ในเส้นทาง

      ใช้ .*/cache/.* เพื่อจับคู่ไฟล์ในไดเรกทอรีที่ชื่อ cache เช่น game/cache/file.txt หรือ temp/cache/other.log

      <file-path>.*/cache/.*</file-path>
    • จับคู่ไฟล์ที่มีนามสกุลใดนามสกุลหนึ่ง (เช่น .ini, .cfg, .sav)

      ใช้ .*\.(ini|cfg|sav) เพื่อจับคู่ไฟล์ที่ลงท้ายด้วย .ini, .cfg หรือ .sav เช่น settings.ini, config.cfg หรือ saves/slot1.sav

      <file-path>.*\.(ini|cfg|sav)</file-path>
    • จับคู่ไฟล์ที่มีนามสกุลที่เฉพาะเจาะจงในไดเรกทอรีที่เฉพาะเจาะจง (เช่น .ogg ใน music/ หรือ sfx/)

      ใช้ (music|sfx)/.*\.ogg เพื่อจับคู่ไฟล์ .ogg ใดก็ได้ที่อยู่ในไดเรกทอรี music/ หรือ sfx/ แต่ไม่ใช่ที่อื่น ตรงกับ music/level1.ogg หรือ sfx/explosion.ogg แต่ไม่ตรงกับ voice/intro.ogg

      <file-path>(music|sfx)/.*\.ogg</file-path>

    ตัวอย่างไฟล์กำหนดค่าการเผยแพร่ใน Play

    ตัวอย่าง play_publishing_config.xml สำหรับเกมชื่อ TestGame มีดังนี้

    <?xml version="1.0" encoding="UTF-8"?>
    <play-publishing-config version="1.0">
      <application>
        <package-name>com.test.package</package-name>
        <version-name>1.0</version-name>
      </application>
    
      <game-files>
        <file-set>
          <root-folder-path>C:\Users\Username\game-files</root-folder-path>
          <exclusions>
            <file-path>mock_game\d\.exe</file-path> <!-- exclude files using a regex -->
            <file-path>deprecated_graphics</file-path> <!-- exclude a folder -->
            <file-path>.*\.log</file-path> <!-- recursively exclude all files with .log extension -->
          </exclusions>
    
          <file-attribute value="SKIP_UPDATE">
            <file-path>settings.ini</file-path>
          </file-attribute>
    
          <file-attribute value="MODIFIED_ON_DEVICE">
            <file-path>game_assets\d\.zip</file-path> <!-- define the path using regex -->
          </file-attribute>
        </file-set>
      </game-files>
    
      <launch-command>
        <path>launcher_test_game.exe</path>
        <arguments>--launch-arg</arguments> <!-- optional -->
      </launch-command>
    
      <lifecycle-operations>
        <install-operation requiresElevation="true">
          <operation-identifier>elevated-execute-file</operation-identifier>
          <execute-file>
            <path>install_file.exe</path>
            <arguments>--arg</arguments> <!-- optional -->
          </execute-file>
        </install-operation>
    
        <install-operation requiresElevation="true">
          <operation-identifier>elevated-update-registry</operation-identifier>
          <update-registry baseKey="HKEY_LOCAL_MACHINE">
            <sub-key>SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TestGame</sub-key>
            <value-name>InstallLocation</value-name>
            <value type="STRING">C:\Program Files\TestGame</value>
          </update-registry>
        </install-operation>
    
        <uninstall-operation requiresElevation="true">
          <execute-file>
            <path>uninstall.exe</path>
            <arguments>--test-arg</arguments> <!-- optional -->
          </execute-file>
        </uninstall-operation>
      </lifecycle-operations>
    </play-publishing-config>
  3. เรียกใช้เครื่องมือเผยแพร่ Play ในบรรทัดคำสั่งของ Windows หรือ PowerShell โดยใช้คำสั่ง build-bundle ดังนี้

    playpublishingtool.exe build-bundle --input=PLAY_PUBLISHING_CONFIG_PATH --output=WAB_OUTPUT_PATH
    

    หากต้องการเขียนทับไฟล์ WAB ที่มีอยู่ซึ่งมีชื่อเดียวกัน ให้ใช้อาร์กิวเมนต์ --force

    playpublishingtool.exe build-bundle --input=PLAY_PUBLISHING_CONFIG_PATH --output=WAB_OUTPUT_PATH --force
    

    แทนที่ค่าต่อไปนี้

    • PLAY_PUBLISHING_CONFIG_PATH: เส้นทางไปยังการกำหนดค่าการเผยแพร่ใน Play เช่น path\to\play_publishing_config.xml
    • WAB_OUTPUT_PATH: เส้นทางไปยังไฟล์ WAB เช่น path\to\output_bundle.wab

    วิธีใช้เครื่องมือเผยแพร่ใน Play

    หากคุณมี playpublishingtool.exe, play_publishing_config.xml และไฟล์เกมใน game_files/ ในไดเรกทอรีการทำงานปัจจุบัน ให้ทำดังนี้

    .\
    ├── game_files/
    ├── play_publishing_config.xml
    ├── playpublishingtool.exe
    

    หากต้องการสร้าง pmi_bundle.wab ในไดเรกทอรีเดียวกัน ให้เรียกใช้คำสั่งต่อไปนี้

    playpublishingtool.exe build-bundle --input=play_publishing_config.xml --output=pmi_bundle.wab
    

    ขณะที่เครื่องมือสร้างแพ็กเกจ คุณจะเห็นแถบความคืบหน้าในเทอร์มินัล

    Building bundle: [====       ] 40%
    

    หากสำเร็จ คุณควรเห็นเอาต์พุตคล้ายกับตัวอย่างต่อไปนี้

    Building bundle: [===========] 100%
    Successfully built the managed install bundle at pmi_bundle.wab
    

    ค้นหาไฟล์ WAB ในโฟลเดอร์ต่อไปนี้

      .\
      ├── game_files/
      ├── pmi_bundle.wab
      ├── play_publishing_config.xml
      ├── playpublishingtool.exe