{"id":19466803,"url":"https://github.com/dena/anjin","last_synced_at":"2025-04-05T12:05:43.545Z","repository":{"id":147939656,"uuid":"614848860","full_name":"DeNA/Anjin","owner":"DeNA","description":"Autopilot tool for games made with Unity","archived":false,"fork":false,"pushed_at":"2024-10-29T08:18:12.000Z","size":870,"stargazers_count":125,"open_issues_count":2,"forks_count":7,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-10-29T09:38:00.715Z","etag":null,"topics":["integration-testing","testing","unity","unity3d"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DeNA.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-16T12:55:03.000Z","updated_at":"2024-10-29T08:18:16.000Z","dependencies_parsed_at":"2024-02-13T06:29:17.130Z","dependency_job_id":"a0a34de6-8b99-4226-be72-e78454033491","html_url":"https://github.com/DeNA/Anjin","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeNA%2FAnjin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeNA%2FAnjin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeNA%2FAnjin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeNA%2FAnjin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DeNA","download_url":"https://codeload.github.com/DeNA/Anjin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247332604,"owners_count":20921853,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["integration-testing","testing","unity","unity3d"],"created_at":"2024-11-10T18:30:19.054Z","updated_at":"2025-04-05T12:05:43.519Z","avatar_url":"https://github.com/DeNA.png","language":"C#","readme":"# Anjin\n\n[![Meta file check](https://github.com/DeNA/Anjin/actions/workflows/metacheck.yml/badge.svg)](https://github.com/DeNA/Anjin/actions/workflows/metacheck.yml)\n[![openupm](https://img.shields.io/npm/v/com.dena.anjin?label=openupm\u0026registry_uri=https://package.openupm.com)](https://openupm.com/packages/com.dena.anjin/)\n\nClick [日本語](./README_ja.md) for the Japanese page if you need.\n\n**Anjin** is an autopilot framework for games made with Unity.\nIt consists of the following two elements.\n\n1. A dispatcher that launches the corresponding Agent according to the Scene loaded in the game\n2. An Agent that realizes auto-execution closed to the Scene\n\nAgents are small, isolated C# scripts that perform specific operations, such as playback of UI operations or monkey tests.\nIn addition to the built-in ones, you can implement and use ones specific to your game title.\n\n\n\n## Installation\n\nYou can choose from two typical installation methods.\n\n### Install via Package Manager window\n\n1. Open the **Package Manager** tab in Project Settings window (**Editor \u003e Project Settings**)\n2. Click **+** button under the **Scoped Registries** and enter the following settings (figure 1.):\n   1. **Name:** `package.openupm.com`\n   2. **URL:** `https://package.openupm.com`\n   3. **Scope(s):** `com.dena`, `com.cysharp`, and `com.nowsprinting`\n3. Open the Package Manager window (**Window \u003e Package Manager**) and select **My Registries** in registries drop-down list (figure 2.)\n4. Click **Install** button on the `com.dena.anjin` package\n\n**Figure 1.** Package Manager tab in Project Settings window.\n\n![](Documentation~/ProjectSettings_Dark.png#gh-dark-mode-only)\n![](Documentation~/ProjectSettings_Light.png#gh-light-mode-only)\n\n**Figure 2.** Select registries drop-down list in Package Manager window.\n\n![](Documentation~/PackageManager_Dark.png#gh-dark-mode-only)\n![](Documentation~/PackageManager_Light.png#gh-light-mode-only)\n\n\u003e [!NOTE]  \n\u003e Do not forget to add `com.cysharp` and `com.nowsprinting` into scopes. These are used within Anjin.\n\n\u003e [!NOTE]  \n\u003e Required install [Unity Test Framework](https://docs.unity3d.com/Packages/com.unity.test-framework@latest) package v1.3 or later for running tests (when adding to the `testables` in package.json).\n\n### Install via OpenUPM-CLI\n\nIf you installed [openupm-cli](https://github.com/openupm/openupm-cli), run the command below:\n\n```bash\nopenupm add com.dena.anjin\n```\n\n`UNITY_INCLUDE_TESTS || DENA_AUTOPILOT_ENABLE` is set in the Define Constraints of the Assembly Definition File, So excluded from the release build in principle.\n\n\n### Recommended .gitignore\n\nThe following files are automatically generated when you start Anjin.\nThere is no need to track it, so we recommend adding it to your project's .gitignore file (or ignore settings of using VCS).\n\n```\n/[Aa]ssets/[Aa]utopilot[Ss]tate.asset*\n```\n\nAnd, the following files will be generated if you use the Automated QA package.\nWe recommend ignoring these as well.\n\n```\n/[Aa]ssets/[Aa]utomated[Qq][Aa]*\n/[Aa]ssets/[Rr]ecordings*\n```\n\n\n\n## Settings for game title\n\nAfter installing the UPM package in the game title Unity project, configure and implement the following.\n\n- Generate and configure the AutopilotSettings.asset file\n- Generate and configure the .asset file for the Agent to be used\n- Implement a custom Agent if necessary\n- Implement initialization process as needed\n\n\u003e [!NOTE]  \n\u003e Set `UNITY_INCLUDE_TESTS || DENA_AUTOPILOT_ENABLE` in the Define Constraints of the Assembly Definition File to which they belong to exclude them from release builds.\n\n\n### Generate and configure the AutopilotSettings.asset file\n\nRight-click in the Unity Editor's Project window to open the context menu, then select\n**Create \u003e Anjin \u003e Autopilot Settings**\nto create the file.\nThe file name is arbitrary, and multiple files can be created and used within a project.\n\nThere are three main settings.\n\n#### Agent Assignment\n\n##### Scene Agent Mapping and Fallback Agent\n\nSet up a mapping of Agent configuration files (.asset) to be automatically executed for each Scene.\n\nSet the combination of `Scene` and `Agent`.\nThe order does not affect the operation.\nIf a Scene does not exist in the list, the Agent set in `Fallback Agent` will be used.\n\nFor example, if you want `UGUIMonkeyAgent` to work for all Scenes, set `Scene Agent Maps` to empty, and set\nSet the `Fallback Agent` to an `UGUIMonkeyAgent`'s .asset file.\n\n##### Scene Crossing Agents\n\nSet the Agents to run by scene crossing, independent of `Scene Agent Maps` and `Fallback Agent`.\n\nThe specified agents will have the same lifespan as Autopilot (i.e., use `DontDestroyOnLoad`)\nfor specifying, e.g., `ErrorHandlerAgent` and `UGUIEmergencyExitAgent`.\n\n\u003e [!WARNING]  \n\u003e Recommend set an [ErrorHandlerAgent](#ErrorHandlerAgent) to interrupt Autopilot if an exception occurs during execution.\n\n#### Autopilot Lifespan Settings\n\n\u003cdl\u003e\n  \u003cdt\u003eLifespan\u003c/dt\u003e\u003cdd\u003eSpecifies the execution time limit in seconds. Defaults to 300 seconds, 0 specifies unlimited operation.\n        This item can also be overridden from the command line (see below).\u003c/dd\u003e\n  \u003cdt\u003eExit Code\u003c/dt\u003e\u003cdd\u003eSelect the exit code used when Autopilot lifespan expires.\u003c/dd\u003e\n  \u003cdt\u003eCustom Exit Code\u003c/dt\u003e\u003cdd\u003eSpecify the exit code as an integer value.\u003c/dd\u003e\n  \u003cdt\u003eMessage\u003c/dt\u003e\u003cdd\u003eMessage sent by the Reporter when Autopilot lifespan expires.\u003c/dd\u003e\n\u003c/dl\u003e\n\n#### Autopilot Run Settings\n\n\u003cdl\u003e\n  \u003cdt\u003eRandom Seed\u003c/dt\u003e\u003cdd\u003eSpecify when you want to fix the seed given to the pseudo-random number generator (optional). This is a setting related to the pseudo-random number generator used by the autopilot. To fix the seed of the pseudo-random number generator in the game itself, it is necessary to implement this setting on the game title side. \n        This item can also be overridden from the command line (see below).\u003c/dd\u003e\n  \u003cdt\u003eTime Scale\u003c/dt\u003e\u003cdd\u003eTime.timeScale. Default is 1.0.\n        This item can also be overridden from the command line (see below).\u003c/dd\u003e\n  \u003cdt\u003eOutput Root Path\u003c/dt\u003e\u003cdd\u003eOutput files root directory path used by Agents, Loggers, and Reporters. When a relative path is specified, the origin is the project root in the Editor, and Application.persistentDataPath on the Player.\n        This item can also be overridden from the command line (see below).\u003c/dd\u003e\n  \u003cdt\u003eScreenshots Path\u003c/dt\u003e\u003cdd\u003eScreenshots output directory path used by Agents. When a relative path is specified, relative to the outputRootPath.\n        This item can also be overridden from the command line (see below).\u003c/dd\u003e\n  \u003cdt\u003eClean Screenshots\u003c/dt\u003e\u003cdd\u003eClean screenshots under screenshotsPath when launching Autopilot.\u003c/dd\u003e\n  \u003cdt\u003eLoggers\u003c/dt\u003e\u003cdd\u003eLogger used for this autopilot settings. If omitted, \u003ccode\u003eDebug.unityLogger\u003c/code\u003e will be used as default.\u003c/dd\u003e\n  \u003cdt\u003eReporters\u003c/dt\u003e\u003cdd\u003eReporter to be called on Autopilot terminate.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### Generate and configure the Agent setting file (.asset)\n\nWhether you use the built-in Agent or implement custom Agent, you must create an instance (.asset file) of it in the Unity editor.\n\nInstances are created by right-clicking in the Project window of the Unity editor to open the context menu, then selecting\n**Create \u003e Anjin \u003e Agent type name**.\n\nSelect the generated file, Agent-specific settings are displayed in the inspector and can be customized.\nYou can prepare multiple Agents with different settings for the same Agent type and use them in different Scenes.\n\n\n### Generate and configure the Logger setting file (.asset)\n\nLogger instances are created by right-clicking in the Project window of the Unity editor to open the context menu, then selecting\n**Create \u003e Anjin \u003e Logger type name**.\n\nSelect the generated file, Logger-specific settings are displayed in the inspector and can be customized.\nYou can prepare multiple Loggers with different settings for the same Logger type.\n\n\n### Generate and configure the Reporter setting file (.asset)\n\nReporter instances are created by right-clicking in the Project window of the Unity editor to open the context menu, then selecting\n**Create \u003e Anjin \u003e Reporter type name**.\n\nSelect the generated file, Reporter-specific settings are displayed in the inspector and can be customized.\nYou can prepare multiple Reporters with different settings for the same Reporter type.\n\n\n\n## Run autopilot\n\nAutopilot can be run in the Unity editor in three ways.\n\n\n### 1. Run on play mode in Unity editor (GUI)\n\nOpen the AutopilotSettings file you wish to run in the inspector and click the **Run** button to launch Autopilot.\nAfter the set run time has elapsed, or as in normal play mode, clicking the Play button will stop the program.\n\n\u003e [!TIP]  \n\u003e If you start the Autopilot in Edit Mode, so return to Edit Mode when the Autopilot is terminated.\n\u003e If you start the Autopilot in Play Mode, Play Mode will continue even after the autopilot is terminated.\n\n\n### 2. Launch from command line\n\nTo launch from the command line, specify the following arguments.\n\n```bash\n$(UNITY) \\\n  -projectPath $(PROJECT_HOME) \\\n  -batchmode \\\n  -executeMethod DeNA.Anjin.Editor.Commandline.Bootstrap \\\n  -AUTOPILOT_SETTINGS Assets/Path/To/AutopilotSettings.asset\n```\n\n- `UNITY` is the path to the Unity editor, and `PROJECT_HOME` is the root of the project to be autorun.\n- `-AUTOPILOT_SETTINGS` is the path to the settings file (AutopilotSettings) you want to run.\n- Do not specify `-quit` (it will exit without entering play mode).\n- Do not specify `-nographics` (do not show GameView window).\n\nIn addition, some settings can be overridden by adding the following arguments.\nFor details on each argument, see the entry of the same name in the \"Generate and configure the AutopilotSettings.asset file\" mentioned above.\nIn both cases, the key should be prefixed with `-` and specified as `-LIFESPAN_SEC 60`.\n\n\u003cdl\u003e\n  \u003cdt\u003eLIFESPAN_SEC\u003c/dt\u003e\u003cdd\u003eSpecifies the execution time limit in seconds\u003c/dd\u003e\n  \u003cdt\u003eRANDOM_SEED\u003c/dt\u003e\u003cdd\u003eSpecifies when you want to fix the seed given to the pseudo-random number generator\u003c/dd\u003e\n  \u003cdt\u003eTIME_SCALE\u003c/dt\u003e\u003cdd\u003eSpecifies the Time.timeScale. Default is 1.0\u003c/dd\u003e\n  \u003cdt\u003eOUTPUT_ROOT_DIRECTORY_PATH\u003c/dt\u003e\u003cdd\u003eOutput files root directory path used by Agents, Loggers, and Reporters.\u003c/dd\u003e\n  \u003cdt\u003eSCREENSHOTS_DIRECTORY_PATH\u003c/dt\u003e\u003cdd\u003eScreenshots output directory path used by Agents.\u003c/dd\u003e\n\u003c/dl\u003e\n\nThe following arguments are only valid when launching the Unity Editor and Anjin from the command line.\n\n\u003cdl\u003e\n  \u003cdt\u003eGAME_VIEW_WIDTH\u003c/dt\u003e\u003cdd\u003eSet GameView width. This argument is only used to launch in editor from command line. Default is 640.\u003c/dd\u003e\n  \u003cdt\u003eGAME_VIEW_HEIGHT\u003c/dt\u003e\u003cdd\u003eSet GameView height. This argument is only used to launch in editor from command line. Default is 480.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003e [!IMPORTANT]  \n\u003e Shown GameView window even in batchmode.\n\u003e We have confirmed that it works with Xvfb, but since Unity does not officially support it, it may not be available in the future.\n\n\n### 3. Run in Play Mode tests\n\nAutopilot works within your test code using the static method `Launcher.LaunchAutopilotAsync(string)`.\nSpecify the `AutopilotSettings` file path via the argument.\n\n```\n[Test]\npublic async Task LaunchAutopilotInTest()\n{\n  // Load the first scene (required scene in \"Scenes in Build\")\n  await SceneManager.LoadSceneAsync(\"Title\");\n\n  // Launch autopilot\n  await Launcher.LaunchAutopilotAsync(\"Assets/Path/To/AutopilotSettings.asset\");\n}\n```\n\n\u003e [!WARNING]  \n\u003e The default timeout for tests is 3 minutes. If the autopilot execution time exceeds 3 minutes, please specify the timeout time with the `Timeout` attribute.\n\n\u003e [!WARNING]  \n\u003e When running tests on a player, any necessary configuration files must be placed in the `Resources` folder to be included in the player build. It can use `IPrebuildSetup` and `IPostBuildCleanup` to insert processing into the test player build.\n\u003e The file path is specified relative to the `Resources` folder without the extension (\".asset\").\n\n\u003e [!NOTE]  \n\u003e The test will fail if the test-runner detects a `LogException` or  `LogError` output. You can suppress this by using `LogAssert.ignoreFailingMessages` assuming that you will use Anjin for error handling.\n\n\u003e [!NOTE]  \n\u003e If running multiple scenarios in succession, you can preserve the output files by specifying different paths in `AutopilotSettings.outputRootPath`.\n\n\n\n## Built-in Agents\n\nThe following Agent types are provided. These can be used as they are, or game-title-specific custom Agents can be implemented and used.\n\n\n### UGUIMonkeyAgent\n\nThis is an Agent that randomly manipulates uGUI components.\nThis Agent implementation uses open source [Monkey Test Helper](https://github.com/nowsprinting/test-helper.monkey) package.\n\nAn instance of this Agent (.asset file) can contain the following.\n\n\u003cdl\u003e\n  \u003cdt\u003eLifespan\u003c/dt\u003e\u003cdd\u003eDuration of random operation execution time in secounds. If 0 is specified, the operation is almost unlimited (TimeSpan.MaxValue). With this setting, neither Autopilot nor the app itself will exit when the Agent exits. It will not do anything until the next Scene switch\u003c/dd\u003e\n  \u003cdt\u003eDelay\u003c/dt\u003e\u003cdd\u003eWait interval [milliseconds] between random operations\u003c/dd\u003e\n  \u003cdt\u003eNo-Element Timeout\u003c/dt\u003e\u003cdd\u003eAbort Autopilot when the interactable UI/ 2D/ 3D element does not appear for the specified seconds. Disable detection if set to 0.\u003c/dd\u003e\n  \u003cdt\u003eRepeating Operation Detection Buffer Length\u003c/dt\u003e\u003cdd\u003eAbort Autopilot when repeating operation is detected within the specified buffer length. For example, if the buffer length is 10, repeating 5-step sequences can be detected. Disable detection if set to 0.\u003c/dd\u003e\n  \u003cdt\u003eEnable Gizmos\u003c/dt\u003e\u003cdd\u003eShow Gizmos on GameView during running monkey test if true\u003c/dd\u003e\n\u003c/dl\u003e\n\n#### Screenshot Options\n\n\u003cdl\u003e\n  \u003cdt\u003eEnabled\u003c/dt\u003e\u003cdd\u003eWhether screenshot is enabled or not\u003c/dd\u003e\n  \u003cdt\u003eFilename\u003c/dt\u003e\u003cdd\u003e\u003cb\u003eUse Default: \u003c/b\u003eWhether using a default prefix of screenshots filename or specifying it manually. Default value is Agent name\u003cbr\u003e\u003cb\u003ePrefix: \u003c/b\u003ePrefix of screenshots filename\u003c/dd\u003e\n  \u003cdt\u003eSuper Size\u003c/dt\u003e\u003cdd\u003eThe factor to increase resolution with. Neither this nor Stereo Capture Mode can be specified\u003c/dd\u003e\n  \u003cdt\u003eStereo Capture Mode\u003c/dt\u003e\u003cdd\u003eThe eye texture to capture when stereo rendering is enabled. Neither this nor Resolution Factor can be specified\u003c/dd\u003e\n\u003c/dl\u003e\n\n#### Click and Hold Operator Options\n\n\u003cdl\u003e\n  \u003cdt\u003eClick and Hold Millis\u003c/dt\u003e\u003cdd\u003eDelay time for click-and-hold [ms]\u003c/dd\u003e\n\u003c/dl\u003e\n\n#### Text Input Operator Options\n\n\u003cdl\u003e\n  \u003cdt\u003eGameObject Name\u003c/dt\u003e\u003cdd\u003eTarget GameObject name. If it is difficult to identify the GameObject by name, you can also use InputFieldAnnotation, which will be described later.\u003c/dd\u003e\n  \u003cdt\u003eCharacters Kind\u003c/dt\u003e\u003cdd\u003eType of characters to be entered in the InputField. The options are \"Printable\", \"Alphanumeric\", and \"Digits\".\u003c/dd\u003e\n  \u003cdt\u003eMinimum Length\u003c/dt\u003e\u003cdd\u003eMinimum number of characters that can be entered into the InputField.\u003c/dd\u003e\n  \u003cdt\u003eMaximum Length\u003c/dt\u003e\u003cdd\u003eMaximum number of characters that can be entered into the InputField.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003e [!TIP]  \n\u003e If you have a `GameObject` that you want to avoid manipulation by the `UGUIMonkeyAgent`, attach the `IgnoreAnnotation` component in the `TestHelper.Monkey.Annotations` assembly.\n\u003e See **Anjin Annotations** below for more information.\n\n\n### UGUIPlaybackAgent\n\nThis is an Agent that playback uGUI operations with the Recorded Playback feature of the [Automated QA](https://docs.unity3d.com/Packages/com.unity.automated-testing@latest) package.\n\nThe following can be set in an instance (.asset file) of this Agent.\n\n\u003cdl\u003e\n  \u003cdt\u003eRecorded JSON file\u003c/dt\u003e\u003cdd\u003eJSON file recorded by AutomatedQA package.\u003c/dd\u003e\n\u003c/dl\u003e\n\nUse the Recorded Playback window for recording operations with Automated QA. The window is opened via the Unity editor menu\n**Automated QA \u003e Automated QA Hub \u003e Recorded Playback**.\nThe recording file (.json) is saved under the Assets/Recordings/ folder and can be freely moved or renamed.\n\nNote that the Recorded Playback function in Automated QA can record operations across Scene transitions, but in Anjin, when the Scene is switched, the Agent is also forcibly switched, so playback is also interrupted.\nTherefore, please be careful to record in units of Scenes.\n\n\u003e [!IMPORTANT]  \n\u003e The Automated QA package outputs `LogType.Error` to the console when playback fails (e.g., the target Button cannot be found). The following setting is required to detect this and terminate the autopilot.\n\u003e 1. Add [ErrorHandlerAgent](#ErrorHandlerAgent) and set `Handle Error` to `Terminate Autopilot`.\n\u003e 2. Add [ConsoleLogger](#ConsoleLogger) and set `Filter LogType` to `Error` or higher.\n\n\u003e [!IMPORTANT]  \n\u003e The Automated QA package is in the preview stage. Please note that destructive changes may occur, and the package itself may be discontinued or withdrawn.\n\n\n### DoNothingAgent\n\nAn Agent that does nothing.\n\nThe following settings can be configured for this Agent instance (.asset file).\n\n\u003cdl\u003e\n  \u003cdt\u003eLifespan\u003c/dt\u003e\u003cdd\u003eSpecifies the do nothing time in seconds. 0 means unlimited time to do nothing. If 0 is specified, an unlimited amount of time for no action is taken. It will not do anything until the next Scene is switched.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### TerminateAgent\n\nTerminates the Autopilot running. It is intended to be executed after the goal of a test scenario is achieved.\n\nThe following settings can be configured for this Agent instance (.asset file).\n\n\u003cdl\u003e\n  \u003cdt\u003eExit Code\u003c/dt\u003e\u003cdd\u003eSelect the exit code used when this agent terminates the Autopilot.\u003c/dd\u003e\n  \u003cdt\u003eCustom Exit Code\u003c/dt\u003e\u003cdd\u003eInput exit code by integer value.\u003c/dd\u003e\n  \u003cdt\u003eMessage\u003c/dt\u003e\u003cdd\u003eMessage sent by the Reporter when this agent terminates the Autopilot.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### ParallelCompositeAgent\n\nAn Agent that executes multiple Agents in parallel.\n\nThe instance of this Agent (.asset file) can have the following settings.\n\n\u003cdl\u003e\n  \u003cdt\u003eAgents\u003c/dt\u003e\u003cdd\u003eA list of Agents to be executed in parallel, which can be nested by specifying a CompositeAgent\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### SerialCompositeAgent\n\nAn Agent that executes multiple Agents in series.\n\nThe instance of this Agent (.asset file) can have the following settings.\n\n\u003cdl\u003e\n  \u003cdt\u003eAgents\u003c/dt\u003e\u003cdd\u003eA list of Agents to be executed in series, which can be nested by specifying a CompositeAgent\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### OneTimeAgent\n\nAn Agent that can register one child Agent and execute it only once throughout the Autopilot execution period.\nThe second time executions will be skipped.\n\nFor example, in a game where the title scene leads to a different path only for the first time or where the user receives a login bonus only for the first time on the home scene, it is possible to construct a test scenario in which the title screen is executed as is even if a communication error or the like causes a return to the title scene.\n\nThe Agent instance (.asset file) can contain the following settings.\n\n\u003cdl\u003e\n  \u003cdt\u003eAgent\u003c/dt\u003e\u003cdd\u003eAgent that can be executed only once, which can be nested by specifying a CompositeAgent\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### RepeatAgent\n\nAn Agent that executes one child Agent indefinitely and repeatedly.\n\nCombined with SerialCompositeAgent, it can be used to repeat a sequence many times or to repeat a specific Agent.\nNote that finite iterations are not supported (to use SerialCompositeAgent).\n\nThis Agent instance (.asset file) can contain the following.\n\n\u003cdl\u003e\n  \u003cdt\u003eAgent\u003c/dt\u003e\u003cdd\u003eAgent to be executed repeatedly, which can be nested by specifying a CompositeAgent\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### TimeBombAgent\n\nAn Agent that will fail if a defuse message is not received before the inner Agent exits.\n\nFor example, pass the out-game tutorial (Things that can be completed with tap operations on uGUI, such as smartphone games).\n\n1. Set `UGUIMonkeyAgent` as the `Agent`. It should not be able to operate except for the advancing button. Set the `Lifespan Sec` with a little margin.\n2. Set the log message to be output when the tutorial is completed as the `Defuse Message`.\n\nThis Agent instance (.asset file) can contain the following.\n\n\u003cdl\u003e\n  \u003cdt\u003eAgent\u003c/dt\u003e\u003cdd\u003eWorking Agent. If this Agent exits first, the TimeBombAgent will fail.\u003c/dd\u003e\n  \u003cdt\u003eDefuse Message\u003c/dt\u003e\u003cdd\u003eDefuse the time bomb when this message comes to the log first. Regex is also available.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### ErrorHandlerAgent\n\nAn Agent that detects abnormal log messages and terminates the Autopilot running.\n\nIt should always be started at the same time as other Agents (that actually perform game operations).\nGenerally, you add to `Scene Crossing Agents` in `AutopilotSettings`.\nIf you want to change the settings for each Scene, use with `ParallelCompositeAgent`.\n\nThis Agent instance (.asset file) can contain the following.\n\n\u003cdl\u003e\n  \u003cdt\u003eHandle Exception\u003c/dt\u003e\u003cdd\u003eSpecify an Autopilot terminates or only reports when an Exception is detected in the log.\n        It can be overwritten with the command line argument \u003ccode\u003e-HANDLE_EXCEPTION\u003c/code\u003e, but be careful if multiple ErrorHandlerAgents are defined, they will all be overwritten with the same value.\u003c/dd\u003e\n  \u003cdt\u003eHandle Error\u003c/dt\u003e\u003cdd\u003eSpecify an Autopilot terminates or only reports when an Error is detected in the log.\n        It can be overwritten with the command line argument \u003ccode\u003e-HANDLE_ERROR\u003c/code\u003e, but be careful if multiple ErrorHandlerAgents are defined, they will all be overwritten with the same value.\u003c/dd\u003e\n  \u003cdt\u003eHandle Assert\u003c/dt\u003e\u003cdd\u003eSpecify an Autopilot terminates or only reports when an Assert is detected in the log.\n        It can be overwritten with the command line argument \u003ccode\u003e-HANDLE_ASSERT\u003c/code\u003e, but be careful if multiple ErrorHandlerAgents are defined, they will all be overwritten with the same value.\u003c/dd\u003e\n  \u003cdt\u003eHandle Warning\u003c/dt\u003e\u003cdd\u003eSpecify an Autopilot terminates or only reports when an Warning is detected in the log.\n        It can be overwritten with the command line argument \u003ccode\u003e-HANDLE_WARNING\u003c/code\u003e, but be careful if multiple ErrorHandlerAgents are defined, they will all be overwritten with the same value.\u003c/dd\u003e\n  \u003cdt\u003eIgnore Messages\u003c/dt\u003e\u003cdd\u003eLog messages containing the specified strings will be ignored from the stop condition. Regex is also available; escape is a single backslash (`\\`).\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003e [!TIP]  \n\u003e Recommend enabling a `Handle Exception` to interrupt Autopilot if an exception occurs during execution.\n\n\n### UGUIEmergencyExitAgent\n\nAn Agent that monitors the appearance of the `EmergencyExitAnnotations` component in the Scene and clicks on it as soon as it appears.\nThis can be used in games that contain behavior that is irregular in the execution of the test scenario, for example, communication errors or \"Return to Title Screen\" buttons that are triggered by a daybreak.\n\nIt should always be started at the same time as other Agents (that actually perform game operations).\nGenerally, you add to `Scene Crossing Agents` in `AutopilotSettings`.\nIf you want to change the settings for each Scene, use with `ParallelCompositeAgent`.\n\nThis Agent instance (.asset file) can contain the following.\n\n\u003cdl\u003e\n  \u003cdt\u003eInterval\u003c/dt\u003e\u003cdd\u003eInterval in milliseconds to check for the appearance of the EmergencyExitAnnotation component.\u003c/dd\u003e\n  \u003cdt\u003eScreenshot\u003c/dt\u003e\u003cdd\u003eTake a screenshot when click the EmergencyExit button.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\n## Built-in Loggers\n\nThe following Logger types are provided. These can be used as they are, or game-title-specific custom Loggers can be implemented and used.\n\n\n### ConsoleLogger\n\nA Logger that outputs to a console.\n\nThe instance of this Logger (.asset file) can have the following settings.\n\n\u003cdl\u003e\n  \u003cdt\u003eFilter LogType\u003c/dt\u003e\u003cdd\u003eTo selective enable debug log message\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### FileLogger\n\nA Logger that outputs to a specified file.\n\nThe instance of this Logger (.asset file) can have the following settings.\n\n\u003cdl\u003e\n  \u003cdt\u003eOutput File Path\u003c/dt\u003e\u003cdd\u003eOutput path for log file path. When a relative path is specified, relative to the \u003ccode\u003eAutopilotSettings.outputRootPath\u003c/code\u003e.\n        It can be overwritten with the command line argument \u003ccode\u003e-FILE_LOGGER_OUTPUT_PATH\u003c/code\u003e, but be careful if multiple FileLoggers are defined, they will all be overwritten with the same value.\u003c/dd\u003e\n  \u003cdt\u003eFilter LogType\u003c/dt\u003e\u003cdd\u003eTo selective enable debug log message\u003c/dd\u003e\n  \u003cdt\u003eTimestamp\u003c/dt\u003e\u003cdd\u003eOutput timestamp to log entities\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\n## Built-in Reporters\n\nThe following Reporter types are provided. These can be used as they are, or game-title-specific custom Reporters can be implemented and used.\n\n\n### JUnitXmlReporter\n\nA reporter that outputs report files in JUnit XML format.\nIf there are zero errors and zero failures, the autopilot run is considered to have completed successfully.\n\nThe instance of this Reporter (.asset file) can have the following settings.\n\n\u003cdl\u003e\n  \u003cdt\u003eOutput File Path\u003c/dt\u003e\u003cdd\u003eOutput path for JUnit XML format file. When a relative path is specified, relative to the \u003ccode\u003eAutopilotSettings.outputRootPath\u003c/code\u003e.\n        It can be overwritten with the command line argument \u003ccode\u003e-JUNIT_REPORT_PATH\u003c/code\u003e, but be careful if multiple JUnitXmlReporters are defined, they will all be overwritten with the same value.\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n### SlackReporter\n\nA Reporter that post report to Slack.\n\nThe instance of this Reporter (.asset file) can have the following settings.\n\n\u003cdl\u003e\n  \u003cdt\u003eSlack Token\u003c/dt\u003e\u003cdd\u003eSlack Bot OAuth token. If omitted, it will not be sent.\n        It can be overwritten with the command line argument \u003ccode\u003e-SLACK_TOKEN\u003c/code\u003e, but be careful if multiple SlackReporters are defined, they will all be overwritten with the same value.\u003c/dd\u003e\n  \u003cdt\u003eSlack Channels\u003c/dt\u003e\u003cdd\u003eComma-separated Slack channel name (e.g., \"#test\") or ID (e.g., \"C123456\") to post. If omitted, it will not be sent.\n        Note that the bot must be invited to the channel.\n        It can be overwritten with the command line argument \u003ccode\u003e-SLACK_CHANNELS\u003c/code\u003e, but be careful if multiple SlackReporters are defined, they will all be overwritten with the same value.\u003c/dd\u003e\n  \u003cdt\u003eMention User Group IDs\u003c/dt\u003e\u003cdd\u003eComma-separated user group IDs to mention when posting error reports.\u003c/dd\u003e\n  \u003cdt\u003eAdd @here\u003c/dt\u003e\u003cdd\u003eAdd @here to the post when posting error reports.\u003c/dd\u003e\n  \u003cdt\u003eLead Text\u003c/dt\u003e\u003cdd\u003eLead text for error reports. It is used in OS notifications. You can specify placeholders like a \"{message}\".\u003c/dd\u003e\n  \u003cdt\u003eMessage\u003c/dt\u003e\u003cdd\u003eMessage body template for error reports. You can specify placeholders like a \"{message}\".\u003c/dd\u003e\n  \u003cdt\u003eColor\u003c/dt\u003e\u003cdd\u003eAttachments color for error reports. Default color is same as Slack's \"danger\" red.\u003c/dd\u003e\n  \u003cdt\u003eScreenshot\u003c/dt\u003e\u003cdd\u003eTake a screenshot for error reports. Default is on.\u003c/dd\u003e\n  \u003cdt\u003ePost on Completion\u003c/dt\u003e\u003cdd\u003eAlso post a report if completed autopilot normally. Default is off.\u003c/dd\u003e\n\u003c/dl\u003e\n\nYou can create a Slack Bot on the following page:  \n[Slack API: Applications](https://api.slack.com/apps)\n\nThe Slack Bot needs the following permissions:\n\n- chat:write\n- files:write\n\nThe placeholders you can include in the lead and message body template are:\n\n- \"{message}\": Message with terminate (e.g., error log message)\n- \"{settings}\": Name of running AutopilotSettings\n- \"{env.KEY}\": Environment variables\n- \"{mppm-tags}\": Tags of the [Multiplayer Play Mode](https://docs.unity3d.com/Packages/com.unity.multiplayer.playmode@latest) package\n\n\n\n## Implementation of game-title-specific\n\nGame-title-specific custom Agents and initialization code must be avoided in the release build.\nCreate a unique assembly and turn off \"Auto Referenced\", and set the \"Define Constraints\" to `UNITY_INCLUDE_TESTS || DENA_AUTOPILOT_ENABLE`.\n\nThis asmdef and its storage folder can be created by opening the context menu anywhere in the Project window and selecting\n**Create \u003e Anjin \u003e Game Title Specific Assembly Folder**.\n\n\n### Game-title-specific initialization process\n\nIf your game title requires its specific initialization process, add the `InitializeOnLaunchAutopilot` attribute to the static method that does the initialization.\nAn added method is called from the autopilot launch process.\n\n```csharp\n[InitializeOnLaunchAutopilot]\npublic static void InitializeOnLaunchAutopilotMethod()\n{\n    // initialize code for your game.\n}\n```\n\nAsync methods are also supported.\n\n```csharp\n[InitializeOnLaunchAutopilot]\nprivate static async UniTask InitializeOnLaunchAutopilotMethodAsync()\n{\n    // initialize code for your game.\n}\n```\n\n\u003e [!NOTE]  \n\u003e You can specify callback order with argument. Callbacks with lower values are called before ones with higher values.\n\n\u003e [!NOTE]  \n\u003e The autopilot launch process is performed with `RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)` (default for `RuntimeInitializeOnLoadMethod`).\n\u003e Also, `RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)` implements the initialization process for Configurable Enter Play Mode.\n\n\n### Custom Agents\n\nA custom Agent is created by inheriting from `Anjin.Agents.AbstractAgent`.\nSimply implement the process to be executed by the Agent in the method `UniTask Run()`.\n\nThe following fields defined in `AbstractAgent` are available. Each instance is set before calling the `Run` method.\n\n- `Logger`: Implementation of `UnityEngine.ILogger` specified in AutopilotSettings. Use this if you want to log output in Agent.\n- `Random`: Implementation of `Anjin.Utilities.IRandom`. Which is created from a seed specified in AutopilotSettings or a startup argument.\n\nNote that it is convenient to set the `[CreateAssetMenu]` attribute to create an instance from the context menu.\n\n\n### Custom Loggers\n\nA custom Logger is created by inheriting from `Anjin.Logers.AbstractLoggerAsset`.\nYou must implement the `Logger { get; }` property to return custom `UnityEngine.ILogger` implementation.\n\nNote that it is convenient to set the `[CreateAssetMenu]` attribute to create an instance from the context menu.\n\n\n### Custom Reporters\n\nA custom Reporter is created by inheriting from `Anjin.Reporters.AbstractReporter`.\nSimply implement the method `UniTask PostReportAsync()`.\n\nNote that it is convenient to set the `[CreateAssetMenu]` attribute to create an instance from the context menu.\n\n\n\n## Anjin Annotations\n\nAnnotations are defined to control Anjin operations.\nUse the `DeNA.Anjin.Annotations` assembly by adding it to the Assembly Definition References.\nPlease note that this will be included in the release build due to the way it works.\n\n\u003e [!NOTE]  \n\u003e Even if the annotations assembly is removed from the release build, the link to the annotation component will remain Scenes and Prefabs in the asset bundle built.\n\u003e Therefore, a warning log will be output during instantiate.\n\u003e To avoid this, annotations assembly are included in release builds.\n\n\n### IgnoreAnnotation\n\nThe `GameObject` to which this component is attached avoids manipulation by the `UGUIMonkeyAgent`.\n\n\n### EmergencyExitAnnotations\n\nWhen a `Button` to which this component is attached appears, the `UGUIEmergencyExitAgent` will immediately attempt to click on it.\nIt is intended to be attached to buttons that are irregular in the execution of the test scenario, such as the \"return to title screen\" button due to a communication error or a daybreak.\n\n\n\n## Using with Multiplayer Play Mode package\n\nIt is now easy to check the operation of multiplayer games by using the [Multiplayer Play Mode](https://docs.unity3d.com/Packages/com.unity.multiplayer.playmode@latest) (MPPM) package, which is available in Unity 6 and later.\n\nBelow are some points to note when using Anjin with the MPPM package.\nThis has been checked with MPPM package v1.3.1.\n\n\n### Run on Virtual Players\n\nWhen running in [Virtual Players](https://docs-multiplayer.unity3d.com/mppm/current/virtual-players/), clicking the **Run** button in the AutopilotSettings file in Edit Mode will launch the Autopilot in all Virtual Players.\n\nLaunching in Play Mode or using different AutopilotSettings for different players is impossible.\nTo specify different behaviors for different players, you will need to implement a custom Agent that branches based on [tags](https://docs-multiplayer.unity3d.com/mppm/current/player-tags/).\n\nWhen you specify a relative path for the \"Output Root Path\" of AutopilotSettings, the base will be the directory of each Virtual Player.\nTherefore, each Virtual Player's output of Agents, Loggers, and Reporters will be preserved.\n\n\u003e [!CAUTION]  \n\u003e The Automated QA package that `UGUIPlaybackAgent` depends on writes its output files to `Application.persistentDataPath`.\n\u003e Because all the Virtual Players try to write to the same file, an error is printed to the console.\n\n\u003e [!WARNING]  \n\u003e Files under Assets are shared with Virtual Players via symbolic links.\n\u003e Therefore, when you change settings in the Inspector, you must save them using the menu item **File \u003e Save (command + S)** before re-running Autopilot.\n\n\n### Run on Play Mode Scenarios\n\nTo run in [Play Mode Scenarios](https://docs-multiplayer.unity3d.com/mppm/current/play-mode-scenario/play-mode-scenario-about/), you will need a player build that includes Anjin.\nFor instructions on how to build it, see [Run on player build](#run-on-player-build-experimental).\n\nPlay Mode Scenarios can be launched with command line arguments for each player, allowing them to use different AutopilotSettings files.\n\n\u003e [!CAUTION]  \n\u003e The Automated QA package that `UGUIPlaybackAgent` depends on writes its output files to `Application.persistentDataPath`.\n\u003e Because all the Virtual Players try to write to the same file, an error is printed to the console.\n\n\n\n## Run on player build \\[experimental\\]\n\nIt can run autopilot on the players (real devices) if Anjin is included in player builds.\n\n\u003e [!WARNING]  \n\u003e This feature is experimental.\n\u003e And Anjin itself is designed without much consideration for memory allocation, so please be careful when using it for performance testing.\n\n\n### How to build\n\n#### 1. Set the custom scripting symbols `DENA_AUTOPILOT_ENABLE` and `COM_NOWSPRINTING_TEST_HELPER_ENABLE`\n\nSet a custom scripting symbols. See below:  \n[Manual: Custom scripting symbols](https://docs.unity3d.com/Manual/custom-scripting-symbols.html)\n\n\n#### 2. Including configuration files into the player build\n\nAny necessary configuration files must be placed in the `Resources` folder to be included in the player build.\nIt can use `IPreprocessBuildWithReport` and `IPostprocessBuildWithReport` to insert processing into the player build.\n\n\n#### 3. Exclude from iCloud backup (optional)\n\nBuilt-in File Logger and Agent screenshots are output under `Application.persistentDataPath` when running the player.\nThis path is included in iCloud backup by default, so exclude it if not required.\n\n```csharp\nUnityEngine.iOS.Device.SetNoBackupFlag(Application.persistentDataPath);\n```\n\n\n#### 4. Add a launch autopilot button to the debug menu (optional)\n\ne.g., Launch autopilot with [UnityDebugSheet](https://github.com/Haruma-K/UnityDebugSheet):\n\n```csharp\nAddButton(\"Launch autopilot\", clicked: () =\u003e\n  {\n    _drawerController.SetStateWithAnimation(DrawerState.Min); // close debug menu before launch autopilot\n\n#if UNITY_EDITOR\n    const string Path = \"Assets/Path/To/AutopilotSettings.asset\";\n#else\n    const string Path = \"Path/To/AutopilotSettings\"; // relative path from Resources and without the .asset extension.\n#endif\n    Launcher.LaunchAutopilotAsync(Path).Forget();\n});\n```\n\n\u003e [!NOTE]  \n\u003e `Launcher.LaunchAutopilotAsync` can also use an overload that passes an `AutopilotSettings` instance as an argument.\n\n\n### How to launch autopilot on player build\n\nIt can also launch it using command line arguments, in addition to launching it from the debug menu.\nTo execute from the command line, specify the following arguments.\n\n```bash\n$(ROM) -LAUNCH_AUTOPILOT_SETTINGS Path/To/AutopilotSettings\n```\n\n- `ROM` is the path to the player build executable file.\n- `-LAUNCH_AUTOPILOT_SETTINGS` is the path to the settings file (AutopilotSettings) you want to run. Path is relative to the `Resources` folder and without the `.asset` extension.\n\nIt can specify the same arguments as when running in the editor.\n\n\u003e [!NOTE]  \n\u003e Built-in File Logger and Agent screenshots are output under `Application.persistentDataPath` when running the player.\n\u003e See below for each platform:  \n\u003e [Application.persistentDataPath](https://docs.unity3d.com/ScriptReference/Application-persistentDataPath.html)\n\n\u003e [!NOTE]  \n\u003e Android has a different way of specifying command line arguments. See below:  \n\u003e [Manual: Specify Android Player command-line arguments](https://docs.unity3d.com/Manual/android-custom-activity-command-line.html)\n\n\n\n## Troubleshooting\n\n### Autopilot is stopped, but the Run button in AutopilotSettings does not appear\n\nThe `AutopilotState.asset` that persists in Anjin's execution state may be in an incorrect state.\nOpen it in the inspector and click the **Reset** button.\n\nIf this does not solve the problem, try deleting `AutopilotState.asset`.\n\n\n### Autopilot runs on its own in play mode\n\nThe `AutopilotState.asset` that persists in Anjin's execution state may be in an incorrect state.\nOpen it in the inspector and click the **Reset** button.\n\nIf this does not solve the problem, try deleting `AutopilotState.asset`.\n\n\n### \\[CompilerError\\] Argument 1: Cannot convert to 'System.Threading.CancellationToken'\n\nThe following compilation error has been reported in some cases:\n\n```\n[CompilerError] Argument 1:.\nCannot convert from 'DeNA.Anjin.Reporters.SlackReporter.CoroutineRunner' to 'System.Threading.CancellationToken'\nCompiler Error at Library\\PackageCache\\com.dena.anjin@1.0.1\\Runtime\\Reporters\\SlackReporter.cs:66 column 53\n```\n\nThis compile error occurs when using UniTask v2.3.0 or older.\nThe `UniTask.WaitForEndOfFrame(MonoBehaviour)` API was implemented in UniTask v2.3.1\n\nUsually, the correct version of UniTask is installed if you follow the installation instructions.\nHowever, if UniTask is placed as an embedded package in the project, it will be prioritized.\nFind out why you have an old UniTask installed.\ne.g., Check the contents of Packages/packages-lock.json generated by the Unity editor; use your IDE's code definition jump function to check where the source file of `UniTask.WaitForEndOfFrame()` is.\n\n\n### Warning message \"settings has been obsolete\" when launch Autopilot\n\nFor example, the following warning message may be output log.\n\n```\nSlack settings in AutopilotSettings has been obsolete.\nNow, automatically converted it to SlackReporter asset file. Check it out and commit it to your VCS.\n```\n\nThis message that the obsolete setting item has been automatically converted to the new setting method (`SlackReporter` in the above example).\nThe settings file has been updated, so please check it out and commit it to your VCS (e.g., Git).\n\n\n\n## License\n\nMIT License\n\n\n## How to contribute\n\nOpen an issue or create a pull request.\nBe grateful if you could label the pull request as `enhancement`, `bug`, `chore`, and `documentation`. See [PR Labeler settings](.github/pr-labeler.yml) for automatically labeling from the branch name.\n\n\nThe general policy for accepting new features is as follows:\n\n- All built-in features can be easily configured in the Unity Editor's Inspector window.\n- Avoid adding features to the Autopilot class as much as possible, and consider expanding it with Agents, etc.\n- Refrain from adding non-general-purpose Agents, Loggers, and Reporters. Consider publishing them on your blog or Gist or placing them in Samples.\n\n\nThe following feature requests/ pull requests will be rejected because they go against the concept of Anjin:\n\n- Ability to run multiple test scenarios (AutopilotSettings) in succession. Use the feature to run from Play Mode tests.\n- Ability to specify \"Start Scene\" in AutopilotSettings. We recommend creating a test scenario that can be run from any Scene.\n\n\n## How to development\n\nAdd this repository as a submodule to the Packages/ directory in your project.\n\nRun the command below:\n\n```bash\ngit submodule add https://github.com/dena/Anjin.git Packages/com.dena.anjin\n```\n\n\u003e [!WARNING]  \n\u003e Required install packages for running tests (when adding to the `testables` in package.json), as follows:\n\u003e - [Unity Test Framework](https://docs.unity3d.com/Packages/com.unity.test-framework@latest) package v1.4.1 or later\n\u003e - [Test Helper](https://github.com/nowsprinting/test-helper) package v1.1.1 or later\n\nGenerate a temporary project and run tests on each Unity version from the command line.\n\n```bash\nmake create_project\nUNITY_VERSION=2019.4.40f1 make -k test\n```\n\n\u003e [!WARNING]  \n\u003e You must select \"Input Manager (Old)\" or \"Both\" in the **Project Settings \u003e Player \u003e Active Input Handling** for running tests.\n\n\n## Release workflow\n\nRun **Actions \u003e Create release pull request \u003e Run workflow** and merge created pull request.\n(Or bump version in package.json on default branch)\n\nThen, Will do the release process automatically by [Release](.github/workflows/release.yml) workflow.\nAnd after tagged, OpenUPM retrieves the tag and updates it.\n\nDo **NOT** manually operation the following operations:\n\n- Create release tag\n- Publish draft releases\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdena%2Fanjin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdena%2Fanjin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdena%2Fanjin/lists"}