mirror of
https://github.com/Cysharp/UniTask.git
synced 2026-05-15 11:30:09 +00:00
Compare commits
84 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
74bbe87b58 | ||
|
|
6f4131539b | ||
|
|
06283f0ffb | ||
|
|
dfe5ee43c2 | ||
|
|
83d8a2b424 | ||
|
|
4d204e4aa6 | ||
|
|
87e164e275 | ||
|
|
b63eb8d090 | ||
|
|
75119acb50 | ||
|
|
f7b3c2fbe1 | ||
|
|
b317ecfa01 | ||
|
|
7b05569ef7 | ||
|
|
e0465c6c2c | ||
|
|
9057452c86 | ||
|
|
a2f6f84bde | ||
|
|
f057abff0f | ||
|
|
c61a7d9961 | ||
|
|
9587f2eeec | ||
|
|
550784f31c | ||
|
|
11b3282b3d | ||
|
|
b2532b0798 | ||
|
|
4fc41ecb17 | ||
|
|
e52663cef6 | ||
|
|
1827be2de7 | ||
|
|
8560561ef3 | ||
|
|
2019f1fa7f | ||
|
|
9e2265d148 | ||
|
|
9d02279822 | ||
|
|
17ce06d93c | ||
|
|
7b810413fe | ||
|
|
d78c0d6c02 | ||
|
|
d248acc7d1 | ||
|
|
4c0b1f753a | ||
|
|
7bb6feda55 | ||
|
|
f8a501290a | ||
|
|
cb497c9eb5 | ||
|
|
342a37a074 | ||
|
|
c3146ec74f | ||
|
|
df16813fae | ||
|
|
8d98bbc7ba | ||
|
|
bb095697f7 | ||
|
|
cdf88c6a6a | ||
|
|
4eee2c9270 | ||
|
|
222b1401f5 | ||
|
|
fbe0bf8515 | ||
|
|
626685292c | ||
|
|
67794f5cdd | ||
|
|
2e225fb841 | ||
|
|
935523f25c | ||
|
|
3b3f7ebd3e | ||
|
|
88ecfa2992 | ||
|
|
aa70fe5c5a | ||
|
|
0c8057c668 | ||
|
|
28867646b0 | ||
|
|
ca60864021 | ||
|
|
1e4561da22 | ||
|
|
1496cc990a | ||
|
|
7bb3bf8d0e | ||
|
|
d057074f17 | ||
|
|
b724a2aa84 | ||
|
|
938ddd5356 | ||
|
|
911c37d4d8 | ||
|
|
caccccb0b5 | ||
|
|
a48f11d31b | ||
|
|
fcd93feb56 | ||
|
|
b472b23773 | ||
|
|
01c8fada1f | ||
|
|
10cd137126 | ||
|
|
809d23edae | ||
|
|
d38731bc44 | ||
|
|
64792b672d | ||
|
|
3892cc2299 | ||
|
|
5bfccaa3b6 | ||
|
|
b49b7332bb | ||
|
|
08184af737 | ||
|
|
0ef6c59385 | ||
|
|
4b0bd3b509 | ||
|
|
9a4720d180 | ||
|
|
b99646558c | ||
|
|
ee12dd9ae7 | ||
|
|
006e0f2c81 | ||
|
|
7d31299b5c | ||
|
|
fe8bf834e6 | ||
|
|
36ac0863ad |
7
.github/dependabot.yaml
vendored
Normal file
7
.github/dependabot.yaml
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
# ref: https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly" # Check for updates to GitHub Actions every week
|
||||
67
.github/workflows/build-debug.yml
vendored
67
.github/workflows/build-debug.yml
vendored
@@ -13,45 +13,43 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
|
||||
- run: dotnet build -c Debug
|
||||
- run: dotnet test -c Debug
|
||||
|
||||
build-unity:
|
||||
if: "((github.event_name == 'push' && github.repository_owner == 'Cysharp') || startsWith(github.event.pull_request.head.label, 'Cysharp:'))"
|
||||
if: ${{ ((github.event_name == 'push' && github.repository_owner == 'Cysharp') || startsWith(github.event.pull_request.head.label, 'Cysharp:')) && github.triggering_actor != 'dependabot[bot]' }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
max-parallel: 2
|
||||
matrix:
|
||||
unity: ["2019.3.9f1", "2019.4.13f1", "2020.1.12f1"]
|
||||
unity: ["2021.3.41f1", "2022.3.39f1", "6000.0.12f1"] # Test with LTS
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
# Execute scripts: RuntimeUnitTestToolkit
|
||||
# /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod UnitTestBuilder.BuildUnitTest /headless /ScriptBackend mono /BuildTarget StandaloneLinux64
|
||||
- name: Build UnitTest(Linux64, mono)
|
||||
uses: Cysharp/Actions/.github/actions/unity-builder@main
|
||||
env:
|
||||
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
|
||||
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
|
||||
UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
|
||||
- name: Load secrets
|
||||
id: op-load-secret
|
||||
uses: 1password/load-secrets-action@v2
|
||||
with:
|
||||
projectPath: src/UniTask
|
||||
unityVersion: ${{ matrix.unity }}
|
||||
targetPlatform: StandaloneLinux64
|
||||
buildMethod: UnitTestBuilder.BuildUnitTest
|
||||
customParameters: /headless /ScriptBackend mono
|
||||
- name: Execute UnitTest
|
||||
run: ./src/UniTask/bin/UnitTest/StandaloneLinux64_Mono2x/test
|
||||
export-env: false
|
||||
env:
|
||||
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN_PUBLIC }}
|
||||
UNITY_EMAIL: "op://GitHubActionsPublic/UNITY_LICENSE/username"
|
||||
UNITY_PASSWORD: "op://GitHubActionsPublic/UNITY_LICENSE/credential"
|
||||
UNITY_SERIAL: "op://GitHubActionsPublic/UNITY_LICENSE/serial"
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
# Execute scripts: Export Package
|
||||
# /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export
|
||||
- name: Build Unity (.unitypacakge)
|
||||
if: ${{ startsWith(matrix.unity, '2021') }} # only execute once
|
||||
uses: Cysharp/Actions/.github/actions/unity-builder@main
|
||||
env:
|
||||
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
|
||||
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
|
||||
UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
|
||||
UNITY_EMAIL: ${{ steps.op-load-secret.outputs.UNITY_EMAIL }}
|
||||
UNITY_PASSWORD: ${{ steps.op-load-secret.outputs.UNITY_PASSWORD }}
|
||||
UNITY_SERIAL: ${{ steps.op-load-secret.outputs.UNITY_SERIAL }}
|
||||
with:
|
||||
projectPath: src/UniTask
|
||||
unityVersion: ${{ matrix.unity }}
|
||||
@@ -62,8 +60,29 @@ jobs:
|
||||
with:
|
||||
directory: src/UniTask
|
||||
|
||||
# Execute UnitTest
|
||||
# /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod UnitTestBuilder.BuildUnitTest /headless /ScriptBackend IL2CPP /BuildTarget StandaloneLinux64
|
||||
- name: Build UnitTest (IL2CPP)
|
||||
uses: Cysharp/Actions/.github/actions/unity-builder@main
|
||||
env:
|
||||
UNITY_EMAIL: ${{ steps.op-load-secret.outputs.UNITY_EMAIL }}
|
||||
UNITY_PASSWORD: ${{ steps.op-load-secret.outputs.UNITY_PASSWORD }}
|
||||
UNITY_SERIAL: ${{ steps.op-load-secret.outputs.UNITY_SERIAL }}
|
||||
with:
|
||||
projectPath: src/UniTask
|
||||
unityVersion: ${{ matrix.unity }}
|
||||
targetPlatform: StandaloneLinux64
|
||||
buildMethod: UnitTestBuilder.BuildUnitTest
|
||||
customParameters: "/headless /ScriptBackend IL2CPP"
|
||||
- name: Check UnitTest file is generated
|
||||
run: ls -lR ./src/UniTask/bin/UnitTest
|
||||
- name: Execute UnitTest
|
||||
run: ./src/UniTask/bin/UnitTest/StandaloneLinux64_IL2CPP/test
|
||||
|
||||
# Store artifacts.
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: Cysharp/Actions/.github/actions/upload-artifact@main
|
||||
if: ${{ startsWith(matrix.unity, '2021') }} # only execute 2021
|
||||
with:
|
||||
name: UniTask.unitypackage-${{ matrix.unity }}.zip
|
||||
path: ./src/UniTask/*.unitypackage
|
||||
retention-days: 1
|
||||
|
||||
6
.github/workflows/build-docs.yml
vendored
6
.github/workflows/build-docs.yml
vendored
@@ -11,8 +11,8 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: Cysharp/DocfxTemplate
|
||||
path: docs/_DocfxTemplate
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
with:
|
||||
args: build docs/docfx.json
|
||||
- name: Publish to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: docs/_site
|
||||
|
||||
86
.github/workflows/build-release.yml
vendored
86
.github/workflows/build-release.yml
vendored
@@ -12,17 +12,13 @@ on:
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
env:
|
||||
GIT_TAG: ${{ github.event.inputs.tag }}
|
||||
DRY_RUN: ${{ github.event.inputs.dry-run }}
|
||||
|
||||
jobs:
|
||||
update-packagejson:
|
||||
uses: Cysharp/Actions/.github/workflows/update-packagejson.yaml@main
|
||||
with:
|
||||
file-path: ./src/UniTask/Assets/Plugins/UniTask/package.json
|
||||
tag: ${{ github.event.inputs.tag }}
|
||||
dry-run: ${{ fromJson(github.event.inputs.dry-run) }}
|
||||
tag: ${{ inputs.tag }}
|
||||
dry-run: ${{ inputs.dry-run }}
|
||||
|
||||
build-dotnet:
|
||||
needs: [update-packagejson]
|
||||
@@ -30,30 +26,42 @@ jobs:
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- run: echo ${{ needs.update-packagejson.outputs.sha }}
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ needs.update-packagejson.outputs.sha }}
|
||||
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
|
||||
# build and pack
|
||||
- run: dotnet build -c Release -p:Version=${{ env.GIT_TAG }}
|
||||
- run: dotnet build -c Release -p:Version=${{ inputs.tag }}
|
||||
- run: dotnet test -c Release --no-build
|
||||
- run: dotnet pack ./src/UniTask.NetCore/UniTask.NetCore.csproj -c Release --no-build -p:Version=${{ env.GIT_TAG }} -o ./publish
|
||||
- run: dotnet pack ./src/UniTask.NetCore/UniTask.NetCore.csproj -c Release --no-build -p:Version=${{ inputs.tag }} -o ./publish
|
||||
# Store artifacts.
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: Cysharp/Actions/.github/actions/upload-artifact@main
|
||||
with:
|
||||
name: nuget
|
||||
path: ./publish/
|
||||
retention-days: 1
|
||||
|
||||
build-unity:
|
||||
needs: [update-packagejson]
|
||||
strategy:
|
||||
matrix:
|
||||
unity: ["2019.3.9f1"]
|
||||
unity: ["2022.3.39f1"]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- name: Load secrets
|
||||
id: op-load-secret
|
||||
uses: 1password/load-secrets-action@v2
|
||||
with:
|
||||
export-env: false
|
||||
env:
|
||||
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN_PUBLIC }}
|
||||
UNITY_EMAIL: "op://GitHubActionsPublic/UNITY_LICENSE/username"
|
||||
UNITY_PASSWORD: "op://GitHubActionsPublic/UNITY_LICENSE/credential"
|
||||
UNITY_SERIAL: "op://GitHubActionsPublic/UNITY_LICENSE/serial"
|
||||
|
||||
- run: echo ${{ needs.update-packagejson.outputs.sha }}
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ needs.update-packagejson.outputs.sha }}
|
||||
# Execute scripts: Export Package
|
||||
@@ -61,9 +69,9 @@ jobs:
|
||||
- name: Build Unity (.unitypacakge)
|
||||
uses: Cysharp/Actions/.github/actions/unity-builder@main
|
||||
env:
|
||||
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
|
||||
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
|
||||
UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
|
||||
UNITY_EMAIL: ${{ steps.op-load-secret.outputs.UNITY_EMAIL }}
|
||||
UNITY_PASSWORD: ${{ steps.op-load-secret.outputs.UNITY_PASSWORD }}
|
||||
UNITY_SERIAL: ${{ steps.op-load-secret.outputs.UNITY_SERIAL }}
|
||||
with:
|
||||
projectPath: src/UniTask
|
||||
unityVersion: ${{ matrix.unity }}
|
||||
@@ -75,45 +83,27 @@ jobs:
|
||||
directory: src/UniTask
|
||||
|
||||
# Store artifacts.
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: Cysharp/Actions/.github/actions/upload-artifact@main
|
||||
with:
|
||||
name: UniTask.${{ env.GIT_TAG }}.unitypackage
|
||||
path: ./src/UniTask/UniTask.${{ env.GIT_TAG }}.unitypackage
|
||||
name: UniTask.${{ inputs.tag }}.unitypackage
|
||||
path: ./src/UniTask/UniTask.${{ inputs.tag }}.unitypackage
|
||||
retention-days: 1
|
||||
|
||||
# release
|
||||
create-release:
|
||||
if: github.event.inputs.dry-run == 'false'
|
||||
needs: [update-packagejson, build-dotnet, build-unity]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
|
||||
# Create Releases
|
||||
- uses: actions/create-release@v1
|
||||
id: create_release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ env.GIT_TAG }}
|
||||
release_name: Ver.${{ env.GIT_TAG }}
|
||||
commitish: ${{ needs.update-packagejson.outputs.sha }}
|
||||
draft: true
|
||||
prerelease: false
|
||||
# Download(All) Artifacts to current directory
|
||||
- uses: actions/download-artifact@v2
|
||||
# Upload to NuGet
|
||||
- run: dotnet nuget push "./nuget/*.nupkg" --skip-duplicate -s https://www.nuget.org/api/v2/package -k ${{ secrets.NUGET_KEY }}
|
||||
# Upload to Releases(unitypackage)
|
||||
- uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||
asset_path: ./UniTask.${{ env.GIT_TAG }}.unitypackage/UniTask.${{ env.GIT_TAG }}.unitypackage
|
||||
asset_name: UniTask.${{ env.GIT_TAG }}.unitypackage
|
||||
asset_content_type: application/octet-stream
|
||||
uses: Cysharp/Actions/.github/workflows/create-release.yaml@main
|
||||
with:
|
||||
commit-id: ${{ needs.update-packagejson.outputs.sha }}
|
||||
dry-run: ${{ inputs.dry-run }}
|
||||
tag: ${{ inputs.tag }}
|
||||
nuget-push: true
|
||||
release-upload: true
|
||||
release-asset-path: ./UniTask.${{ inputs.tag }}.unitypackage/UniTask.${{ inputs.tag }}.unitypackage
|
||||
secrets: inherit
|
||||
|
||||
cleanup:
|
||||
if: needs.update-packagejson.outputs.is-branch-created == 'true'
|
||||
if: ${{ needs.update-packagejson.outputs.is-branch-created == 'true' }}
|
||||
needs: [update-packagejson, build-dotnet, build-unity]
|
||||
uses: Cysharp/Actions/.github/workflows/clean-packagejson-branch.yaml@main
|
||||
with:
|
||||
|
||||
2
.github/workflows/toc.yml
vendored
2
.github/workflows/toc.yml
vendored
@@ -10,6 +10,6 @@ jobs:
|
||||
name: TOC Generator
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: technote-space/toc-generator@v2.4.0
|
||||
- uses: technote-space/toc-generator@v4.3.1
|
||||
with:
|
||||
TOC_TITLE: "## Table of Contents"
|
||||
145
.gitignore
vendored
145
.gitignore
vendored
@@ -80,7 +80,7 @@ _ReSharper*
|
||||
*.ncrunch*
|
||||
.*crunch*.local.xml
|
||||
|
||||
# Installshield output folder
|
||||
# Installshield output folder
|
||||
[Ee]xpress
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
@@ -130,134 +130,15 @@ UpgradeLog*.XML
|
||||
Assets/WSATestCertificate.pfx
|
||||
.vs/
|
||||
|
||||
Assembly-CSharp\.csproj
|
||||
|
||||
UniRx\.Async\.csproj
|
||||
|
||||
UniRx\.Async\.Editor\.csproj
|
||||
|
||||
UniRx\.Async\.Tests\.csproj
|
||||
|
||||
UniTask\.sln
|
||||
|
||||
RuntimeUnitTestToolkit\.csproj
|
||||
|
||||
Assembly-CSharp-Editor\.csproj
|
||||
|
||||
UniRx\.Async\.unitypackage
|
||||
|
||||
UniRx.Async.Tests.Editor.csproj
|
||||
|
||||
src/UniTask/UniTask.csproj
|
||||
|
||||
src/UniTask/UniTask.Editor.csproj
|
||||
|
||||
src/UniTask/UniTask.Tests.csproj
|
||||
|
||||
src/UniTask/UniTask.Tests.Editor.csproj
|
||||
|
||||
src/UniTask/UniTask.*.unitypackage
|
||||
|
||||
src/UniTask/UniTask.Linq.csproj
|
||||
|
||||
src/UniTask/DOTween.Modules.csproj
|
||||
|
||||
src/UniTask/Unity.Addressables.csproj
|
||||
|
||||
src/UniTask/Unity.Addressables.Editor.csproj
|
||||
|
||||
src/UniTask/Unity.Analytics.DataPrivacy.csproj
|
||||
|
||||
src/UniTask/Unity.Recorder.csproj
|
||||
|
||||
src/UniTask/Unity.Recorder.Editor.csproj
|
||||
|
||||
src/UniTask/Unity.ResourceManager.csproj
|
||||
|
||||
src/UniTask/Unity.Rider.Editor.csproj
|
||||
|
||||
src/UniTask/Unity.ScriptableBuildPipeline.csproj
|
||||
|
||||
src/UniTask/Unity.ScriptableBuildPipeline.Editor.csproj
|
||||
|
||||
src/UniTask/Unity.TextMeshPro.csproj
|
||||
|
||||
src/UniTask/Unity.TextMeshPro.Editor.csproj
|
||||
|
||||
src/UniTask/Unity.Timeline.csproj
|
||||
|
||||
src/UniTask/Unity.Timeline.Editor.csproj
|
||||
|
||||
src/UniTask/Unity.VisualStudio.Editor.csproj
|
||||
|
||||
src/UniTask/Unity.VSCode.Editor.csproj
|
||||
|
||||
src/UniTask/UnityEditor.CacheServer.csproj
|
||||
|
||||
src/UniTask/UnityEditor.TestRunner.csproj
|
||||
|
||||
src/UniTask/UnityEditor.UI.csproj
|
||||
|
||||
src/UniTask/UnityEngine.Advertisements.csproj
|
||||
|
||||
src/UniTask/UnityEngine.Monetization.csproj
|
||||
|
||||
src/UniTask/UnityEngine.TestRunner.csproj
|
||||
|
||||
src/UniTask/UnityEngine.UI.csproj
|
||||
|
||||
src/UniTask/TempAsm.csproj
|
||||
|
||||
src/UniTask/UniTask.Addressables.csproj
|
||||
|
||||
src/UniTask/UniTask.DOTween.csproj
|
||||
|
||||
src/UniTask/UniTask.TextMeshPro.csproj
|
||||
|
||||
src/UniTask/RuntimeUnitTestToolkit.Player.csproj
|
||||
|
||||
src/UniTask/TempAsm.Player.csproj
|
||||
|
||||
src/UniTask/UniTask.Addressables.Player.csproj
|
||||
|
||||
src/UniTask/UniTask.DOTween.Player.csproj
|
||||
|
||||
src/UniTask/UniTask.Linq.Player.csproj
|
||||
|
||||
src/UniTask/UniTask.Player.csproj
|
||||
|
||||
src/UniTask/UniTask.Tests.Player.csproj
|
||||
|
||||
src/UniTask/UniTask.TextMeshPro.Player.csproj
|
||||
|
||||
src/UniTask/Unity.Addressables.Player.csproj
|
||||
|
||||
src/UniTask/Unity.Analytics.DataPrivacy.Player.csproj
|
||||
|
||||
src/UniTask/Unity.ResourceManager.Player.csproj
|
||||
|
||||
src/UniTask/Unity.ScriptableBuildPipeline.Player.csproj
|
||||
|
||||
src/UniTask/Unity.TextMeshPro.Player.csproj
|
||||
|
||||
src/UniTask/Unity.Timeline.Player.csproj
|
||||
|
||||
src/UniTask/UnityEngine.Advertisements.Player.csproj
|
||||
|
||||
src/UniTask/UnityEngine.Monetization.Player.csproj
|
||||
|
||||
src/UniTask/UnityEngine.TestRunner.Player.csproj
|
||||
|
||||
src/UniTask/UnityEngine.UI.Player.csproj
|
||||
|
||||
src/UniTask/DOTween.Modules.Player.csproj
|
||||
|
||||
src/UniTask/Assembly-CSharp.Player.csproj
|
||||
|
||||
src/UniTask/Unity.EditorCoroutines.Editor.csproj
|
||||
|
||||
src/UniTask/.vsconfig
|
||||
|
||||
src/UniTask/Logs/ApiUpdaterCheck.txt
|
||||
|
||||
src/UniTask/Assembly-CSharp-firstpass.csproj
|
||||
# Unity
|
||||
|
||||
# Unity
|
||||
.vsconfig
|
||||
src/UniTask/Library/*
|
||||
src/UniTask/Temp/*
|
||||
src/UniTask/Logs/*
|
||||
src/UniTask/[Uu]ser[Ss]ettings/
|
||||
src/UniTask/*.sln
|
||||
src/UniTask/*.csproj
|
||||
src/UniTask/*.unitypackage
|
||||
!src/UniTask/Packages/
|
||||
|
||||
@@ -51,7 +51,7 @@ For advanced tips, see blog post: [Extends UnityWebRequest via async decorator p
|
||||
|
||||
Getting started
|
||||
---
|
||||
Install via [UPM package](#upm-package) or asset package(`UniTask.*.*.*.unitypackage`) available in [UniTask/releases](https://github.com/Cysharp/UniTask/releases) page.
|
||||
Install via [UPM package](#upm-package) with git reference or asset package(`UniTask.*.*.*.unitypackage`) available in [UniTask/releases](https://github.com/Cysharp/UniTask/releases).
|
||||
|
||||
```csharp
|
||||
// extension awaiter/methods can be used by this namespace
|
||||
|
||||
@@ -1,42 +1,43 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net7.0;netstandard2.1;netstandard2.0</TargetFrameworks>
|
||||
<AssemblyName>UniTask</AssemblyName>
|
||||
<LangVersion>8.0</LangVersion>
|
||||
<RootNamespace>Cysharp.Threading.Tasks</RootNamespace>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net7.0;netstandard2.1;netstandard2.0</TargetFrameworks>
|
||||
<AssemblyName>UniTask</AssemblyName>
|
||||
<LangVersion>8.0</LangVersion>
|
||||
<RootNamespace>Cysharp.Threading.Tasks</RootNamespace>
|
||||
<DefineConstants>UNITASK_NETCORE</DefineConstants>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
||||
|
||||
<!-- NuGet Packaging -->
|
||||
<Id>UniTask</Id>
|
||||
<PackageVersion>$(Version)</PackageVersion>
|
||||
<Company>Cysharp</Company>
|
||||
<Authors>Cysharp</Authors>
|
||||
<Copyright>© Cysharp, Inc.</Copyright>
|
||||
<PackageTags>task;async</PackageTags>
|
||||
<Description>Provides an efficient async/await integration to Unity and .NET Core.</Description>
|
||||
<PackageProjectUrl>https://github.com/Cysharp/UniTask</PackageProjectUrl>
|
||||
<RepositoryUrl>$(PackageProjectUrl)</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
<PackageIcon>Icon.png</PackageIcon>
|
||||
<SignAssembly>true</SignAssembly>
|
||||
<AssemblyOriginatorKeyFile>opensource.snk</AssemblyOriginatorKeyFile>
|
||||
<IsPackable>true</IsPackable>
|
||||
</PropertyGroup>
|
||||
<!-- NuGet Packaging -->
|
||||
<Id>UniTask</Id>
|
||||
<PackageVersion>$(Version)</PackageVersion>
|
||||
<Company>Cysharp</Company>
|
||||
<Authors>Cysharp</Authors>
|
||||
<Copyright>© Cysharp, Inc.</Copyright>
|
||||
<PackageTags>task;async</PackageTags>
|
||||
<Description>Provides an efficient async/await integration to Unity and .NET Core.</Description>
|
||||
<PackageProjectUrl>https://github.com/Cysharp/UniTask</PackageProjectUrl>
|
||||
<RepositoryUrl>$(PackageProjectUrl)</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
<PackageIcon>Icon.png</PackageIcon>
|
||||
<SignAssembly>true</SignAssembly>
|
||||
<AssemblyOriginatorKeyFile>opensource.snk</AssemblyOriginatorKeyFile>
|
||||
<IsPackable>true</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="Icon.png" Pack="true" PackagePath="/" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Icon.png" Pack="true" PackagePath="/" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="..\UniTask\Assets\Plugins\UniTask\Runtime\**\*.cs" Exclude="
..\UniTask\Assets\Plugins\UniTask\Editor\*.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Triggers\*.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Linq\UnityExtensions\*.cs;
 
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\UnityEqualityComparer.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\DiagnosticsExtensions.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\PlayerLoopRunner.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\ContinuationQueue.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\UnityWebRequestExtensions.cs;
 
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTaskSynchronizationContext.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\CancellationTokenSourceExtensions.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\EnumeratorAsyncExtensions.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\TimeoutController.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\PlayerLoopHelper.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\PlayerLoopTimer.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Delay.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Run.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Bridge.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.WaitUntil.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.*;
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityBindingExtensions.cs;
" />
|
||||
<Compile Remove="..\UniTask\Assets\Plugins\UniTask\Runtime\_InternalVisibleTo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\UniTask\Assets\Plugins\UniTask\Runtime\**\*.cs" Exclude="
..\UniTask\Assets\Plugins\UniTask\Editor\*.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Triggers\*.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Linq\UnityExtensions\*.cs;
 
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\UnityEqualityComparer.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\DiagnosticsExtensions.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\PlayerLoopRunner.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\ContinuationQueue.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\UnityWebRequestExtensions.cs;
 
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTaskSynchronizationContext.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\CancellationTokenSourceExtensions.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\EnumeratorAsyncExtensions.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\TimeoutController.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\PlayerLoopHelper.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\PlayerLoopTimer.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Delay.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Run.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Bridge.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.WaitUntil.cs;
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.*;
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityBindingExtensions.cs;
" />
|
||||
<Compile Remove="..\UniTask\Assets\Plugins\UniTask\Runtime\_InternalVisibleTo.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#pragma warning disable CS1998
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#pragma warning disable CS1998
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Cysharp.Threading.Tasks;
|
||||
|
||||
@@ -7,6 +7,7 @@ using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.ExceptionServices;
|
||||
using System.Threading;
|
||||
using UnityEngine.AddressableAssets;
|
||||
using UnityEngine.ResourceManagement.AsyncOperations;
|
||||
|
||||
namespace Cysharp.Threading.Tasks
|
||||
@@ -20,17 +21,12 @@ namespace Cysharp.Threading.Tasks
|
||||
return ToUniTask(handle).GetAwaiter();
|
||||
}
|
||||
|
||||
public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken)
|
||||
public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken, bool cancelImmediately = false, bool autoReleaseWhenCanceled = false)
|
||||
{
|
||||
return ToUniTask(handle, cancellationToken: cancellationToken);
|
||||
return ToUniTask(handle, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately, autoReleaseWhenCanceled: autoReleaseWhenCanceled);
|
||||
}
|
||||
|
||||
public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken, bool cancelImmediately)
|
||||
{
|
||||
return ToUniTask(handle, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately);
|
||||
}
|
||||
|
||||
public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false)
|
||||
public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false, bool autoReleaseWhenCanceled = false)
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken);
|
||||
|
||||
@@ -49,7 +45,7 @@ namespace Cysharp.Threading.Tasks
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, cancelImmediately, out var token), token);
|
||||
return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, cancelImmediately, autoReleaseWhenCanceled, out var token), token);
|
||||
}
|
||||
|
||||
public struct AsyncOperationHandleAwaiter : ICriticalNotifyCompletion
|
||||
@@ -108,21 +104,23 @@ namespace Cysharp.Threading.Tasks
|
||||
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource), () => pool.Size);
|
||||
}
|
||||
|
||||
readonly Action<AsyncOperationHandle> continuationAction;
|
||||
readonly Action<AsyncOperationHandle> completedCallback;
|
||||
AsyncOperationHandle handle;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
IProgress<float> progress;
|
||||
bool autoReleaseWhenCanceled;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||
|
||||
AsyncOperationHandleConfiguredSource()
|
||||
{
|
||||
continuationAction = Continuation;
|
||||
completedCallback = HandleCompleted;
|
||||
}
|
||||
|
||||
public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, bool cancelImmediately, out short token)
|
||||
public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, bool cancelImmediately, bool autoReleaseWhenCanceled, out short token)
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
@@ -137,6 +135,8 @@ namespace Cysharp.Threading.Tasks
|
||||
result.handle = handle;
|
||||
result.progress = progress;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.autoReleaseWhenCanceled = autoReleaseWhenCanceled;
|
||||
result.completed = false;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
@@ -144,6 +144,10 @@ namespace Cysharp.Threading.Tasks
|
||||
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
|
||||
{
|
||||
var promise = (AsyncOperationHandleConfiguredSource)state;
|
||||
if (promise.autoReleaseWhenCanceled && promise.handle.IsValid())
|
||||
{
|
||||
Addressables.Release(promise.handle);
|
||||
}
|
||||
promise.core.TrySetCanceled(promise.cancellationToken);
|
||||
}, result);
|
||||
}
|
||||
@@ -152,41 +156,60 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
PlayerLoopHelper.AddAction(timing, result);
|
||||
|
||||
handle.Completed += result.continuationAction;
|
||||
handle.Completed += result.completedCallback;
|
||||
|
||||
token = result.core.Version;
|
||||
return result;
|
||||
}
|
||||
|
||||
void Continuation(AsyncOperationHandle _)
|
||||
void HandleCompleted(AsyncOperationHandle _)
|
||||
{
|
||||
handle.Completed -= continuationAction;
|
||||
if (handle.IsValid())
|
||||
{
|
||||
handle.Completed -= completedCallback;
|
||||
}
|
||||
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
if (autoReleaseWhenCanceled && handle.IsValid())
|
||||
{
|
||||
Addressables.Release(handle);
|
||||
}
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else if (handle.Status == AsyncOperationStatus.Failed)
|
||||
{
|
||||
core.TrySetException(handle.OperationException);
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else if (handle.Status == AsyncOperationStatus.Failed)
|
||||
{
|
||||
core.TrySetException(handle.OperationException);
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(AsyncUnit.Default);
|
||||
}
|
||||
core.TrySetResult(AsyncUnit.Default);
|
||||
}
|
||||
}
|
||||
|
||||
public void GetResult(short token)
|
||||
{
|
||||
core.GetResult(token);
|
||||
try
|
||||
{
|
||||
core.GetResult(token);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public UniTaskStatus GetStatus(short token)
|
||||
@@ -208,20 +231,23 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
completed = true;
|
||||
if (autoReleaseWhenCanceled && handle.IsValid())
|
||||
{
|
||||
Addressables.Release(handle);
|
||||
}
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (progress != null && handle.IsValid())
|
||||
{
|
||||
progress.Report(handle.PercentComplete);
|
||||
progress.Report(handle.GetDownloadStatus().Percent);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -248,17 +274,12 @@ namespace Cysharp.Threading.Tasks
|
||||
return ToUniTask(handle).GetAwaiter();
|
||||
}
|
||||
|
||||
public static UniTask<T> WithCancellation<T>(this AsyncOperationHandle<T> handle, CancellationToken cancellationToken)
|
||||
public static UniTask<T> WithCancellation<T>(this AsyncOperationHandle<T> handle, CancellationToken cancellationToken, bool cancelImmediately = false, bool autoReleaseWhenCanceled = false)
|
||||
{
|
||||
return ToUniTask(handle, cancellationToken: cancellationToken);
|
||||
return ToUniTask(handle, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately, autoReleaseWhenCanceled: autoReleaseWhenCanceled);
|
||||
}
|
||||
|
||||
public static UniTask<T> WithCancellation<T>(this AsyncOperationHandle<T> handle, CancellationToken cancellationToken, bool cancelImmediately)
|
||||
{
|
||||
return ToUniTask(handle, cancellationToken: cancellationToken, cancelImmediately: cancelImmediately);
|
||||
}
|
||||
|
||||
public static UniTask<T> ToUniTask<T>(this AsyncOperationHandle<T> handle, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false)
|
||||
public static UniTask<T> ToUniTask<T>(this AsyncOperationHandle<T> handle, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false, bool autoReleaseWhenCanceled = false)
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<T>(cancellationToken);
|
||||
|
||||
@@ -276,7 +297,7 @@ namespace Cysharp.Threading.Tasks
|
||||
return UniTask.FromResult(handle.Result);
|
||||
}
|
||||
|
||||
return new UniTask<T>(AsyncOperationHandleConfiguredSource<T>.Create(handle, timing, progress, cancellationToken, cancelImmediately, out var token), token);
|
||||
return new UniTask<T>(AsyncOperationHandleConfiguredSource<T>.Create(handle, timing, progress, cancellationToken, cancelImmediately, autoReleaseWhenCanceled, out var token), token);
|
||||
}
|
||||
|
||||
sealed class AsyncOperationHandleConfiguredSource<T> : IUniTaskSource<T>, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleConfiguredSource<T>>
|
||||
@@ -290,21 +311,23 @@ namespace Cysharp.Threading.Tasks
|
||||
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource<T>), () => pool.Size);
|
||||
}
|
||||
|
||||
readonly Action<AsyncOperationHandle<T>> continuationAction;
|
||||
readonly Action<AsyncOperationHandle<T>> completedCallback;
|
||||
AsyncOperationHandle<T> handle;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
IProgress<float> progress;
|
||||
bool autoReleaseWhenCanceled;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<T> core;
|
||||
|
||||
AsyncOperationHandleConfiguredSource()
|
||||
{
|
||||
continuationAction = Continuation;
|
||||
completedCallback = HandleCompleted;
|
||||
}
|
||||
|
||||
public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, bool cancelImmediately, out short token)
|
||||
public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, bool cancelImmediately, bool autoReleaseWhenCanceled, out short token)
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
@@ -320,12 +343,18 @@ namespace Cysharp.Threading.Tasks
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.completed = false;
|
||||
result.progress = progress;
|
||||
result.autoReleaseWhenCanceled = autoReleaseWhenCanceled;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
|
||||
{
|
||||
var promise = (AsyncOperationHandleConfiguredSource<T>)state;
|
||||
if (promise.autoReleaseWhenCanceled && promise.handle.IsValid())
|
||||
{
|
||||
Addressables.Release(promise.handle);
|
||||
}
|
||||
promise.core.TrySetCanceled(promise.cancellationToken);
|
||||
}, result);
|
||||
}
|
||||
@@ -334,41 +363,59 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
PlayerLoopHelper.AddAction(timing, result);
|
||||
|
||||
handle.Completed += result.continuationAction;
|
||||
handle.Completed += result.completedCallback;
|
||||
|
||||
token = result.core.Version;
|
||||
return result;
|
||||
}
|
||||
|
||||
void Continuation(AsyncOperationHandle<T> argHandle)
|
||||
void HandleCompleted(AsyncOperationHandle<T> argHandle)
|
||||
{
|
||||
handle.Completed -= continuationAction;
|
||||
if (handle.IsValid())
|
||||
{
|
||||
handle.Completed -= completedCallback;
|
||||
}
|
||||
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
if (autoReleaseWhenCanceled && handle.IsValid())
|
||||
{
|
||||
Addressables.Release(handle);
|
||||
}
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else if (argHandle.Status == AsyncOperationStatus.Failed)
|
||||
{
|
||||
core.TrySetException(argHandle.OperationException);
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else if (argHandle.Status == AsyncOperationStatus.Failed)
|
||||
{
|
||||
core.TrySetException(argHandle.OperationException);
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(argHandle.Result);
|
||||
}
|
||||
core.TrySetResult(argHandle.Result);
|
||||
}
|
||||
}
|
||||
|
||||
public T GetResult(short token)
|
||||
{
|
||||
return core.GetResult(token);
|
||||
try
|
||||
{
|
||||
return core.GetResult(token);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void IUniTaskSource.GetResult(short token)
|
||||
@@ -395,20 +442,23 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
completed = true;
|
||||
if (autoReleaseWhenCanceled && handle.IsValid())
|
||||
{
|
||||
Addressables.Release(handle);
|
||||
}
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (progress != null && handle.IsValid())
|
||||
{
|
||||
progress.Report(handle.PercentComplete);
|
||||
progress.Report(handle.GetDownloadStatus().Percent);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
"name": "UniTask.Addressables",
|
||||
"references": [
|
||||
"UniTask",
|
||||
"Unity.ResourceManager"
|
||||
"Unity.ResourceManager",
|
||||
"Unity.Addressables"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
|
||||
@@ -16,7 +16,12 @@
|
||||
"name": "com.unity.textmeshpro",
|
||||
"expression": "",
|
||||
"define": "UNITASK_TEXTMESHPRO_SUPPORT"
|
||||
},
|
||||
{
|
||||
"name": "com.unity.ugui",
|
||||
"expression": "2.0.0",
|
||||
"define": "UNITASK_TEXTMESHPRO_SUPPORT"
|
||||
}
|
||||
],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
#pragma warning disable CS1591
|
||||
#pragma warning disable CS0108
|
||||
|
||||
#if (UNITASK_NETCORE && !NETSTANDARD2_0) || UNITY_2022_3_OR_NEWER
|
||||
#define SUPPORT_VALUETASK
|
||||
#endif
|
||||
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
@@ -19,9 +24,8 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
// similar as IValueTaskSource
|
||||
public interface IUniTaskSource
|
||||
#if (!UNITY_2018_3_OR_NEWER || UNITY_2021_2_OR_NEWER) && !NETSTANDARD2_0
|
||||
#if SUPPORT_VALUETASK
|
||||
: System.Threading.Tasks.Sources.IValueTaskSource
|
||||
#pragma warning disable CS0108
|
||||
#endif
|
||||
{
|
||||
UniTaskStatus GetStatus(short token);
|
||||
@@ -30,8 +34,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
UniTaskStatus UnsafeGetStatus(); // only for debug use.
|
||||
|
||||
#if (!UNITY_2018_3_OR_NEWER || UNITY_2021_2_OR_NEWER) && !NETSTANDARD2_0
|
||||
#pragma warning restore CS0108
|
||||
#if SUPPORT_VALUETASK
|
||||
|
||||
System.Threading.Tasks.Sources.ValueTaskSourceStatus System.Threading.Tasks.Sources.IValueTaskSource.GetStatus(short token)
|
||||
{
|
||||
@@ -53,13 +56,13 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
|
||||
public interface IUniTaskSource<out T> : IUniTaskSource
|
||||
#if (!UNITY_2018_3_OR_NEWER || UNITY_2021_2_OR_NEWER) && !NETSTANDARD2_0
|
||||
#if SUPPORT_VALUETASK
|
||||
, System.Threading.Tasks.Sources.IValueTaskSource<T>
|
||||
#endif
|
||||
{
|
||||
new T GetResult(short token);
|
||||
|
||||
#if (!UNITY_2018_3_OR_NEWER || UNITY_2021_2_OR_NEWER) && !NETSTANDARD2_0
|
||||
#if SUPPORT_VALUETASK
|
||||
|
||||
new public UniTaskStatus GetStatus(short token)
|
||||
{
|
||||
|
||||
@@ -27,7 +27,9 @@ namespace Cysharp.Threading.Tasks.Linq
|
||||
|
||||
public static IUniTaskAsyncEnumerable<T> Merge<T>(this IEnumerable<IUniTaskAsyncEnumerable<T>> sources)
|
||||
{
|
||||
return new Merge<T>(sources.ToArray());
|
||||
return sources is IUniTaskAsyncEnumerable<T>[] array
|
||||
? new Merge<T>(array)
|
||||
: new Merge<T>(sources.ToArray());
|
||||
}
|
||||
|
||||
public static IUniTaskAsyncEnumerable<T> Merge<T>(params IUniTaskAsyncEnumerable<T>[] sources)
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
#if !UNITY_2018_3_OR_NEWER || UNITY_2021_2_OR_NEWER
|
||||
#pragma warning disable 0649
|
||||
#pragma warning disable 0649
|
||||
|
||||
#if UNITASK_NETCORE || UNITY_2022_3_OR_NEWER
|
||||
#define SUPPORT_VALUETASK
|
||||
#endif
|
||||
|
||||
#if SUPPORT_VALUETASK
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
@@ -11,7 +16,7 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
public static ValueTask AsValueTask(this in UniTask task)
|
||||
{
|
||||
#if NETSTANDARD2_0
|
||||
#if (UNITASK_NETCORE && NETSTANDARD2_0)
|
||||
return new ValueTask(new UniTaskValueTaskSource(task), 0);
|
||||
#else
|
||||
return task;
|
||||
@@ -20,7 +25,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
public static ValueTask<T> AsValueTask<T>(this in UniTask<T> task)
|
||||
{
|
||||
#if NETSTANDARD2_0
|
||||
#if (UNITASK_NETCORE && NETSTANDARD2_0)
|
||||
return new ValueTask<T>(new UniTaskValueTaskSource<T>(task), 0);
|
||||
#else
|
||||
return task;
|
||||
@@ -37,7 +42,7 @@ namespace Cysharp.Threading.Tasks
|
||||
await task;
|
||||
}
|
||||
|
||||
#if NETSTANDARD2_0
|
||||
#if (UNITASK_NETCORE && NETSTANDARD2_0)
|
||||
|
||||
class UniTaskValueTaskSource : IValueTaskSource
|
||||
{
|
||||
|
||||
@@ -208,6 +208,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
|
||||
YieldPromise()
|
||||
@@ -227,6 +228,7 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -253,7 +255,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,6 +299,7 @@ namespace Cysharp.Threading.Tasks
|
||||
core.Reset();
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
@@ -309,6 +319,7 @@ namespace Cysharp.Threading.Tasks
|
||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
NextFramePromise()
|
||||
{
|
||||
@@ -328,6 +339,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
result.frameCount = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -354,7 +366,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -414,6 +433,7 @@ namespace Cysharp.Threading.Tasks
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
WaitForEndOfFramePromise()
|
||||
{
|
||||
@@ -432,6 +452,7 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -458,7 +479,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -533,6 +561,7 @@ namespace Cysharp.Threading.Tasks
|
||||
int delayFrameCount;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
int currentFrameCount;
|
||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||
@@ -556,6 +585,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.delayFrameCount = delayFrameCount;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -582,7 +612,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -653,6 +690,7 @@ namespace Cysharp.Threading.Tasks
|
||||
delayFrameCount = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
@@ -673,6 +711,7 @@ namespace Cysharp.Threading.Tasks
|
||||
float elapsed;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
|
||||
@@ -696,6 +735,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.delayTimeSpan = (float)delayTimeSpan.TotalSeconds;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -722,7 +762,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -775,6 +822,7 @@ namespace Cysharp.Threading.Tasks
|
||||
elapsed = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
@@ -795,6 +843,7 @@ namespace Cysharp.Threading.Tasks
|
||||
int initialFrame;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
|
||||
@@ -818,6 +867,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds;
|
||||
result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -844,7 +894,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -897,6 +954,7 @@ namespace Cysharp.Threading.Tasks
|
||||
elapsed = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
@@ -916,6 +974,7 @@ namespace Cysharp.Threading.Tasks
|
||||
ValueStopwatch stopwatch;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||
|
||||
@@ -938,6 +997,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.stopwatch = ValueStopwatch.StartNew();
|
||||
result.delayTimeSpanTicks = delayTimeSpan.Ticks;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -964,7 +1024,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1013,6 +1080,7 @@ namespace Cysharp.Threading.Tasks
|
||||
stopwatch = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,16 @@ namespace Cysharp.Threading.Tasks
|
||||
return factory();
|
||||
}
|
||||
|
||||
public static UniTask Create(Func<CancellationToken, UniTask> factory, CancellationToken cancellationToken)
|
||||
{
|
||||
return factory(cancellationToken);
|
||||
}
|
||||
|
||||
public static UniTask Create<T>(T state, Func<T, UniTask> factory)
|
||||
{
|
||||
return factory(state);
|
||||
}
|
||||
|
||||
public static UniTask<T> Create<T>(Func<UniTask<T>> factory)
|
||||
{
|
||||
return factory();
|
||||
@@ -137,11 +147,19 @@ namespace Cysharp.Threading.Tasks
|
||||
return () => asyncAction(cancellationToken).Forget();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// helper of create add UniTaskVoid to delegate.
|
||||
/// </summary>
|
||||
public static Action Action<T>(T state, Func<T, UniTaskVoid> asyncAction)
|
||||
{
|
||||
return () => asyncAction(state).Forget();
|
||||
}
|
||||
|
||||
#if UNITY_2018_3_OR_NEWER
|
||||
|
||||
/// <summary>
|
||||
/// Create async void(UniTaskVoid) UnityAction.
|
||||
/// For exampe: onClick.AddListener(UniTask.UnityAction(async () => { /* */ } ))
|
||||
/// For example: onClick.AddListener(UniTask.UnityAction(async () => { /* */ } ))
|
||||
/// </summary>
|
||||
public static UnityEngine.Events.UnityAction UnityAction(Func<UniTaskVoid> asyncAction)
|
||||
{
|
||||
@@ -150,13 +168,22 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
/// <summary>
|
||||
/// Create async void(UniTaskVoid) UnityAction.
|
||||
/// For exampe: onClick.AddListener(UniTask.UnityAction(FooAsync, this.GetCancellationTokenOnDestroy()))
|
||||
/// For example: onClick.AddListener(UniTask.UnityAction(FooAsync, this.GetCancellationTokenOnDestroy()))
|
||||
/// </summary>
|
||||
public static UnityEngine.Events.UnityAction UnityAction(Func<CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken)
|
||||
{
|
||||
return () => asyncAction(cancellationToken).Forget();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create async void(UniTaskVoid) UnityAction.
|
||||
/// For example: onClick.AddListener(UniTask.UnityAction(FooAsync, Argument))
|
||||
/// </summary>
|
||||
public static UnityEngine.Events.UnityAction UnityAction<T>(T state, Func<T, UniTaskVoid> asyncAction)
|
||||
{
|
||||
return () => asyncAction(state).Forget();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
@@ -175,6 +202,22 @@ namespace Cysharp.Threading.Tasks
|
||||
return new UniTask<T>(new DeferPromise<T>(factory), 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defer the task creation just before call await.
|
||||
/// </summary>
|
||||
public static UniTask Defer<TState>(TState state, Func<TState, UniTask> factory)
|
||||
{
|
||||
return new UniTask(new DeferPromiseWithState<TState>(state, factory), 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defer the task creation just before call await.
|
||||
/// </summary>
|
||||
public static UniTask<TResult> Defer<TState, TResult>(TState state, Func<TState, UniTask<TResult>> factory)
|
||||
{
|
||||
return new UniTask<TResult>(new DeferPromiseWithState<TState, TResult>(state, factory), 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Never complete.
|
||||
/// </summary>
|
||||
@@ -438,6 +481,93 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
}
|
||||
|
||||
sealed class DeferPromiseWithState<TState> : IUniTaskSource
|
||||
{
|
||||
Func<TState, UniTask> factory;
|
||||
TState argument;
|
||||
UniTask task;
|
||||
UniTask.Awaiter awaiter;
|
||||
|
||||
public DeferPromiseWithState(TState argument, Func<TState, UniTask> factory)
|
||||
{
|
||||
this.argument = argument;
|
||||
this.factory = factory;
|
||||
}
|
||||
|
||||
public void GetResult(short token)
|
||||
{
|
||||
awaiter.GetResult();
|
||||
}
|
||||
|
||||
public UniTaskStatus GetStatus(short token)
|
||||
{
|
||||
var f = Interlocked.Exchange(ref factory, null);
|
||||
if (f != null)
|
||||
{
|
||||
task = f(argument);
|
||||
awaiter = task.GetAwaiter();
|
||||
}
|
||||
|
||||
return task.Status;
|
||||
}
|
||||
|
||||
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||
{
|
||||
awaiter.SourceOnCompleted(continuation, state);
|
||||
}
|
||||
|
||||
public UniTaskStatus UnsafeGetStatus()
|
||||
{
|
||||
return task.Status;
|
||||
}
|
||||
}
|
||||
|
||||
sealed class DeferPromiseWithState<TState, TResult> : IUniTaskSource<TResult>
|
||||
{
|
||||
Func<TState, UniTask<TResult>> factory;
|
||||
TState argument;
|
||||
UniTask<TResult> task;
|
||||
UniTask<TResult>.Awaiter awaiter;
|
||||
|
||||
public DeferPromiseWithState(TState argument, Func<TState, UniTask<TResult>> factory)
|
||||
{
|
||||
this.argument = argument;
|
||||
this.factory = factory;
|
||||
}
|
||||
|
||||
public TResult GetResult(short token)
|
||||
{
|
||||
return awaiter.GetResult();
|
||||
}
|
||||
|
||||
void IUniTaskSource.GetResult(short token)
|
||||
{
|
||||
awaiter.GetResult();
|
||||
}
|
||||
|
||||
public UniTaskStatus GetStatus(short token)
|
||||
{
|
||||
var f = Interlocked.Exchange(ref factory, null);
|
||||
if (f != null)
|
||||
{
|
||||
task = f(argument);
|
||||
awaiter = task.GetAwaiter();
|
||||
}
|
||||
|
||||
return task.Status;
|
||||
}
|
||||
|
||||
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||
{
|
||||
awaiter.SourceOnCompleted(continuation, state);
|
||||
}
|
||||
|
||||
public UniTaskStatus UnsafeGetStatus()
|
||||
{
|
||||
return task.Status;
|
||||
}
|
||||
}
|
||||
|
||||
sealed class NeverPromise<T> : IUniTaskSource<T>
|
||||
{
|
||||
static readonly Action<object> cancellationCallback = CancellationCallback;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.Tracing;
|
||||
using System.Threading;
|
||||
using Cysharp.Threading.Tasks.Internal;
|
||||
|
||||
@@ -14,11 +15,21 @@ namespace Cysharp.Threading.Tasks
|
||||
return new UniTask(WaitUntilPromise.Create(predicate, timing, cancellationToken, cancelImmediately, out var token), token);
|
||||
}
|
||||
|
||||
public static UniTask WaitUntil<T>(T state, Func<T, bool> predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false)
|
||||
{
|
||||
return new UniTask(WaitUntilPromise<T>.Create(state, predicate, timing, cancellationToken, cancelImmediately, out var token), token);
|
||||
}
|
||||
|
||||
public static UniTask WaitWhile(Func<bool> predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false)
|
||||
{
|
||||
return new UniTask(WaitWhilePromise.Create(predicate, timing, cancellationToken, cancelImmediately, out var token), token);
|
||||
}
|
||||
|
||||
public static UniTask WaitWhile<T>(T state, Func<T, bool> predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken), bool cancelImmediately = false)
|
||||
{
|
||||
return new UniTask(WaitWhilePromise<T>.Create(state, predicate, timing, cancellationToken, cancelImmediately, out var token), token);
|
||||
}
|
||||
|
||||
public static UniTask WaitUntilCanceled(CancellationToken cancellationToken, PlayerLoopTiming timing = PlayerLoopTiming.Update, bool completeImmediately = false)
|
||||
{
|
||||
return new UniTask(WaitUntilCanceledPromise.Create(cancellationToken, timing, completeImmediately, out var token), token);
|
||||
@@ -49,6 +60,7 @@ namespace Cysharp.Threading.Tasks
|
||||
Func<bool> predicate;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
|
||||
@@ -70,6 +82,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
result.predicate = predicate;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -96,7 +109,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,6 +167,136 @@ namespace Cysharp.Threading.Tasks
|
||||
predicate = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
|
||||
sealed class WaitUntilPromise<T> : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitUntilPromise<T>>
|
||||
{
|
||||
static TaskPool<WaitUntilPromise<T>> pool;
|
||||
WaitUntilPromise<T> nextNode;
|
||||
public ref WaitUntilPromise<T> NextNode => ref nextNode;
|
||||
|
||||
static WaitUntilPromise()
|
||||
{
|
||||
TaskPool.RegisterSizeGetter(typeof(WaitUntilPromise<T>), () => pool.Size);
|
||||
}
|
||||
|
||||
Func<T, bool> predicate;
|
||||
T argument;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
|
||||
WaitUntilPromise()
|
||||
{
|
||||
}
|
||||
|
||||
public static IUniTaskSource Create(T argument, Func<T, bool> predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token)
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
|
||||
}
|
||||
|
||||
if (!pool.TryPop(out var result))
|
||||
{
|
||||
result = new WaitUntilPromise<T>();
|
||||
}
|
||||
|
||||
result.predicate = predicate;
|
||||
result.argument = argument;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
|
||||
{
|
||||
var promise = (WaitUntilPromise<T>)state;
|
||||
promise.core.TrySetCanceled(promise.cancellationToken);
|
||||
}, result);
|
||||
}
|
||||
|
||||
TaskTracker.TrackActiveTask(result, 3);
|
||||
|
||||
PlayerLoopHelper.AddAction(timing, result);
|
||||
|
||||
token = result.core.Version;
|
||||
return result;
|
||||
}
|
||||
|
||||
public void GetResult(short token)
|
||||
{
|
||||
try
|
||||
{
|
||||
core.GetResult(token);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public UniTaskStatus GetStatus(short token)
|
||||
{
|
||||
return core.GetStatus(token);
|
||||
}
|
||||
|
||||
public UniTaskStatus UnsafeGetStatus()
|
||||
{
|
||||
return core.UnsafeGetStatus();
|
||||
}
|
||||
|
||||
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||
{
|
||||
core.OnCompleted(continuation, state, token);
|
||||
}
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!predicate(argument))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
core.TrySetException(ex);
|
||||
return false;
|
||||
}
|
||||
|
||||
core.TrySetResult(null);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
core.Reset();
|
||||
predicate = default;
|
||||
argument = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
@@ -165,6 +315,7 @@ namespace Cysharp.Threading.Tasks
|
||||
Func<bool> predicate;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
|
||||
@@ -186,7 +337,8 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
result.predicate = predicate;
|
||||
result.cancellationToken = cancellationToken;
|
||||
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
|
||||
@@ -212,7 +364,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -263,6 +422,136 @@ namespace Cysharp.Threading.Tasks
|
||||
predicate = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
|
||||
sealed class WaitWhilePromise<T> : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitWhilePromise<T>>
|
||||
{
|
||||
static TaskPool<WaitWhilePromise<T>> pool;
|
||||
WaitWhilePromise<T> nextNode;
|
||||
public ref WaitWhilePromise<T> NextNode => ref nextNode;
|
||||
|
||||
static WaitWhilePromise()
|
||||
{
|
||||
TaskPool.RegisterSizeGetter(typeof(WaitWhilePromise<T>), () => pool.Size);
|
||||
}
|
||||
|
||||
Func<T, bool> predicate;
|
||||
T argument;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
|
||||
WaitWhilePromise()
|
||||
{
|
||||
}
|
||||
|
||||
public static IUniTaskSource Create(T argument, Func<T, bool> predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, bool cancelImmediately, out short token)
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
|
||||
}
|
||||
|
||||
if (!pool.TryPop(out var result))
|
||||
{
|
||||
result = new WaitWhilePromise<T>();
|
||||
}
|
||||
|
||||
result.predicate = predicate;
|
||||
result.argument = argument;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
|
||||
{
|
||||
var promise = (WaitWhilePromise<T>)state;
|
||||
promise.core.TrySetCanceled(promise.cancellationToken);
|
||||
}, result);
|
||||
}
|
||||
|
||||
TaskTracker.TrackActiveTask(result, 3);
|
||||
|
||||
PlayerLoopHelper.AddAction(timing, result);
|
||||
|
||||
token = result.core.Version;
|
||||
return result;
|
||||
}
|
||||
|
||||
public void GetResult(short token)
|
||||
{
|
||||
try
|
||||
{
|
||||
core.GetResult(token);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public UniTaskStatus GetStatus(short token)
|
||||
{
|
||||
return core.GetStatus(token);
|
||||
}
|
||||
|
||||
public UniTaskStatus UnsafeGetStatus()
|
||||
{
|
||||
return core.UnsafeGetStatus();
|
||||
}
|
||||
|
||||
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||
{
|
||||
core.OnCompleted(continuation, state, token);
|
||||
}
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (predicate(argument))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
core.TrySetException(ex);
|
||||
return false;
|
||||
}
|
||||
|
||||
core.TrySetResult(null);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
core.Reset();
|
||||
predicate = default;
|
||||
argument = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
@@ -280,6 +569,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<object> core;
|
||||
|
||||
@@ -287,7 +577,7 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
}
|
||||
|
||||
public static IUniTaskSource Create(CancellationToken cancellationToken, PlayerLoopTiming timing, bool completeImmediately, out short token)
|
||||
public static IUniTaskSource Create(CancellationToken cancellationToken, PlayerLoopTiming timing, bool cancelImmediately, out short token)
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
@@ -300,8 +590,9 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (completeImmediately && cancellationToken.CanBeCanceled)
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
|
||||
{
|
||||
@@ -326,7 +617,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,6 +660,7 @@ namespace Cysharp.Threading.Tasks
|
||||
core.Reset();
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
@@ -385,6 +684,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IEqualityComparer<U> equalityComparer;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<U> core;
|
||||
|
||||
@@ -410,7 +710,8 @@ namespace Cysharp.Threading.Tasks
|
||||
result.currentValue = monitorFunction(target);
|
||||
result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault<U>();
|
||||
result.cancellationToken = cancellationToken;
|
||||
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
|
||||
@@ -436,7 +737,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -497,6 +805,7 @@ namespace Cysharp.Threading.Tasks
|
||||
equalityComparer = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
@@ -519,6 +828,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IEqualityComparer<U> equalityComparer;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
|
||||
UniTaskCompletionSourceCore<U> core;
|
||||
|
||||
@@ -543,7 +853,8 @@ namespace Cysharp.Threading.Tasks
|
||||
result.currentValue = monitorFunction(target);
|
||||
result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault<U>();
|
||||
result.cancellationToken = cancellationToken;
|
||||
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
|
||||
@@ -569,7 +880,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -630,6 +948,7 @@ namespace Cysharp.Threading.Tasks
|
||||
equalityComparer = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
||||
#pragma warning disable CS0436
|
||||
|
||||
#if UNITASK_NETCORE || UNITY_2022_3_OR_NEWER
|
||||
#define SUPPORT_VALUETASK
|
||||
#endif
|
||||
|
||||
using Cysharp.Threading.Tasks.CompilerServices;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
@@ -69,7 +73,7 @@ namespace Cysharp.Threading.Tasks
|
||||
return new UniTask<bool>(new IsCanceledSource(source), token);
|
||||
}
|
||||
|
||||
#if !UNITY_2018_3_OR_NEWER || UNITY_2021_2_OR_NEWER
|
||||
#if SUPPORT_VALUETASK
|
||||
|
||||
public static implicit operator System.Threading.Tasks.ValueTask(in UniTask self)
|
||||
{
|
||||
@@ -78,7 +82,7 @@ namespace Cysharp.Threading.Tasks
|
||||
return default;
|
||||
}
|
||||
|
||||
#if NETSTANDARD2_0
|
||||
#if (UNITASK_NETCORE && NETSTANDARD2_0)
|
||||
return self.AsValueTask();
|
||||
#else
|
||||
return new System.Threading.Tasks.ValueTask(self.source, self.token);
|
||||
@@ -118,7 +122,7 @@ namespace Cysharp.Threading.Tasks
|
||||
this.source.GetResult(this.token);
|
||||
return CompletedTasks.AsyncUnit;
|
||||
}
|
||||
else if(this.source is IUniTaskSource<AsyncUnit> asyncUnitSource)
|
||||
else if (this.source is IUniTaskSource<AsyncUnit> asyncUnitSource)
|
||||
{
|
||||
return new UniTask<AsyncUnit>(asyncUnitSource, this.token);
|
||||
}
|
||||
@@ -440,7 +444,7 @@ namespace Cysharp.Threading.Tasks
|
||||
return self.AsUniTask();
|
||||
}
|
||||
|
||||
#if !UNITY_2018_3_OR_NEWER || UNITY_2021_2_OR_NEWER
|
||||
#if SUPPORT_VALUETASK
|
||||
|
||||
public static implicit operator System.Threading.Tasks.ValueTask<T>(in UniTask<T> self)
|
||||
{
|
||||
@@ -449,7 +453,7 @@ namespace Cysharp.Threading.Tasks
|
||||
return new System.Threading.Tasks.ValueTask<T>(self.result);
|
||||
}
|
||||
|
||||
#if NETSTANDARD2_0
|
||||
#if (UNITASK_NETCORE && NETSTANDARD2_0)
|
||||
return self.AsValueTask();
|
||||
#else
|
||||
return new System.Threading.Tasks.ValueTask<T>(self.source, self.token);
|
||||
|
||||
@@ -201,6 +201,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
task.Forget();
|
||||
return UniTask.FromCanceled(cancellationToken);
|
||||
}
|
||||
|
||||
@@ -224,6 +225,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
task.Forget();
|
||||
return UniTask.FromCanceled<T>(cancellationToken);
|
||||
}
|
||||
|
||||
|
||||
@@ -101,6 +101,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IProgress<float> progress;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<UnityEngine.Object[]> core;
|
||||
@@ -127,6 +128,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.asyncOperation = asyncOperation;
|
||||
result.progress = progress;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
@@ -156,7 +158,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,6 +225,7 @@ namespace Cysharp.Threading.Tasks
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
@@ -223,19 +233,17 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(asyncOperation.allAssets);
|
||||
}
|
||||
core.TrySetResult(asyncOperation.allAssets);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace Cysharp.Threading.Tasks
|
||||
AsyncGPUReadbackRequest asyncOperation;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
|
||||
bool cancelImmediately;
|
||||
UniTaskCompletionSourceCore<AsyncGPUReadbackRequest> core;
|
||||
|
||||
AsyncGPUReadbackRequestAwaiterConfiguredSource()
|
||||
@@ -66,6 +66,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
result.asyncOperation = asyncOperation;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
{
|
||||
@@ -92,7 +93,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,6 +154,7 @@ namespace Cysharp.Threading.Tasks
|
||||
asyncOperation = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,6 +97,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IProgress<float> progress;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||
@@ -123,6 +124,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.asyncOperation = asyncOperation;
|
||||
result.progress = progress;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
@@ -152,7 +154,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +218,7 @@ namespace Cysharp.Threading.Tasks
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
@@ -216,19 +226,16 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(AsyncUnit.Default);
|
||||
}
|
||||
core.TrySetResult(AsyncUnit.Default);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -320,6 +327,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IProgress<float> progress;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<UnityEngine.Object> core;
|
||||
@@ -346,6 +354,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.asyncOperation = asyncOperation;
|
||||
result.progress = progress;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
@@ -375,7 +384,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -436,6 +452,7 @@ namespace Cysharp.Threading.Tasks
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
@@ -443,19 +460,16 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(asyncOperation.asset);
|
||||
}
|
||||
core.TrySetResult(asyncOperation.asset);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -548,6 +562,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IProgress<float> progress;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<UnityEngine.Object> core;
|
||||
@@ -574,6 +589,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.asyncOperation = asyncOperation;
|
||||
result.progress = progress;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
@@ -603,7 +619,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -664,6 +687,7 @@ namespace Cysharp.Threading.Tasks
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
@@ -671,19 +695,16 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(asyncOperation.asset);
|
||||
}
|
||||
core.TrySetResult(asyncOperation.asset);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -777,6 +798,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IProgress<float> progress;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<AssetBundle> core;
|
||||
@@ -803,6 +825,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.asyncOperation = asyncOperation;
|
||||
result.progress = progress;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
@@ -832,7 +855,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -893,6 +923,7 @@ namespace Cysharp.Threading.Tasks
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
@@ -900,19 +931,16 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(asyncOperation.assetBundle);
|
||||
}
|
||||
core.TrySetResult(asyncOperation.assetBundle);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1021,6 +1049,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IProgress<float> progress;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<UnityWebRequest> core;
|
||||
@@ -1047,6 +1076,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.asyncOperation = asyncOperation;
|
||||
result.progress = progress;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
@@ -1077,7 +1107,14 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1146,6 +1183,7 @@ namespace Cysharp.Threading.Tasks
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
@@ -1153,23 +1191,20 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else if (asyncOperation.webRequest.IsError())
|
||||
{
|
||||
core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest));
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else if (asyncOperation.webRequest.IsError())
|
||||
{
|
||||
core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest));
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(asyncOperation.webRequest);
|
||||
}
|
||||
core.TrySetResult(asyncOperation.webRequest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,6 +165,7 @@ namespace Cysharp.Threading.Tasks
|
||||
IProgress<float> progress;
|
||||
CancellationToken cancellationToken;
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
|
||||
UniTaskCompletionSourceCore<<#= IsVoid(t) ? "AsyncUnit" : t.returnType #>> core;
|
||||
@@ -191,6 +192,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.asyncOperation = asyncOperation;
|
||||
result.progress = progress;
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
@@ -227,7 +229,10 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
TryReturn();
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -304,6 +309,7 @@ namespace Cysharp.Threading.Tasks
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
@@ -311,31 +317,28 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
TryReturn();
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
<# if(IsUnityWebRequest(t)) { #>
|
||||
else if (asyncOperation.webRequest.IsError())
|
||||
{
|
||||
core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest));
|
||||
}
|
||||
else
|
||||
{
|
||||
completed = true;
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
<# if(IsUnityWebRequest(t)) { #>
|
||||
else if (asyncOperation.webRequest.IsError())
|
||||
{
|
||||
core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest));
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(asyncOperation.webRequest);
|
||||
}
|
||||
<# } else { #>
|
||||
else
|
||||
{
|
||||
core.TrySetResult(<#= IsVoid(t) ? "AsyncUnit.Default" : $"asyncOperation.{t.returnField}" #>);
|
||||
}
|
||||
<# } #>
|
||||
core.TrySetResult(asyncOperation.webRequest);
|
||||
}
|
||||
<# } else { #>
|
||||
else
|
||||
{
|
||||
core.TrySetResult(<#= IsVoid(t) ? "AsyncUnit.Default" : $"asyncOperation.{t.returnField}" #>);
|
||||
}
|
||||
<# } #>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -339,7 +339,7 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
void InvokeCore(string item1, int item2, int item3)
|
||||
{
|
||||
innerEvent.Invoke(item1, item2, item3);
|
||||
Invoke((item1, item2, item3));
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
@@ -855,4 +855,4 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "com.cysharp.unitask",
|
||||
"displayName": "UniTask",
|
||||
"author": { "name": "Cysharp, Inc.", "url": "https://cysharp.co.jp/en/" },
|
||||
"version": "2.5.1",
|
||||
"version": "2.5.7",
|
||||
"unity": "2018.4",
|
||||
"description": "Provides an efficient async/await integration to Unity.",
|
||||
"keywords": [ "async/await", "async", "Task", "UniTask" ],
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 894f21dfce4e82343a91661e1ec1a455
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 959c1472a5d812843bedf9341e87af3b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,133 +0,0 @@
|
||||
#if UNITY_EDITOR
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace RuntimeUnitTestToolkit.Editor
|
||||
{
|
||||
// functional declarative construction like flutter.
|
||||
|
||||
internal interface IBuilder
|
||||
{
|
||||
GameObject GameObject { get; }
|
||||
T GetComponent<T>();
|
||||
}
|
||||
|
||||
internal class Builder<T> : IBuilder
|
||||
where T : Component
|
||||
{
|
||||
public T Component1 { get; private set; }
|
||||
public GameObject GameObject { get; private set; }
|
||||
|
||||
public Transform Transform { get { return GameObject.transform; } }
|
||||
public RectTransform RectTransform { get { return GameObject.GetComponent<RectTransform>(); } }
|
||||
|
||||
public Action<GameObject> SetTarget
|
||||
{
|
||||
set
|
||||
{
|
||||
value(this.GameObject);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public IBuilder Child
|
||||
{
|
||||
set
|
||||
{
|
||||
value.GameObject.transform.SetParent(GameObject.transform);
|
||||
}
|
||||
}
|
||||
|
||||
public IBuilder[] Children
|
||||
{
|
||||
set
|
||||
{
|
||||
foreach (var item in value)
|
||||
{
|
||||
item.GameObject.transform.SetParent(GameObject.transform);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Builder(string name)
|
||||
{
|
||||
this.GameObject = new GameObject(name);
|
||||
this.Component1 = GameObject.AddComponent<T>();
|
||||
}
|
||||
|
||||
public Builder(string name, out T referenceSelf) // out primary reference.
|
||||
{
|
||||
this.GameObject = new GameObject(name);
|
||||
this.Component1 = GameObject.AddComponent<T>();
|
||||
referenceSelf = this.Component1;
|
||||
}
|
||||
|
||||
public TComponent GetComponent<TComponent>()
|
||||
{
|
||||
return this.GameObject.GetComponent<TComponent>();
|
||||
}
|
||||
}
|
||||
|
||||
internal class Builder<T1, T2> : Builder<T1>
|
||||
where T1 : Component
|
||||
where T2 : Component
|
||||
{
|
||||
public T2 Component2 { get; private set; }
|
||||
|
||||
public Builder(string name)
|
||||
: base(name)
|
||||
{
|
||||
this.Component2 = GameObject.AddComponent<T2>();
|
||||
}
|
||||
|
||||
public Builder(string name, out T1 referenceSelf)
|
||||
: base(name, out referenceSelf)
|
||||
{
|
||||
this.Component2 = GameObject.AddComponent<T2>();
|
||||
}
|
||||
}
|
||||
|
||||
internal class Builder<T1, T2, T3> : Builder<T1, T2>
|
||||
where T1 : Component
|
||||
where T2 : Component
|
||||
where T3 : Component
|
||||
{
|
||||
public T3 Component3 { get; private set; }
|
||||
|
||||
public Builder(string name)
|
||||
: base(name)
|
||||
{
|
||||
this.Component3 = GameObject.AddComponent<T3>();
|
||||
}
|
||||
|
||||
public Builder(string name, out T1 referenceSelf)
|
||||
: base(name, out referenceSelf)
|
||||
{
|
||||
this.Component3 = GameObject.AddComponent<T3>();
|
||||
}
|
||||
}
|
||||
|
||||
internal class Builder<T1, T2, T3, T4> : Builder<T1, T2, T3>
|
||||
where T1 : Component
|
||||
where T2 : Component
|
||||
where T3 : Component
|
||||
where T4 : Component
|
||||
{
|
||||
public T4 Component4 { get; private set; }
|
||||
|
||||
public Builder(string name)
|
||||
: base(name)
|
||||
{
|
||||
this.Component4 = GameObject.AddComponent<T4>();
|
||||
}
|
||||
|
||||
public Builder(string name, out T1 referenceSelf)
|
||||
: base(name, out referenceSelf)
|
||||
{
|
||||
this.Component4 = GameObject.AddComponent<T4>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8760bbbab905a534eb6fb7b61b736926
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,345 +0,0 @@
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
|
||||
// Settings MenuItems.
|
||||
|
||||
public static partial class UnitTestBuilder
|
||||
{
|
||||
[MenuItem("Test/Settings/ScriptBackend/Mono", validate = true, priority = 1)]
|
||||
static bool ValidateScriptBackendMono()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/ScriptBackend/Mono", LoadOrGetDefaultSettings().ScriptBackend == ScriptingImplementation.Mono2x);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/ScriptBackend/Mono", validate = false, priority = 1)]
|
||||
static void ScriptBackendMono()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentScriptBackend = false;
|
||||
settings.ScriptBackend = ScriptingImplementation.Mono2x;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/ScriptBackend/IL2CPP", validate = true, priority = 2)]
|
||||
static bool ValidateScriptBackendIL2CPP()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/ScriptBackend/IL2CPP", LoadOrGetDefaultSettings().ScriptBackend == ScriptingImplementation.IL2CPP);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/ScriptBackend/IL2CPP", validate = false, priority = 2)]
|
||||
static void ScriptBackendIL2CPP()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentScriptBackend = false;
|
||||
settings.ScriptBackend = ScriptingImplementation.IL2CPP;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/AutoRunPlayer", validate = true, priority = 3)]
|
||||
static bool ValidateAutoRun()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/AutoRunPlayer", LoadOrGetDefaultSettings().AutoRunPlayer);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/AutoRunPlayer", validate = false, priority = 3)]
|
||||
static void AutoRun()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.AutoRunPlayer = !settings.AutoRunPlayer;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/Headless", validate = true, priority = 4)]
|
||||
static bool ValidateHeadless()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/Headless", LoadOrGetDefaultSettings().Headless);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/Headless", validate = false, priority = 4)]
|
||||
static void Headless()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.Headless = !settings.Headless;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/DisableAutoClose", validate = true, priority = 5)]
|
||||
static bool ValidateDisableAutoClose()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/DisableAutoClose", LoadOrGetDefaultSettings().DisableAutoClose);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/DisableAutoClose", validate = false, priority = 5)]
|
||||
static void DisableAutoClose()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.DisableAutoClose = !settings.DisableAutoClose;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
// generated
|
||||
|
||||
/*
|
||||
*
|
||||
void Main()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
var p = 1;
|
||||
foreach (var target in Enum.GetNames(typeof(BuildTarget)))
|
||||
{
|
||||
var path = $"Test/Settings/BuildTarget/{target}";
|
||||
var priority = p++;
|
||||
|
||||
var template = $@"
|
||||
[MenuItem(""{path}"", validate = true, priority = {priority})]
|
||||
static bool ValidateBuildTarget{target}()
|
||||
{{
|
||||
Menu.SetChecked(""{path}"", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.{target});
|
||||
return true;
|
||||
}}
|
||||
|
||||
[MenuItem(""{path}"", validate = false, priority = {priority})]
|
||||
static void BuildTarget{target}()
|
||||
{{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.{target};
|
||||
SaveSettings(settings);
|
||||
}}";
|
||||
|
||||
sb.AppendLine(template);
|
||||
}
|
||||
|
||||
sb.ToString().Dump();
|
||||
}
|
||||
|
||||
public enum BuildTarget
|
||||
{
|
||||
StandaloneWindows,
|
||||
StandaloneWindows64,
|
||||
StandaloneLinux,
|
||||
StandaloneLinux64,
|
||||
StandaloneOSX,
|
||||
WebGL,
|
||||
iOS,
|
||||
Android,
|
||||
WSAPlayer,
|
||||
PS4,
|
||||
XboxOne,
|
||||
Switch,
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneWindows", validate = true, priority = 1)]
|
||||
static bool ValidateBuildTargetStandaloneWindows()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/StandaloneWindows", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.StandaloneWindows);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneWindows", validate = false, priority = 1)]
|
||||
static void BuildTargetStandaloneWindows()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.StandaloneWindows;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneWindows64", validate = true, priority = 2)]
|
||||
static bool ValidateBuildTargetStandaloneWindows64()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/StandaloneWindows64", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.StandaloneWindows64);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneWindows64", validate = false, priority = 2)]
|
||||
static void BuildTargetStandaloneWindows64()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.StandaloneWindows64;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
#if !UNITY_2019_2_OR_NEWER
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneLinux", validate = true, priority = 3)]
|
||||
static bool ValidateBuildTargetStandaloneLinux()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/StandaloneLinux", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.StandaloneLinux);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneLinux", validate = false, priority = 3)]
|
||||
static void BuildTargetStandaloneLinux()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.StandaloneLinux;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneLinux64", validate = true, priority = 4)]
|
||||
static bool ValidateBuildTargetStandaloneLinux64()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/StandaloneLinux64", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.StandaloneLinux64);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneLinux64", validate = false, priority = 4)]
|
||||
static void BuildTargetStandaloneLinux64()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.StandaloneLinux64;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneOSX", validate = true, priority = 5)]
|
||||
static bool ValidateBuildTargetStandaloneOSX()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/StandaloneOSX", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.StandaloneOSX);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/StandaloneOSX", validate = false, priority = 5)]
|
||||
static void BuildTargetStandaloneOSX()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.StandaloneOSX;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/WebGL", validate = true, priority = 6)]
|
||||
static bool ValidateBuildTargetWebGL()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/WebGL", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.WebGL);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/WebGL", validate = false, priority = 6)]
|
||||
static void BuildTargetWebGL()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.WebGL;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/iOS", validate = true, priority = 7)]
|
||||
static bool ValidateBuildTargetiOS()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/iOS", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.iOS);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/iOS", validate = false, priority = 7)]
|
||||
static void BuildTargetiOS()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.iOS;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/Android", validate = true, priority = 8)]
|
||||
static bool ValidateBuildTargetAndroid()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/Android", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.Android);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/Android", validate = false, priority = 8)]
|
||||
static void BuildTargetAndroid()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.Android;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/WSAPlayer", validate = true, priority = 9)]
|
||||
static bool ValidateBuildTargetWSAPlayer()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/WSAPlayer", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.WSAPlayer);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/WSAPlayer", validate = false, priority = 9)]
|
||||
static void BuildTargetWSAPlayer()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.WSAPlayer;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/PS4", validate = true, priority = 10)]
|
||||
static bool ValidateBuildTargetPS4()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/PS4", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.PS4);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/PS4", validate = false, priority = 10)]
|
||||
static void BuildTargetPS4()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.PS4;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/XboxOne", validate = true, priority = 11)]
|
||||
static bool ValidateBuildTargetXboxOne()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/XboxOne", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.XboxOne);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/XboxOne", validate = false, priority = 11)]
|
||||
static void BuildTargetXboxOne()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.XboxOne;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/Switch", validate = true, priority = 12)]
|
||||
static bool ValidateBuildTargetSwitch()
|
||||
{
|
||||
Menu.SetChecked("Test/Settings/BuildTarget/Switch", LoadOrGetDefaultSettings().BuildTarget == BuildTarget.Switch);
|
||||
return true;
|
||||
}
|
||||
|
||||
[MenuItem("Test/Settings/BuildTarget/Switch", validate = false, priority = 12)]
|
||||
static void BuildTargetSwitch()
|
||||
{
|
||||
var settings = LoadOrGetDefaultSettings();
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = BuildTarget.Switch;
|
||||
SaveSettings(settings);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,546 +0,0 @@
|
||||
#if UNITY_EDITOR
|
||||
|
||||
using RuntimeUnitTestToolkit;
|
||||
using RuntimeUnitTestToolkit.Editor;
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Build.Reporting;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityEngine.UI;
|
||||
|
||||
internal class RuntimeUnitTestSettings
|
||||
{
|
||||
public ScriptingImplementation ScriptBackend;
|
||||
public bool UseCurrentScriptBackend;
|
||||
public BuildTarget BuildTarget;
|
||||
public bool UseCurrentBuildTarget;
|
||||
|
||||
public bool Headless;
|
||||
public bool AutoRunPlayer;
|
||||
public bool DisableAutoClose;
|
||||
|
||||
public RuntimeUnitTestSettings()
|
||||
{
|
||||
UseCurrentBuildTarget = true;
|
||||
UseCurrentScriptBackend = true;
|
||||
Headless = false;
|
||||
AutoRunPlayer = true;
|
||||
DisableAutoClose = false;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{ScriptBackend} {BuildTarget} Headless:{Headless} AutoRunPlayer:{AutoRunPlayer} DisableAutoClose:{DisableAutoClose}";
|
||||
}
|
||||
}
|
||||
|
||||
// no namespace(because invoke from commandline)
|
||||
public static partial class UnitTestBuilder
|
||||
{
|
||||
const string SettingsKeyBase = "RuntimeUnitTest.Settings.";
|
||||
|
||||
[MenuItem("Test/BuildUnitTest")]
|
||||
public static void BuildUnitTest()
|
||||
{
|
||||
var settings = new RuntimeUnitTestSettings(); // default
|
||||
|
||||
string buildPath = null;
|
||||
|
||||
if (Application.isBatchMode) // from commandline
|
||||
{
|
||||
settings.AutoRunPlayer = false;
|
||||
settings.DisableAutoClose = false;
|
||||
|
||||
var cmdArgs = Environment.GetCommandLineArgs();
|
||||
for (int i = 0; i < cmdArgs.Length; i++)
|
||||
{
|
||||
if (string.Equals(cmdArgs[i].Trim('-', '/'), "ScriptBackend", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
settings.UseCurrentScriptBackend = false;
|
||||
var str = cmdArgs[++i];
|
||||
if (str.StartsWith("mono", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
settings.ScriptBackend = ScriptingImplementation.Mono2x;
|
||||
}
|
||||
else if (str.StartsWith("IL2CPP", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
settings.ScriptBackend = ScriptingImplementation.IL2CPP;
|
||||
}
|
||||
else
|
||||
{
|
||||
settings.ScriptBackend = (ScriptingImplementation)Enum.Parse(typeof(ScriptingImplementation), str, true);
|
||||
}
|
||||
}
|
||||
else if (string.Equals(cmdArgs[i].Trim('-', '/'), "BuildTarget", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
settings.UseCurrentBuildTarget = false;
|
||||
settings.BuildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), cmdArgs[++i], true);
|
||||
}
|
||||
else if (string.Equals(cmdArgs[i].Trim('-', '/'), "Headless", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
settings.Headless = true;
|
||||
}
|
||||
else if (string.Equals(cmdArgs[i].Trim('-', '/'), "buildPath", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
buildPath = cmdArgs[++i];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var key = SettingsKeyBase + Application.productName;
|
||||
var settingsValue = EditorPrefs.GetString(key, null);
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(settingsValue))
|
||||
{
|
||||
settings = JsonUtility.FromJson<RuntimeUnitTestSettings>(settingsValue);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
UnityEngine.Debug.LogError("Fail to load RuntimeUnitTest settings");
|
||||
EditorPrefs.SetString(key, null);
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.UseCurrentBuildTarget)
|
||||
{
|
||||
settings.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
|
||||
}
|
||||
if (settings.UseCurrentScriptBackend)
|
||||
{
|
||||
settings.ScriptBackend = PlayerSettings.GetScriptingBackend(ToBuildTargetGroup(settings.BuildTarget));
|
||||
}
|
||||
|
||||
if (buildPath == null)
|
||||
{
|
||||
buildPath = $"bin/UnitTest/{settings.BuildTarget}_{settings.ScriptBackend}/test" + GetExtensionForBuildTarget(settings.BuildTarget);
|
||||
}
|
||||
|
||||
var originalScene = SceneManager.GetActiveScene().path;
|
||||
|
||||
BuildUnitTest(buildPath, settings.ScriptBackend, settings.BuildTarget, settings.Headless, settings.AutoRunPlayer, settings.DisableAutoClose);
|
||||
|
||||
// reopen original scene
|
||||
if (!string.IsNullOrWhiteSpace(originalScene))
|
||||
{
|
||||
EditorSceneManager.OpenScene(originalScene, OpenSceneMode.Single);
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MenuItem("Test/LoadUnitTestScene")]
|
||||
public static void LoadUnitTestScene()
|
||||
{
|
||||
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
|
||||
BuildUnitTestRunnerScene();
|
||||
EditorSceneManager.MarkSceneDirty(scene);
|
||||
}
|
||||
|
||||
static RuntimeUnitTestSettings LoadOrGetDefaultSettings()
|
||||
{
|
||||
var key = SettingsKeyBase + Application.productName;
|
||||
|
||||
var settingsValue = EditorPrefs.GetString(key, null);
|
||||
RuntimeUnitTestSettings settings = null;
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(settingsValue))
|
||||
{
|
||||
settings = JsonUtility.FromJson<RuntimeUnitTestSettings>(settingsValue);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
UnityEngine.Debug.LogError("Fail to load RuntimeUnitTest settings");
|
||||
EditorPrefs.SetString(key, null);
|
||||
settings = null;
|
||||
}
|
||||
|
||||
if (settings == null)
|
||||
{
|
||||
// default
|
||||
settings = new RuntimeUnitTestSettings
|
||||
{
|
||||
UseCurrentBuildTarget = true,
|
||||
UseCurrentScriptBackend = true,
|
||||
Headless = false,
|
||||
AutoRunPlayer = true,
|
||||
};
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
static void SaveSettings(RuntimeUnitTestSettings settings)
|
||||
{
|
||||
var key = SettingsKeyBase + Application.productName;
|
||||
EditorPrefs.SetString(key, JsonUtility.ToJson(settings));
|
||||
}
|
||||
|
||||
public static void BuildUnitTest(string buildPath, ScriptingImplementation scriptBackend, BuildTarget buildTarget, bool headless, bool autoRunPlayer, bool disableAutoClose)
|
||||
{
|
||||
var sceneName = "Assets/TempRuntimeUnitTestScene_" + DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||
if (disableAutoClose)
|
||||
{
|
||||
sceneName += "_DisableAutoClose";
|
||||
}
|
||||
sceneName += ".unity";
|
||||
|
||||
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
|
||||
|
||||
BuildUnitTestRunnerScene();
|
||||
|
||||
EditorSceneManager.MarkSceneDirty(scene);
|
||||
AssetDatabase.SaveAssets();
|
||||
EditorSceneManager.SaveScene(scene, sceneName, false);
|
||||
try
|
||||
{
|
||||
Build(sceneName, buildPath, new RuntimeUnitTestSettings { ScriptBackend = scriptBackend, BuildTarget = buildTarget, Headless = headless, AutoRunPlayer = autoRunPlayer, DisableAutoClose = disableAutoClose });
|
||||
}
|
||||
finally
|
||||
{
|
||||
AssetDatabase.DeleteAsset(sceneName);
|
||||
}
|
||||
}
|
||||
|
||||
public static UnitTestRunner BuildUnitTestRunnerScene()
|
||||
{
|
||||
const string kStandardSpritePath = "UI/Skin/UISprite.psd";
|
||||
const string kBackgroundSpritePath = "UI/Skin/Background.psd";
|
||||
var uisprite = AssetDatabase.GetBuiltinExtraResource<Sprite>(kStandardSpritePath);
|
||||
var background = AssetDatabase.GetBuiltinExtraResource<Sprite>(kBackgroundSpritePath);
|
||||
|
||||
ScrollRect buttonList;
|
||||
VerticalLayoutGroup listLayout;
|
||||
Scrollbar refListScrollbar;
|
||||
ScrollRect logList;
|
||||
Scrollbar refLogScrollbar;
|
||||
Button clearButton;
|
||||
Text logText;
|
||||
|
||||
// Flutter like coded build utility
|
||||
|
||||
var rootObject = new Builder<Camera>("SceneRoot")
|
||||
{
|
||||
Children = new IBuilder[] {
|
||||
new Builder<EventSystem, StandaloneInputModule>("EventSystem"),
|
||||
new Builder<Canvas, CanvasScaler, GraphicRaycaster>("Canvas") {
|
||||
Component1 = { renderMode = RenderMode.ScreenSpaceOverlay },
|
||||
Children = new IBuilder[] {
|
||||
new Builder<HorizontalLayoutGroup, CanvasRenderer>("HorizontalSplitter") {
|
||||
RectTransform = { anchorMin = new Vector2(0, 0), anchorMax = new Vector2(1, 1) },
|
||||
Component1 = { childControlWidth = true, childControlHeight = true, spacing = 10 },
|
||||
Children = new IBuilder[] {
|
||||
new Builder<ScrollRect, CanvasRenderer>("ButtonList", out buttonList) {
|
||||
RectTransform = { pivot = new Vector2(0.5f, 0.5f) },
|
||||
Component1 = { horizontal =false, vertical = true, movementType = ScrollRect.MovementType.Clamped },
|
||||
Children = new IBuilder[] {
|
||||
new Builder<VerticalLayoutGroup, ContentSizeFitter>("ListLayoutToAttach", out listLayout) {
|
||||
RectTransform = { anchorMin = new Vector2(0, 0), anchorMax = new Vector2(1, 1), pivot = new Vector2(0, 1) },
|
||||
Component1 = { childControlWidth = true, childControlHeight = true, childForceExpandWidth = true, childForceExpandHeight = false, spacing = 10, padding = new RectOffset(10,20,10,10) },
|
||||
Component2 = { horizontalFit = ContentSizeFitter.FitMode.Unconstrained, verticalFit = ContentSizeFitter.FitMode.PreferredSize },
|
||||
SetTarget = self => { buttonList.content = self.GetComponent<RectTransform>(); },
|
||||
Child = new Builder<Button, Image, LayoutElement>("ClearButton", out clearButton) {
|
||||
Component2 = { sprite = uisprite, type = Image.Type.Sliced },
|
||||
Component3 = { minHeight = 50 },
|
||||
SetTarget = self => { self.GetComponent<Button>().targetGraphic = self.GetComponent<Graphic>(); },
|
||||
Child = new Builder<Text>("ButtonText") {
|
||||
RectTransform = { anchorMin = new Vector2(0, 0), anchorMax = new Vector2(1, 1), pivot = new Vector2(0.5f, 0.5f) },
|
||||
Component1 = { text = "Clear", color = FromRGB(50, 50, 50), alignment = TextAnchor.MiddleCenter, fontSize = 24, lineSpacing = 1 }
|
||||
}
|
||||
}
|
||||
},
|
||||
new Builder<Scrollbar,Image>("ListScrollbar", out refListScrollbar) {
|
||||
RectTransform = { anchorMin = new Vector2(1, 0), anchorMax = new Vector2(1, 1) },
|
||||
Component1 = { navigation = new Navigation{ mode = Navigation.Mode.None }, direction = Scrollbar.Direction.BottomToTop, size = 1.0f },
|
||||
Component2 = { sprite = background, type = Image.Type.Sliced },
|
||||
SetTarget = self => { buttonList.verticalScrollbar = self.GetComponent<Scrollbar>(); },
|
||||
Child = new Builder<RectTransform>("Sliding Area") {
|
||||
RectTransform = { anchorMin = new Vector2(0, 0), anchorMax = new Vector2(1, 1) },
|
||||
Child = new Builder<Image>("Handle") {
|
||||
Component1 = { sprite = uisprite, type = Image.Type.Sliced },
|
||||
SetTarget = self =>
|
||||
{
|
||||
refListScrollbar.targetGraphic = self.GetComponent<Graphic>();
|
||||
refListScrollbar.handleRect = self.GetComponent<RectTransform>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
new Builder<ScrollRect, CanvasRenderer>("ScrollableText", out logList) {
|
||||
RectTransform = { pivot = new Vector2(0.5f, 0.5f) },
|
||||
Component1 = { horizontal =false, vertical = true, movementType = ScrollRect.MovementType.Elastic, elasticity = 0.1f },
|
||||
Children = new IBuilder[] {
|
||||
new Builder<Text, ContentSizeFitter>("Log", out logText) {
|
||||
RectTransform = { anchorMin = new Vector2(0, 0), anchorMax = new Vector2(1, 1), pivot = new Vector2(0, 1) },
|
||||
Component1 = { fontSize = 24, lineSpacing = 1, supportRichText = true, alignment = TextAnchor.UpperLeft, horizontalOverflow = HorizontalWrapMode.Wrap, verticalOverflow = VerticalWrapMode.Truncate },
|
||||
Component2 = { horizontalFit = ContentSizeFitter.FitMode.Unconstrained, verticalFit = ContentSizeFitter.FitMode.PreferredSize },
|
||||
SetTarget = self => { logList.content = self.GetComponent<RectTransform>(); }
|
||||
},
|
||||
new Builder<Scrollbar,Image>("LogScrollbar", out refLogScrollbar) {
|
||||
RectTransform = { anchorMin = new Vector2(1, 0), anchorMax = new Vector2(1, 1) },
|
||||
Component1 = { navigation = new Navigation{ mode = Navigation.Mode.None }, direction = Scrollbar.Direction.BottomToTop, size = 1.0f },
|
||||
Component2 = { sprite = background, type = Image.Type.Sliced },
|
||||
SetTarget = self => { logList.verticalScrollbar = self.GetComponent<Scrollbar>(); },
|
||||
Child = new Builder<RectTransform>("Sliding Area2") {
|
||||
RectTransform = { anchorMin = new Vector2(0, 0), anchorMax = new Vector2(1, 1) },
|
||||
Child = new Builder<Image>("Handle2") {
|
||||
Component1 = { sprite = uisprite, type = Image.Type.Sliced },
|
||||
SetTarget = self =>
|
||||
{
|
||||
refLogScrollbar.targetGraphic = self.GetComponent<Graphic>();
|
||||
refLogScrollbar.handleRect = self.GetComponent<RectTransform>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// size modify after build complete:)
|
||||
{
|
||||
var rect = GameObject.Find("HorizontalSplitter").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("ListLayoutToAttach").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("ListScrollbar").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
rect.sizeDelta = new Vector2(30, 0);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("ClearButton").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("Sliding Area").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
rect.sizeDelta = new Vector2(-20, -20);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("Handle").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
rect.sizeDelta = new Vector2(20, 20);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("ButtonText").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("Log").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(15, 0);
|
||||
rect.offsetMax = new Vector2(-20, 0);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("LogScrollbar").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(-30, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
rect.sizeDelta = new Vector2(30, 0);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("Sliding Area2").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
rect.sizeDelta = new Vector2(-20, -20);
|
||||
}
|
||||
{
|
||||
var rect = GameObject.Find("Handle2").GetComponent<RectTransform>();
|
||||
rect.offsetMin = new Vector2(0, 0);
|
||||
rect.offsetMax = new Vector2(0, 0);
|
||||
rect.sizeDelta = new Vector2(20, 20);
|
||||
}
|
||||
|
||||
// add test script
|
||||
var runner = rootObject.GameObject.AddComponent<UnitTestRunner>();
|
||||
runner.clearButton = clearButton;
|
||||
runner.list = listLayout.gameObject.GetComponent<RectTransform>();
|
||||
runner.listScrollBar = refListScrollbar;
|
||||
runner.logText = logText;
|
||||
runner.logScrollBar = refLogScrollbar;
|
||||
|
||||
return runner;
|
||||
}
|
||||
|
||||
static void Build(string sceneName, string buildPath, RuntimeUnitTestSettings settings)
|
||||
{
|
||||
var options = BuildOptions.BuildScriptsOnly | BuildOptions.IncludeTestAssemblies;
|
||||
if (settings.AutoRunPlayer)
|
||||
{
|
||||
options |= BuildOptions.AutoRunPlayer;
|
||||
}
|
||||
if (settings.Headless)
|
||||
{
|
||||
options |= BuildOptions.EnableHeadlessMode;
|
||||
}
|
||||
|
||||
var targetGroup = ToBuildTargetGroup(settings.BuildTarget);
|
||||
var currentBackend = PlayerSettings.GetScriptingBackend(targetGroup);
|
||||
if (currentBackend != settings.ScriptBackend)
|
||||
{
|
||||
UnityEngine.Debug.Log("Modify ScriptBackend to " + settings.ScriptBackend);
|
||||
PlayerSettings.SetScriptingBackend(targetGroup, settings.ScriptBackend);
|
||||
}
|
||||
|
||||
var buildOptions = new BuildPlayerOptions
|
||||
{
|
||||
target = settings.BuildTarget,
|
||||
targetGroup = targetGroup,
|
||||
options = options,
|
||||
scenes = new[] { sceneName },
|
||||
locationPathName = buildPath
|
||||
};
|
||||
|
||||
UnityEngine.Debug.Log("UnitTest Build Start, " + settings.ToString());
|
||||
|
||||
var buildReport = BuildPipeline.BuildPlayer(buildOptions);
|
||||
|
||||
if (currentBackend != settings.ScriptBackend)
|
||||
{
|
||||
UnityEngine.Debug.Log("Restore ScriptBackend to " + currentBackend);
|
||||
PlayerSettings.SetScriptingBackend(targetGroup, currentBackend);
|
||||
}
|
||||
|
||||
if (buildReport.summary.result != BuildResult.Succeeded)
|
||||
{
|
||||
// Note: show error summary?
|
||||
// Debug.LogError(buildReport.SummarizeErrors());
|
||||
UnityEngine.Debug.LogError("UnitTest Build Failed.");
|
||||
}
|
||||
else
|
||||
{
|
||||
UnityEngine.Debug.Log("UnitTest Build Completed, binary located: " + buildOptions.locationPathName);
|
||||
}
|
||||
}
|
||||
|
||||
static Color FromRGB(int r, int g, int b)
|
||||
{
|
||||
return new Color(r / 255f, g / 255f, b / 255f);
|
||||
}
|
||||
|
||||
static bool IsWindows(BuildTarget buildTarget)
|
||||
{
|
||||
switch (buildTarget)
|
||||
{
|
||||
case BuildTarget.StandaloneWindows:
|
||||
case BuildTarget.StandaloneWindows64:
|
||||
case BuildTarget.WSAPlayer:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static string GetExtensionForBuildTarget(BuildTarget buildTarget)
|
||||
{
|
||||
switch (buildTarget)
|
||||
{
|
||||
case BuildTarget.StandaloneWindows:
|
||||
case BuildTarget.StandaloneWindows64:
|
||||
case BuildTarget.WSAPlayer:
|
||||
return ".exe";
|
||||
case BuildTarget.StandaloneOSX:
|
||||
return ".app";
|
||||
case BuildTarget.Android:
|
||||
return ".apk";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
static BuildTargetGroup ToBuildTargetGroup(BuildTarget buildTarget)
|
||||
{
|
||||
#pragma warning disable CS0618
|
||||
switch (buildTarget)
|
||||
{
|
||||
#if UNITY_2017_3_OR_NEWER
|
||||
case BuildTarget.StandaloneOSX:
|
||||
#else
|
||||
case BuildTarget.StandaloneOSXIntel:
|
||||
case BuildTarget.StandaloneOSXIntel64:
|
||||
case BuildTarget.StandaloneOSXUniversal:
|
||||
#endif // UNITY_2017_3_OR_NEWER
|
||||
case BuildTarget.StandaloneWindows:
|
||||
case BuildTarget.StandaloneWindows64:
|
||||
case BuildTarget.StandaloneLinux64:
|
||||
#if !UNITY_2019_2_OR_NEWER
|
||||
case BuildTarget.StandaloneLinux:
|
||||
case BuildTarget.StandaloneLinuxUniversal:
|
||||
#endif // !UNITY_2019_2_OR_NEWER
|
||||
return BuildTargetGroup.Standalone;
|
||||
case (BuildTarget)6:
|
||||
case (BuildTarget)7:
|
||||
case BuildTarget.WebGL:
|
||||
return BuildTargetGroup.WebGL;
|
||||
case BuildTarget.iOS:
|
||||
return BuildTargetGroup.iOS;
|
||||
case BuildTarget.PS3:
|
||||
return BuildTargetGroup.PS3;
|
||||
case BuildTarget.PS4:
|
||||
return BuildTargetGroup.PS4;
|
||||
case BuildTarget.XBOX360:
|
||||
return BuildTargetGroup.XBOX360;
|
||||
case BuildTarget.Android:
|
||||
return BuildTargetGroup.Android;
|
||||
case BuildTarget.WSAPlayer:
|
||||
return BuildTargetGroup.WSA;
|
||||
case BuildTarget.WP8Player:
|
||||
return BuildTargetGroup.WP8;
|
||||
case BuildTarget.Tizen:
|
||||
return BuildTargetGroup.Tizen;
|
||||
case BuildTarget.PSP2:
|
||||
return BuildTargetGroup.PSP2;
|
||||
case BuildTarget.PSM:
|
||||
return BuildTargetGroup.PSM;
|
||||
case BuildTarget.XboxOne:
|
||||
return BuildTargetGroup.XboxOne;
|
||||
case BuildTarget.SamsungTV:
|
||||
return BuildTargetGroup.SamsungTV;
|
||||
case BuildTarget.N3DS:
|
||||
return BuildTargetGroup.N3DS;
|
||||
case BuildTarget.WiiU:
|
||||
return BuildTargetGroup.WiiU;
|
||||
case BuildTarget.tvOS:
|
||||
return BuildTargetGroup.tvOS;
|
||||
case BuildTarget.Switch:
|
||||
return BuildTargetGroup.Switch;
|
||||
case BuildTarget.Lumin:
|
||||
return BuildTargetGroup.Lumin;
|
||||
case BuildTarget.BlackBerry:
|
||||
return BuildTargetGroup.BlackBerry;
|
||||
case BuildTarget.NoTarget:
|
||||
default:
|
||||
return BuildTargetGroup.Unknown;
|
||||
}
|
||||
#pragma warning restore CS0618
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3518da33b6245d341a0ef3670ee9268b
|
||||
timeCreated: 1488689723
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"name": "RuntimeUnitTestToolkit",
|
||||
"references": [
|
||||
],
|
||||
"optionalUnityReferences": [
|
||||
"TestAssemblies"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": []
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 14c4fea4b238088479114ba2ffe195f9
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,684 +0,0 @@
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
using UnityEngine.TestTools;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace RuntimeUnitTestToolkit
|
||||
{
|
||||
public class UnitTestRunner : MonoBehaviour
|
||||
{
|
||||
// object is IEnumerator or Func<IEnumerator>
|
||||
Dictionary<string, List<TestKeyValuePair>> tests = new Dictionary<string, List<TestKeyValuePair>>();
|
||||
|
||||
List<Pair> additionalActionsOnFirst = new List<Pair>();
|
||||
|
||||
public Button clearButton;
|
||||
public RectTransform list;
|
||||
public Scrollbar listScrollBar;
|
||||
|
||||
public Text logText;
|
||||
public Scrollbar logScrollBar;
|
||||
|
||||
readonly Color passColor = new Color(0f, 1f, 0f, 1f); // green
|
||||
readonly Color failColor = new Color(1f, 0f, 0f, 1f); // red
|
||||
readonly Color normalColor = new Color(1f, 1f, 1f, 1f); // white
|
||||
|
||||
bool allTestGreen = true;
|
||||
bool logClear = false;
|
||||
|
||||
void Start()
|
||||
{
|
||||
try
|
||||
{
|
||||
UnityEngine.Application.logMessageReceived += (a, b, c) =>
|
||||
{
|
||||
if (a.Contains("Mesh can not have more than 65000 vertices"))
|
||||
{
|
||||
logClear = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
AppendToGraphicText("[" + c + "]" + a + "\n");
|
||||
WriteToConsole("[" + c + "]" + a);
|
||||
}
|
||||
};
|
||||
|
||||
// register all test types
|
||||
foreach (var item in GetTestTargetTypes())
|
||||
{
|
||||
RegisterAllMethods(item);
|
||||
}
|
||||
|
||||
var executeAll = new List<Func<Coroutine>>();
|
||||
foreach (var ___item in tests)
|
||||
{
|
||||
var actionList = ___item; // be careful, capture in lambda
|
||||
|
||||
executeAll.Add(() => StartCoroutine(RunTestInCoroutine(actionList)));
|
||||
Add(actionList.Key, () => StartCoroutine(RunTestInCoroutine(actionList)));
|
||||
}
|
||||
|
||||
var executeAllButton = Add("Run All Tests", () => StartCoroutine(ExecuteAllInCoroutine(executeAll)));
|
||||
|
||||
clearButton.gameObject.GetComponent<Image>().color = new Color(170 / 255f, 170 / 255f, 170 / 255f, 1);
|
||||
executeAllButton.gameObject.GetComponent<Image>().color = new Color(250 / 255f, 150 / 255f, 150 / 255f, 1);
|
||||
executeAllButton.transform.SetSiblingIndex(1);
|
||||
|
||||
additionalActionsOnFirst.Reverse();
|
||||
foreach (var item in additionalActionsOnFirst)
|
||||
{
|
||||
var newButton = GameObject.Instantiate(clearButton);
|
||||
newButton.name = item.Name;
|
||||
newButton.onClick.RemoveAllListeners();
|
||||
newButton.GetComponentInChildren<Text>().text = item.Name;
|
||||
newButton.onClick.AddListener(item.Action);
|
||||
newButton.transform.SetParent(list);
|
||||
newButton.transform.SetSiblingIndex(1);
|
||||
}
|
||||
|
||||
clearButton.onClick.AddListener(() =>
|
||||
{
|
||||
logText.text = "";
|
||||
foreach (var btn in list.GetComponentsInChildren<Button>())
|
||||
{
|
||||
btn.interactable = true;
|
||||
btn.GetComponent<Image>().color = normalColor;
|
||||
}
|
||||
executeAllButton.gameObject.GetComponent<Image>().color = new Color(250 / 255f, 150 / 255f, 150 / 255f, 1);
|
||||
});
|
||||
|
||||
listScrollBar.value = 1;
|
||||
logScrollBar.value = 1;
|
||||
|
||||
if (Application.isBatchMode)
|
||||
{
|
||||
// run immediately in player
|
||||
StartCoroutine(ExecuteAllInCoroutine(executeAll));
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Application.isBatchMode)
|
||||
{
|
||||
// when failed(can not start runner), quit immediately.
|
||||
WriteToConsole(ex.ToString());
|
||||
Application.Quit(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button Add(string title, UnityAction test)
|
||||
{
|
||||
var newButton = GameObject.Instantiate(clearButton);
|
||||
newButton.name = title;
|
||||
newButton.onClick.RemoveAllListeners();
|
||||
newButton.GetComponentInChildren<Text>().text = title;
|
||||
newButton.onClick.AddListener(test);
|
||||
|
||||
newButton.transform.SetParent(list);
|
||||
return newButton;
|
||||
}
|
||||
|
||||
static IEnumerable<Type> GetTestTargetTypes()
|
||||
{
|
||||
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
|
||||
{
|
||||
var n = assembly.FullName;
|
||||
if (n.StartsWith("UnityEngine")) continue;
|
||||
if (n.StartsWith("mscorlib")) continue;
|
||||
if (n.StartsWith("System")) continue;
|
||||
|
||||
foreach (var item in assembly.GetTypes())
|
||||
{
|
||||
foreach (var method in item.GetMethods())
|
||||
{
|
||||
TestAttribute t1 = null;
|
||||
try
|
||||
{
|
||||
t1 = method.GetCustomAttribute<TestAttribute>(true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Log("TestAttribute Load Fail, Assembly:" + assembly.FullName);
|
||||
Debug.LogException(ex);
|
||||
goto NEXT_ASSEMBLY;
|
||||
}
|
||||
if (t1 != null)
|
||||
{
|
||||
yield return item;
|
||||
break;
|
||||
}
|
||||
|
||||
UnityTestAttribute t2 = null;
|
||||
try
|
||||
{
|
||||
t2 = method.GetCustomAttribute<UnityTestAttribute>(true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Log("UnityTestAttribute Load Fail, Assembly:" + assembly.FullName);
|
||||
Debug.LogException(ex);
|
||||
goto NEXT_ASSEMBLY;
|
||||
}
|
||||
if (t2 != null)
|
||||
{
|
||||
yield return item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NEXT_ASSEMBLY:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
public void AddTest(string group, string title, Action test, List<Action> setups, List<Action> teardowns)
|
||||
{
|
||||
List<TestKeyValuePair> list;
|
||||
if (!tests.TryGetValue(group, out list))
|
||||
{
|
||||
list = new List<TestKeyValuePair>();
|
||||
tests[group] = list;
|
||||
}
|
||||
|
||||
list.Add(new TestKeyValuePair(title, test, setups, teardowns));
|
||||
}
|
||||
|
||||
public void AddAsyncTest(string group, string title, Func<IEnumerator> asyncTestCoroutine, List<Action> setups, List<Action> teardowns)
|
||||
{
|
||||
List<TestKeyValuePair> list;
|
||||
if (!tests.TryGetValue(group, out list))
|
||||
{
|
||||
list = new List<TestKeyValuePair>();
|
||||
tests[group] = list;
|
||||
}
|
||||
|
||||
list.Add(new TestKeyValuePair(title, asyncTestCoroutine, setups, teardowns));
|
||||
}
|
||||
|
||||
public void AddCutomAction(string name, UnityAction action)
|
||||
{
|
||||
additionalActionsOnFirst.Add(new Pair { Name = name, Action = action });
|
||||
}
|
||||
|
||||
|
||||
public void RegisterAllMethods<T>()
|
||||
where T : new()
|
||||
{
|
||||
RegisterAllMethods(typeof(T));
|
||||
}
|
||||
|
||||
public void RegisterAllMethods(Type testType)
|
||||
{
|
||||
try
|
||||
{
|
||||
var test = Activator.CreateInstance(testType);
|
||||
|
||||
var methods = testType.GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
|
||||
List<Action> setups = new List<Action>();
|
||||
List<Action> teardowns = new List<Action>();
|
||||
foreach (var item in methods)
|
||||
{
|
||||
try
|
||||
{
|
||||
var setup = item.GetCustomAttribute<NUnit.Framework.SetUpAttribute>(true);
|
||||
if (setup != null)
|
||||
{
|
||||
setups.Add((Action)Delegate.CreateDelegate(typeof(Action), test, item));
|
||||
}
|
||||
var teardown = item.GetCustomAttribute<NUnit.Framework.TearDownAttribute>(true);
|
||||
if (teardown != null)
|
||||
{
|
||||
teardowns.Add((Action)Delegate.CreateDelegate(typeof(Action), test, item));
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
UnityEngine.Debug.LogError(testType.Name + "." + item.Name + " failed to register setup/teardown method, exception: " + e.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var item in methods)
|
||||
{
|
||||
try
|
||||
{
|
||||
var iteratorTest = item.GetCustomAttribute<UnityEngine.TestTools.UnityTestAttribute>(true);
|
||||
if (iteratorTest != null)
|
||||
{
|
||||
if (item.GetParameters().Length == 0 && item.ReturnType == typeof(IEnumerator))
|
||||
{
|
||||
var factory = (Func<IEnumerator>)Delegate.CreateDelegate(typeof(Func<IEnumerator>), test, item);
|
||||
AddAsyncTest(factory.Target.GetType().Name, factory.Method.Name, factory, setups, teardowns);
|
||||
}
|
||||
else
|
||||
{
|
||||
var testData = GetTestData(item);
|
||||
if (testData.Count != 0)
|
||||
{
|
||||
foreach (var item2 in testData)
|
||||
{
|
||||
Func<IEnumerator> factory;
|
||||
if (item.IsGenericMethod)
|
||||
{
|
||||
var method2 = InferGenericType(item, item2);
|
||||
factory = () => (IEnumerator)method2.Invoke(test, item2);
|
||||
}
|
||||
else
|
||||
{
|
||||
factory = () => (IEnumerator)item.Invoke(test, item2);
|
||||
}
|
||||
var name = item.Name + "(" + string.Join(", ", item2.Select(x => x?.ToString() ?? "null")) + ")";
|
||||
name = name.Replace(Char.MinValue, ' ').Replace(Char.MaxValue, ' ').Replace("<", "[").Replace(">", "]");
|
||||
AddAsyncTest(test.GetType().Name, name, factory, setups, teardowns);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UnityEngine.Debug.Log(testType.Name + "." + item.Name + " currently does not supported in RuntumeUnitTestToolkit(multiple parameter without TestCase or return type is invalid).");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var standardTest = item.GetCustomAttribute<NUnit.Framework.TestAttribute>(true);
|
||||
if (standardTest != null)
|
||||
{
|
||||
if (item.GetParameters().Length == 0 && item.ReturnType == typeof(void))
|
||||
{
|
||||
var invoke = (Action)Delegate.CreateDelegate(typeof(Action), test, item);
|
||||
AddTest(invoke.Target.GetType().Name, invoke.Method.Name, invoke, setups, teardowns);
|
||||
}
|
||||
else
|
||||
{
|
||||
var testData = GetTestData(item);
|
||||
if (testData.Count != 0)
|
||||
{
|
||||
foreach (var item2 in testData)
|
||||
{
|
||||
Action invoke = null;
|
||||
if (item.IsGenericMethod)
|
||||
{
|
||||
var method2 = InferGenericType(item, item2);
|
||||
invoke = () => method2.Invoke(test, item2);
|
||||
}
|
||||
else
|
||||
{
|
||||
invoke = () => item.Invoke(test, item2);
|
||||
}
|
||||
var name = item.Name + "(" + string.Join(", ", item2.Select(x => x?.ToString() ?? "null")) + ")";
|
||||
name = name.Replace(Char.MinValue, ' ').Replace(Char.MaxValue, ' ').Replace("<", "[").Replace(">", "]");
|
||||
AddTest(test.GetType().Name, name, invoke, setups, teardowns);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UnityEngine.Debug.Log(testType.Name + "." + item.Name + " currently does not supported in RuntumeUnitTestToolkit(multiple parameter without TestCase or return type is invalid).");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
UnityEngine.Debug.LogError(testType.Name + "." + item.Name + " failed to register method, exception: " + e.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
List<object[]> GetTestData(MethodInfo methodInfo)
|
||||
{
|
||||
List<object[]> testCases = new List<object[]>();
|
||||
|
||||
var inlineData = methodInfo.GetCustomAttributes<NUnit.Framework.TestCaseAttribute>(true);
|
||||
foreach (var item in inlineData)
|
||||
{
|
||||
testCases.Add(item.Arguments);
|
||||
}
|
||||
|
||||
var sourceData = methodInfo.GetCustomAttributes<NUnit.Framework.TestCaseSourceAttribute>(true);
|
||||
foreach (var item in sourceData)
|
||||
{
|
||||
var enumerator = GetTestCaseSource(methodInfo, item.SourceType, item.SourceName, item.MethodParams);
|
||||
foreach (var item2 in enumerator)
|
||||
{
|
||||
var item3 = item2 as IEnumerable; // object[][]
|
||||
if (item3 != null)
|
||||
{
|
||||
var l = new List<object>();
|
||||
foreach (var item4 in item3)
|
||||
{
|
||||
l.Add(item4);
|
||||
}
|
||||
testCases.Add(l.ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return testCases;
|
||||
}
|
||||
|
||||
IEnumerable GetTestCaseSource(MethodInfo method, Type sourceType, string sourceName, object[] methodParams)
|
||||
{
|
||||
Type type = sourceType ?? method.DeclaringType;
|
||||
|
||||
MemberInfo[] member = type.GetMember(sourceName, BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
|
||||
if (member.Length == 1)
|
||||
{
|
||||
MemberInfo memberInfo = member[0];
|
||||
FieldInfo fieldInfo = memberInfo as FieldInfo;
|
||||
if ((object)fieldInfo != null)
|
||||
{
|
||||
return (!fieldInfo.IsStatic) ? ReturnErrorAsParameter("The sourceName specified on a TestCaseSourceAttribute must refer to a static field, property or method.") : ((methodParams == null) ? ((IEnumerable)fieldInfo.GetValue(null)) : ReturnErrorAsParameter("You have specified a data source field but also given a set of parameters. Fields cannot take parameters, please revise the 3rd parameter passed to the TestCaseSourceAttribute and either remove it or specify a method."));
|
||||
}
|
||||
PropertyInfo propertyInfo = memberInfo as PropertyInfo;
|
||||
if ((object)propertyInfo != null)
|
||||
{
|
||||
return (!propertyInfo.GetGetMethod(nonPublic: true).IsStatic) ? ReturnErrorAsParameter("The sourceName specified on a TestCaseSourceAttribute must refer to a static field, property or method.") : ((methodParams == null) ? ((IEnumerable)propertyInfo.GetValue(null, null)) : ReturnErrorAsParameter("You have specified a data source property but also given a set of parameters. Properties cannot take parameters, please revise the 3rd parameter passed to the TestCaseSource attribute and either remove it or specify a method."));
|
||||
}
|
||||
MethodInfo methodInfo = memberInfo as MethodInfo;
|
||||
if ((object)methodInfo != null)
|
||||
{
|
||||
return (!methodInfo.IsStatic) ? ReturnErrorAsParameter("The sourceName specified on a TestCaseSourceAttribute must refer to a static field, property or method.") : ((methodParams == null || methodInfo.GetParameters().Length == methodParams.Length) ? ((IEnumerable)methodInfo.Invoke(null, methodParams)) : ReturnErrorAsParameter("You have given the wrong number of arguments to the method in the TestCaseSourceAttribute, please check the number of parameters passed in the object is correct in the 3rd parameter for the TestCaseSourceAttribute and this matches the number of parameters in the target method and try again."));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
MethodInfo InferGenericType(MethodInfo methodInfo, object[] parameters)
|
||||
{
|
||||
var set = new HashSet<Type>();
|
||||
List<Type> genericParameters = new List<Type>();
|
||||
foreach (var item in methodInfo.GetParameters()
|
||||
.Select((x, i) => new { x.ParameterType, i })
|
||||
.Where(x => x.ParameterType.IsGenericParameter)
|
||||
.OrderBy(x => x.ParameterType.GenericParameterPosition))
|
||||
{
|
||||
if (set.Add(item.ParameterType)) // DistinctBy
|
||||
{
|
||||
genericParameters.Add(parameters[item.i].GetType());
|
||||
}
|
||||
}
|
||||
|
||||
return methodInfo.MakeGenericMethod(genericParameters.ToArray());
|
||||
}
|
||||
|
||||
IEnumerable ReturnErrorAsParameter(string name)
|
||||
{
|
||||
throw new Exception(name);
|
||||
}
|
||||
|
||||
System.Collections.IEnumerator ScrollLogToEndNextFrame()
|
||||
{
|
||||
yield return null;
|
||||
yield return null;
|
||||
logScrollBar.value = 0;
|
||||
}
|
||||
|
||||
IEnumerator RunTestInCoroutine(KeyValuePair<string, List<TestKeyValuePair>> actionList)
|
||||
{
|
||||
Button self = null;
|
||||
foreach (var btn in list.GetComponentsInChildren<Button>())
|
||||
{
|
||||
btn.interactable = false;
|
||||
if (btn.name == actionList.Key) self = btn;
|
||||
}
|
||||
if (self != null)
|
||||
{
|
||||
self.GetComponent<Image>().color = normalColor;
|
||||
}
|
||||
|
||||
var allGreen = true;
|
||||
|
||||
AppendToGraphicText("<color=yellow>" + actionList.Key + "</color>\n");
|
||||
WriteToConsole("Begin Test Class: " + actionList.Key);
|
||||
yield return null;
|
||||
|
||||
var totalExecutionTime = new List<double>();
|
||||
foreach (var item2 in actionList.Value)
|
||||
{
|
||||
// setup
|
||||
try
|
||||
{
|
||||
foreach (var setup in item2.Setups)
|
||||
{
|
||||
setup();
|
||||
}
|
||||
|
||||
// before start, cleanup
|
||||
GC.Collect();
|
||||
GC.WaitForPendingFinalizers();
|
||||
GC.Collect();
|
||||
|
||||
AppendToGraphicText("<color=teal>" + item2.Key + "</color>\n");
|
||||
yield return null;
|
||||
|
||||
var v = item2.Value;
|
||||
|
||||
var methodStopwatch = System.Diagnostics.Stopwatch.StartNew();
|
||||
Exception exception = null;
|
||||
if (v is Action)
|
||||
{
|
||||
try
|
||||
{
|
||||
((Action)v).Invoke();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
exception = ex;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var coroutineFactory = (Func<IEnumerator>)v;
|
||||
IEnumerator coroutine = null;
|
||||
try
|
||||
{
|
||||
coroutine = coroutineFactory();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
exception = ex;
|
||||
}
|
||||
if (exception == null)
|
||||
{
|
||||
yield return StartCoroutine(UnwrapEnumerator(coroutine, ex =>
|
||||
{
|
||||
exception = ex;
|
||||
}));
|
||||
}
|
||||
}
|
||||
methodStopwatch.Stop();
|
||||
totalExecutionTime.Add(methodStopwatch.Elapsed.TotalMilliseconds);
|
||||
if (exception == null)
|
||||
{
|
||||
AppendToGraphicText("OK, " + methodStopwatch.Elapsed.TotalMilliseconds.ToString("0.00") + "ms\n");
|
||||
WriteToConsoleResult(item2.Key + ", " + methodStopwatch.Elapsed.TotalMilliseconds.ToString("0.00") + "ms", true);
|
||||
}
|
||||
else
|
||||
{
|
||||
AppendToGraphicText("<color=red>" + exception.ToString() + "</color>\n");
|
||||
WriteToConsoleResult(item2.Key + ", " + exception.ToString(), false);
|
||||
allGreen = false;
|
||||
allTestGreen = false;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
foreach (var teardown in item2.Teardowns)
|
||||
{
|
||||
teardown();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AppendToGraphicText("[" + actionList.Key + "]" + totalExecutionTime.Sum().ToString("0.00") + "ms\n\n");
|
||||
foreach (var btn in list.GetComponentsInChildren<Button>()) btn.interactable = true;
|
||||
if (self != null)
|
||||
{
|
||||
self.GetComponent<Image>().color = allGreen ? passColor : failColor;
|
||||
}
|
||||
|
||||
yield return StartCoroutine(ScrollLogToEndNextFrame());
|
||||
|
||||
|
||||
}
|
||||
|
||||
IEnumerator ExecuteAllInCoroutine(List<Func<Coroutine>> tests)
|
||||
{
|
||||
allTestGreen = true;
|
||||
|
||||
foreach (var item in tests)
|
||||
{
|
||||
yield return item();
|
||||
}
|
||||
|
||||
if (Application.isBatchMode)
|
||||
{
|
||||
var scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
|
||||
bool disableAutoClose = (scene.name.Contains("DisableAutoClose"));
|
||||
|
||||
if (allTestGreen)
|
||||
{
|
||||
WriteToConsole("Test Complete Successfully");
|
||||
if (!disableAutoClose)
|
||||
{
|
||||
Application.Quit();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteToConsole("Test Failed, please see [NG] log.");
|
||||
if (!disableAutoClose)
|
||||
{
|
||||
Application.Quit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerator UnwrapEnumerator(IEnumerator enumerator, Action<Exception> exceptionCallback)
|
||||
{
|
||||
var hasNext = true;
|
||||
while (hasNext)
|
||||
{
|
||||
try
|
||||
{
|
||||
hasNext = enumerator.MoveNext();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
exceptionCallback(ex);
|
||||
hasNext = false;
|
||||
}
|
||||
|
||||
if (hasNext)
|
||||
{
|
||||
// unwrap self for bug of Unity
|
||||
// https://issuetracker.unity3d.com/issues/does-not-stop-coroutine-when-it-throws-exception-in-movenext-at-first-frame
|
||||
var moreCoroutine = enumerator.Current as IEnumerator;
|
||||
if (moreCoroutine != null)
|
||||
{
|
||||
yield return StartCoroutine(UnwrapEnumerator(moreCoroutine, ex =>
|
||||
{
|
||||
exceptionCallback(ex);
|
||||
hasNext = false;
|
||||
}));
|
||||
}
|
||||
else
|
||||
{
|
||||
yield return enumerator.Current;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void WriteToConsole(string msg)
|
||||
{
|
||||
if (Application.isBatchMode)
|
||||
{
|
||||
Console.WriteLine(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void AppendToGraphicText(string msg)
|
||||
{
|
||||
if (!Application.isBatchMode)
|
||||
{
|
||||
if (logClear)
|
||||
{
|
||||
logText.text = "";
|
||||
logClear = false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
logText.text += msg;
|
||||
}
|
||||
catch
|
||||
{
|
||||
logClear = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void WriteToConsoleResult(string msg, bool green)
|
||||
{
|
||||
if (Application.isBatchMode)
|
||||
{
|
||||
if (!green)
|
||||
{
|
||||
var currentForeground = Console.ForegroundColor;
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
Console.Write("[NG]");
|
||||
Console.ForegroundColor = currentForeground;
|
||||
}
|
||||
else
|
||||
{
|
||||
var currentForeground = Console.ForegroundColor;
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
Console.Write("[OK]");
|
||||
Console.ForegroundColor = currentForeground;
|
||||
}
|
||||
|
||||
System.Console.WriteLine(msg);
|
||||
}
|
||||
}
|
||||
|
||||
struct Pair
|
||||
{
|
||||
public string Name;
|
||||
public UnityAction Action;
|
||||
}
|
||||
}
|
||||
|
||||
public class TestKeyValuePair
|
||||
{
|
||||
public string Key;
|
||||
/// <summary>IEnumerator or Func[IEnumerator]</summary>
|
||||
public object Value;
|
||||
public List<Action> Setups;
|
||||
public List<Action> Teardowns;
|
||||
|
||||
public TestKeyValuePair(string key, object value, List<Action> setups, List<Action> teardowns)
|
||||
{
|
||||
this.Key = key;
|
||||
this.Value = value;
|
||||
this.Setups = setups;
|
||||
this.Teardowns = teardowns;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 660baed073888b8438569f57e42679b2
|
||||
timeCreated: 1476793308
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"name": "com.cysharp.runtimeunittesttoolkit",
|
||||
"displayName": "RuntimeUnitTestToolkit",
|
||||
"version": "2.3.0",
|
||||
"unity": "2018.3",
|
||||
"description": "CLI/GUI Frontend of Unity Test Runner to test on any platform.",
|
||||
"keywords": ["test"],
|
||||
"category": "Tests",
|
||||
"dependencies": {
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b7883c7ac5d6ea4409a229aeab14e796
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -216,7 +216,7 @@
|
||||
// RETRY:
|
||||
// try
|
||||
// {
|
||||
// context.RequestHeaders["x-accesss-token"] = token;
|
||||
// context.RequestHeaders["x-access-token"] = token;
|
||||
// return await next(context, cancellationToken);
|
||||
// }
|
||||
// catch (UnityWebRequestException ex)
|
||||
|
||||
@@ -20,8 +20,11 @@ using System.IO;
|
||||
using System.Linq.Expressions;
|
||||
|
||||
|
||||
|
||||
// using DG.Tweening;
|
||||
|
||||
|
||||
|
||||
public struct MyJob : IJob
|
||||
{
|
||||
public int loopCount;
|
||||
|
||||
@@ -38,12 +38,11 @@ RenderSettings:
|
||||
m_ReflectionIntensity: 1
|
||||
m_CustomReflection: {fileID: 0}
|
||||
m_Sun: {fileID: 0}
|
||||
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 11
|
||||
serializedVersion: 12
|
||||
m_GIWorkflowMode: 1
|
||||
m_GISettings:
|
||||
serializedVersion: 2
|
||||
@@ -98,13 +97,14 @@ LightmapSettings:
|
||||
m_TrainingDataDestination: TrainingData
|
||||
m_LightProbeSampleCountMultiplier: 4
|
||||
m_LightingDataAsset: {fileID: 0}
|
||||
m_UseShadowmask: 1
|
||||
m_LightingSettings: {fileID: 4890085278179872738, guid: 814185d368762ed45a2298d112780689,
|
||||
type: 2}
|
||||
--- !u!196 &4
|
||||
NavMeshSettings:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_BuildSettings:
|
||||
serializedVersion: 2
|
||||
serializedVersion: 3
|
||||
agentTypeID: 0
|
||||
agentRadius: 0.5
|
||||
agentHeight: 2
|
||||
@@ -117,7 +117,9 @@ NavMeshSettings:
|
||||
cellSize: 0.16666667
|
||||
manualTileSize: 0
|
||||
tileSize: 256
|
||||
accuratePlacement: 0
|
||||
buildHeightMesh: 0
|
||||
maxJobWorkers: 0
|
||||
preserveTilesOutsideBounds: 0
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
@@ -150,10 +152,10 @@ RectTransform:
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 1584557232}
|
||||
m_Father: {fileID: 1556045508}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||
@@ -174,6 +176,7 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_Navigation:
|
||||
m_Mode: 3
|
||||
m_WrapAround: 0
|
||||
m_SelectOnUp: {fileID: 0}
|
||||
m_SelectOnDown: {fileID: 0}
|
||||
m_SelectOnLeft: {fileID: 0}
|
||||
@@ -218,6 +221,8 @@ MonoBehaviour:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
@@ -270,9 +275,17 @@ Camera:
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_Iso: 200
|
||||
m_ShutterSpeed: 0.005
|
||||
m_Aperture: 16
|
||||
m_FocusDistance: 10
|
||||
m_FocalLength: 50
|
||||
m_BladeCount: 5
|
||||
m_Curvature: {x: 2, y: 11}
|
||||
m_BarrelClipping: 0.25
|
||||
m_Anamorphism: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
@@ -306,12 +319,13 @@ Transform:
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 518730348}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 488, y: 418, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &519420028
|
||||
GameObject:
|
||||
@@ -352,9 +366,11 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: f0bc6c75abb2e0b47a25aa49bfd488ed, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
camera: {fileID: 518730349}
|
||||
mycamera: {fileID: 0}
|
||||
okButton: {fileID: 16537672}
|
||||
cancelButton: {fileID: 628393011}
|
||||
RP1:
|
||||
latestValue: 0
|
||||
text: {fileID: 2101290655}
|
||||
button: {fileID: 0}
|
||||
--- !u!20 &519420031
|
||||
@@ -371,9 +387,17 @@ Camera:
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_Iso: 200
|
||||
m_ShutterSpeed: 0.005
|
||||
m_Aperture: 16
|
||||
m_FocusDistance: 10
|
||||
m_FocalLength: 50
|
||||
m_BladeCount: 5
|
||||
m_Curvature: {x: 2, y: 11}
|
||||
m_BarrelClipping: 0.25
|
||||
m_Anamorphism: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
@@ -407,12 +431,13 @@ Transform:
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 519420028}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: -10}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &628393009
|
||||
GameObject:
|
||||
@@ -443,10 +468,10 @@ RectTransform:
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 865871445}
|
||||
m_Father: {fileID: 1556045508}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||
@@ -467,6 +492,7 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_Navigation:
|
||||
m_Mode: 3
|
||||
m_WrapAround: 0
|
||||
m_SelectOnUp: {fileID: 0}
|
||||
m_SelectOnDown: {fileID: 0}
|
||||
m_SelectOnLeft: {fileID: 0}
|
||||
@@ -511,6 +537,8 @@ MonoBehaviour:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
@@ -560,9 +588,9 @@ RectTransform:
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 628393010}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
@@ -584,6 +612,8 @@ MonoBehaviour:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
@@ -639,6 +669,7 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_SendPointerHoverToParent: 1
|
||||
m_HorizontalAxis: Horizontal
|
||||
m_VerticalAxis: Vertical
|
||||
m_SubmitButton: Submit
|
||||
@@ -668,12 +699,13 @@ Transform:
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 872009839}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &1556045504
|
||||
GameObject:
|
||||
@@ -687,6 +719,7 @@ GameObject:
|
||||
- component: {fileID: 1556045507}
|
||||
- component: {fileID: 1556045506}
|
||||
- component: {fileID: 1556045505}
|
||||
- component: {fileID: 1556045509}
|
||||
m_Layer: 0
|
||||
m_Name: Canvas
|
||||
m_TagString: Untagged
|
||||
@@ -733,6 +766,7 @@ MonoBehaviour:
|
||||
m_FallbackScreenDPI: 96
|
||||
m_DefaultSpriteDPI: 96
|
||||
m_DynamicPixelsPerUnit: 1
|
||||
m_PresetInfoIsWorld: 0
|
||||
--- !u!223 &1556045507
|
||||
Canvas:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -750,7 +784,9 @@ Canvas:
|
||||
m_OverrideSorting: 0
|
||||
m_OverridePixelPerfect: 0
|
||||
m_SortingBucketNormalizedSize: 0
|
||||
m_VertexColorAlwaysGammaSpace: 0
|
||||
m_AdditionalShaderChannelsFlag: 0
|
||||
m_UpdateRectTransformForStandalone: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingOrder: 0
|
||||
m_TargetDisplay: 0
|
||||
@@ -764,18 +800,30 @@ RectTransform:
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0, y: 0, z: 0}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 16537671}
|
||||
- {fileID: 628393010}
|
||||
- {fileID: 2101290654}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 3
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0, y: 0}
|
||||
--- !u!114 &1556045509
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1556045504}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a478e5f6126dc184ca902adfb35401b4, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!1 &1584557231
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -804,9 +852,9 @@ RectTransform:
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 16537671}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
@@ -828,6 +876,8 @@ MonoBehaviour:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
@@ -883,9 +933,9 @@ RectTransform:
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1556045508}
|
||||
m_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||
@@ -907,6 +957,8 @@ MonoBehaviour:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
@@ -932,3 +984,11 @@ CanvasRenderer:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2101290653}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!1660057539 &9223372036854775807
|
||||
SceneRoots:
|
||||
m_ObjectHideFlags: 0
|
||||
m_Roots:
|
||||
- {fileID: 519420032}
|
||||
- {fileID: 518730350}
|
||||
- {fileID: 872009842}
|
||||
- {fileID: 1556045508}
|
||||
|
||||
74
src/UniTask/Assets/Scenes/WaitWhileTest.cs
Normal file
74
src/UniTask/Assets/Scenes/WaitWhileTest.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using UnityEngine;
|
||||
|
||||
// https://github.com/Cysharp/UniTask/issues/617
|
||||
|
||||
public class WaitWhileTest : MonoBehaviour
|
||||
{
|
||||
private const float c_CallInterval = 0.3f;
|
||||
private float m_JustBeforeCallTime;
|
||||
|
||||
private TaskObj m_TestObj;
|
||||
|
||||
// Start is called before the first frame update
|
||||
void Start()
|
||||
{
|
||||
m_JustBeforeCallTime = Time.unscaledTime;
|
||||
m_TestObj = new TaskObj();
|
||||
// m_TestObj.Test(CancellationToken.None).Forget();
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
if (Time.unscaledTime - m_JustBeforeCallTime > c_CallInterval)
|
||||
{
|
||||
m_JustBeforeCallTime = Time.unscaledTime;
|
||||
m_TestObj.Test(CancellationToken.None).Forget();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class TaskObj
|
||||
{
|
||||
private CancellationTokenSource m_CancelTokenSource;
|
||||
private const float c_FinishElapsedTime = 0.1f;
|
||||
private float m_StartTime;
|
||||
public async UniTask Test(CancellationToken token)
|
||||
{
|
||||
try
|
||||
{
|
||||
CancelAndDisposeTokenSource();
|
||||
m_CancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(token);
|
||||
m_StartTime = Time.unscaledTime;
|
||||
await UniTask.WaitWhile(IsContinued, cancellationToken: m_CancelTokenSource.Token, cancelImmediately: true);
|
||||
Debug.Log("Task Finished");
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
Debug.LogWarning("Task Canceled");
|
||||
}
|
||||
finally
|
||||
{
|
||||
CancelAndDisposeTokenSource();
|
||||
}
|
||||
}
|
||||
|
||||
private void CancelAndDisposeTokenSource()
|
||||
{
|
||||
m_CancelTokenSource?.Cancel();
|
||||
m_CancelTokenSource?.Dispose();
|
||||
m_CancelTokenSource = null;
|
||||
}
|
||||
|
||||
private bool IsContinued()
|
||||
{
|
||||
return Time.unscaledTime - m_StartTime > c_FinishElapsedTime;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 12bdad0556e999f4aa82da29415d361f
|
||||
guid: a478e5f6126dc184ca902adfb35401b4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -145,6 +145,11 @@ namespace Cysharp.Threading.TasksTests
|
||||
public int MyProperty { get; set; }
|
||||
}
|
||||
|
||||
class MyBoolenClass
|
||||
{
|
||||
public bool MyProperty { get; set; }
|
||||
}
|
||||
|
||||
[UnityTest]
|
||||
public IEnumerator WaitUntil() => UniTask.ToCoroutine(async () =>
|
||||
{
|
||||
@@ -159,6 +164,20 @@ namespace Cysharp.Threading.TasksTests
|
||||
diff.Should().Be(11);
|
||||
});
|
||||
|
||||
[UnityTest]
|
||||
public IEnumerator WaitUntilWithState() => UniTask.ToCoroutine(async () =>
|
||||
{
|
||||
var v = new MyBoolenClass { MyProperty = false };
|
||||
|
||||
UniTask.DelayFrame(10, PlayerLoopTiming.PostLateUpdate).ContinueWith(() => v.MyProperty = true).Forget();
|
||||
|
||||
var startFrame = Time.frameCount;
|
||||
await UniTask.WaitUntil(v, static v => v.MyProperty, PlayerLoopTiming.EarlyUpdate);
|
||||
|
||||
var diff = Time.frameCount - startFrame;
|
||||
diff.Should().Be(11);
|
||||
});
|
||||
|
||||
[UnityTest]
|
||||
public IEnumerator WaitWhile() => UniTask.ToCoroutine(async () =>
|
||||
{
|
||||
@@ -173,6 +192,20 @@ namespace Cysharp.Threading.TasksTests
|
||||
diff.Should().Be(11);
|
||||
});
|
||||
|
||||
[UnityTest]
|
||||
public IEnumerator WaitWhileWithState() => UniTask.ToCoroutine(async () =>
|
||||
{
|
||||
var v = new MyBoolenClass { MyProperty = true };
|
||||
|
||||
UniTask.DelayFrame(10, PlayerLoopTiming.PostLateUpdate).ContinueWith(() => v.MyProperty = false).Forget();
|
||||
|
||||
var startFrame = Time.frameCount;
|
||||
await UniTask.WaitWhile(v, static v => v.MyProperty, PlayerLoopTiming.EarlyUpdate);
|
||||
|
||||
var diff = Time.frameCount - startFrame;
|
||||
diff.Should().Be(11);
|
||||
});
|
||||
|
||||
[UnityTest]
|
||||
public IEnumerator WaitUntilValueChanged() => UniTask.ToCoroutine(async () =>
|
||||
{
|
||||
|
||||
@@ -12,7 +12,7 @@ TextureImporter:
|
||||
213: 1950921086533113773
|
||||
second: sample_texture_2
|
||||
externalObjects: {}
|
||||
serializedVersion: 12
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
@@ -86,6 +86,7 @@ TextureImporter:
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
@@ -98,6 +99,7 @@ TextureImporter:
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
@@ -110,6 +112,7 @@ TextureImporter:
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
@@ -122,6 +125,7 @@ TextureImporter:
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
@@ -200,7 +204,10 @@ TextureImporter:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
nameFileIdTable:
|
||||
sample_texture_0: -2664112245596591751
|
||||
sample_texture_1: -4606777057269188692
|
||||
sample_texture_2: 1950921086533113773
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
|
||||
45
src/UniTask/Packages/manifest.json
Normal file
45
src/UniTask/Packages/manifest.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"com.cysharp.runtimeunittesttoolkit": "https://github.com/Cysharp/RuntimeUnitTestToolkit.git?path=RuntimeUnitTestToolkit/Assets/RuntimeUnitTestToolkit#2.6.0",
|
||||
"com.unity.collab-proxy": "2.4.3",
|
||||
"com.unity.ide.rider": "3.0.31",
|
||||
"com.unity.ide.visualstudio": "2.0.22",
|
||||
"com.unity.ide.vscode": "1.2.5",
|
||||
"com.unity.test-framework": "1.1.33",
|
||||
"com.unity.textmeshpro": "3.0.6",
|
||||
"com.unity.timeline": "1.7.6",
|
||||
"com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.9",
|
||||
"com.unity.ugui": "1.0.0",
|
||||
"com.unity.modules.ai": "1.0.0",
|
||||
"com.unity.modules.androidjni": "1.0.0",
|
||||
"com.unity.modules.animation": "1.0.0",
|
||||
"com.unity.modules.assetbundle": "1.0.0",
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.cloth": "1.0.0",
|
||||
"com.unity.modules.director": "1.0.0",
|
||||
"com.unity.modules.imageconversion": "1.0.0",
|
||||
"com.unity.modules.imgui": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0",
|
||||
"com.unity.modules.particlesystem": "1.0.0",
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.physics2d": "1.0.0",
|
||||
"com.unity.modules.screencapture": "1.0.0",
|
||||
"com.unity.modules.terrain": "1.0.0",
|
||||
"com.unity.modules.terrainphysics": "1.0.0",
|
||||
"com.unity.modules.tilemap": "1.0.0",
|
||||
"com.unity.modules.ui": "1.0.0",
|
||||
"com.unity.modules.uielements": "1.0.0",
|
||||
"com.unity.modules.umbra": "1.0.0",
|
||||
"com.unity.modules.unityanalytics": "1.0.0",
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestaudio": "1.0.0",
|
||||
"com.unity.modules.unitywebrequesttexture": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestwww": "1.0.0",
|
||||
"com.unity.modules.vehicles": "1.0.0",
|
||||
"com.unity.modules.video": "1.0.0",
|
||||
"com.unity.modules.vr": "1.0.0",
|
||||
"com.unity.modules.wind": "1.0.0",
|
||||
"com.unity.modules.xr": "1.0.0"
|
||||
}
|
||||
}
|
||||
360
src/UniTask/Packages/packages-lock.json
Normal file
360
src/UniTask/Packages/packages-lock.json
Normal file
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"com.cysharp.runtimeunittesttoolkit": {
|
||||
"version": "https://github.com/Cysharp/RuntimeUnitTestToolkit.git?path=RuntimeUnitTestToolkit/Assets/RuntimeUnitTestToolkit#2.6.0",
|
||||
"depth": 0,
|
||||
"source": "git",
|
||||
"dependencies": {},
|
||||
"hash": "4e3dbfaa9c40b5cfdcb71a1d4e8bca0d45ca1055"
|
||||
},
|
||||
"com.unity.collab-proxy": {
|
||||
"version": "2.4.3",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ext.nunit": {
|
||||
"version": "1.0.6",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ide.rider": {
|
||||
"version": "3.0.31",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.ext.nunit": "1.0.6"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ide.visualstudio": {
|
||||
"version": "2.0.22",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.test-framework": "1.1.9"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ide.vscode": {
|
||||
"version": "1.2.5",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.sysroot": {
|
||||
"version": "2.0.10",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.sysroot.linux-x86_64": {
|
||||
"version": "2.0.9",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.sysroot": "2.0.10"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.test-framework": {
|
||||
"version": "1.1.33",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.ext.nunit": "1.0.6",
|
||||
"com.unity.modules.imgui": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.textmeshpro": {
|
||||
"version": "3.0.6",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.ugui": "1.0.0"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.timeline": {
|
||||
"version": "1.7.6",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.modules.director": "1.0.0",
|
||||
"com.unity.modules.animation": "1.0.0",
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.particlesystem": "1.0.0"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.toolchain.win-x86_64-linux-x86_64": {
|
||||
"version": "2.0.9",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.sysroot": "2.0.10",
|
||||
"com.unity.sysroot.linux-x86_64": "2.0.9"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ugui": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.ui": "1.0.0",
|
||||
"com.unity.modules.imgui": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.ai": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.androidjni": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.animation": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.assetbundle": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.audio": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.cloth": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.director": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.animation": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.imageconversion": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.imgui": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.jsonserialize": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.particlesystem": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.physics": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.physics2d": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.screencapture": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.imageconversion": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.subsystems": {
|
||||
"version": "1.0.0",
|
||||
"depth": 1,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.jsonserialize": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.terrain": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.terrainphysics": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.terrain": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.tilemap": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics2d": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.ui": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.uielements": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.ui": "1.0.0",
|
||||
"com.unity.modules.imgui": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.umbra": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.unityanalytics": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.unitywebrequest": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.unitywebrequestassetbundle": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.assetbundle": "1.0.0",
|
||||
"com.unity.modules.unitywebrequest": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.unitywebrequestaudio": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.audio": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.unitywebrequesttexture": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.imageconversion": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.unitywebrequestwww": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestaudio": "1.0.0",
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.assetbundle": "1.0.0",
|
||||
"com.unity.modules.imageconversion": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.vehicles": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.video": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.ui": "1.0.0",
|
||||
"com.unity.modules.unitywebrequest": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.vr": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.jsonserialize": "1.0.0",
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.xr": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.wind": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.xr": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0",
|
||||
"com.unity.modules.subsystems": "1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
35
src/UniTask/ProjectSettings/MemorySettings.asset
Normal file
35
src/UniTask/ProjectSettings/MemorySettings.asset
Normal file
@@ -0,0 +1,35 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!387306366 &1
|
||||
MemorySettings:
|
||||
m_ObjectHideFlags: 0
|
||||
m_EditorMemorySettings:
|
||||
m_MainAllocatorBlockSize: -1
|
||||
m_ThreadAllocatorBlockSize: -1
|
||||
m_MainGfxBlockSize: -1
|
||||
m_ThreadGfxBlockSize: -1
|
||||
m_CacheBlockSize: -1
|
||||
m_TypetreeBlockSize: -1
|
||||
m_ProfilerBlockSize: -1
|
||||
m_ProfilerEditorBlockSize: -1
|
||||
m_BucketAllocatorGranularity: -1
|
||||
m_BucketAllocatorBucketsCount: -1
|
||||
m_BucketAllocatorBlockSize: -1
|
||||
m_BucketAllocatorBlockCount: -1
|
||||
m_ProfilerBucketAllocatorGranularity: -1
|
||||
m_ProfilerBucketAllocatorBucketsCount: -1
|
||||
m_ProfilerBucketAllocatorBlockSize: -1
|
||||
m_ProfilerBucketAllocatorBlockCount: -1
|
||||
m_TempAllocatorSizeMain: -1
|
||||
m_JobTempAllocatorBlockSize: -1
|
||||
m_BackgroundJobTempAllocatorBlockSize: -1
|
||||
m_JobTempAllocatorReducedBlockSize: -1
|
||||
m_TempAllocatorSizeGIBakingWorker: -1
|
||||
m_TempAllocatorSizeNavMeshWorker: -1
|
||||
m_TempAllocatorSizeAudioWorker: -1
|
||||
m_TempAllocatorSizeCloudWorker: -1
|
||||
m_TempAllocatorSizeGfx: -1
|
||||
m_TempAllocatorSizeJobWorker: -1
|
||||
m_TempAllocatorSizeBackgroundWorker: -1
|
||||
m_TempAllocatorSizePreloadManager: -1
|
||||
m_PlatformMemorySettings: {}
|
||||
@@ -3,7 +3,7 @@
|
||||
--- !u!129 &1
|
||||
PlayerSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 20
|
||||
serializedVersion: 26
|
||||
productGUID: 904cd7a3163037f42a9204c0e2f2b7bd
|
||||
AndroidProfiler: 0
|
||||
AndroidFilterTouchesWhenObscured: 0
|
||||
@@ -48,12 +48,16 @@ PlayerSettings:
|
||||
defaultScreenHeightWeb: 600
|
||||
m_StereoRenderingPath: 0
|
||||
m_ActiveColorSpace: 0
|
||||
unsupportedMSAAFallback: 0
|
||||
m_SpriteBatchVertexThreshold: 300
|
||||
m_MTRendering: 1
|
||||
mipStripping: 0
|
||||
numberOfMipsStripped: 0
|
||||
numberOfMipsStrippedPerMipmapLimitGroup: {}
|
||||
m_StackTraceTypes: 010000000100000001000000010000000100000001000000
|
||||
iosShowActivityIndicatorOnLoading: -1
|
||||
androidShowActivityIndicatorOnLoading: -1
|
||||
iosUseCustomAppBackgroundBehavior: 0
|
||||
iosAllowHTTPDownload: 1
|
||||
allowedAutorotateToPortrait: 1
|
||||
allowedAutorotateToPortraitUpsideDown: 1
|
||||
allowedAutorotateToLandscapeRight: 1
|
||||
@@ -66,6 +70,13 @@ PlayerSettings:
|
||||
androidRenderOutsideSafeArea: 1
|
||||
androidUseSwappy: 0
|
||||
androidBlitType: 0
|
||||
androidResizableWindow: 0
|
||||
androidDefaultWindowWidth: 1920
|
||||
androidDefaultWindowHeight: 1080
|
||||
androidMinimumWindowWidth: 400
|
||||
androidMinimumWindowHeight: 300
|
||||
androidFullscreenMode: 1
|
||||
androidAutoRotationBehavior: 1
|
||||
defaultIsNativeResolution: 1
|
||||
macRetinaSupport: 1
|
||||
runInBackground: 1
|
||||
@@ -77,6 +88,7 @@ PlayerSettings:
|
||||
hideHomeButton: 0
|
||||
submitAnalytics: 1
|
||||
usePlayerLog: 1
|
||||
dedicatedServerOptimizations: 0
|
||||
bakeCollisionMeshes: 0
|
||||
forceSingleInstance: 0
|
||||
useFlipModelSwapchain: 1
|
||||
@@ -111,16 +123,22 @@ PlayerSettings:
|
||||
switchNVNShaderPoolsGranularity: 33554432
|
||||
switchNVNDefaultPoolsGranularity: 16777216
|
||||
switchNVNOtherPoolsGranularity: 16777216
|
||||
switchGpuScratchPoolGranularity: 2097152
|
||||
switchAllowGpuScratchShrinking: 0
|
||||
switchNVNMaxPublicTextureIDCount: 0
|
||||
switchNVNMaxPublicSamplerIDCount: 0
|
||||
switchNVNGraphicsFirmwareMemory: 32
|
||||
switchMaxWorkerMultiple: 8
|
||||
stadiaPresentMode: 0
|
||||
stadiaTargetFramerate: 0
|
||||
vulkanNumSwapchainBuffers: 3
|
||||
vulkanEnableSetSRGBWrite: 0
|
||||
m_SupportedAspectRatios:
|
||||
4:3: 1
|
||||
5:4: 1
|
||||
16:10: 1
|
||||
16:9: 1
|
||||
Others: 1
|
||||
vulkanEnablePreTransform: 0
|
||||
vulkanEnableLateAcquireNextImage: 0
|
||||
vulkanEnableCommandBufferRecycling: 1
|
||||
loadStoreDebugModeEnabled: 0
|
||||
visionOSBundleVersion: 1.0
|
||||
tvOSBundleVersion: 1.0
|
||||
bundleVersion: 0.1
|
||||
preloadedAssets: []
|
||||
metroInputSource: 0
|
||||
@@ -129,46 +147,29 @@ PlayerSettings:
|
||||
xboxOneDisableKinectGpuReservation: 1
|
||||
xboxOneEnable7thCore: 1
|
||||
vrSettings:
|
||||
cardboard:
|
||||
depthFormat: 0
|
||||
enableTransitionView: 0
|
||||
daydream:
|
||||
depthFormat: 0
|
||||
useSustainedPerformanceMode: 0
|
||||
enableVideoLayer: 0
|
||||
useProtectedVideoMemory: 0
|
||||
minimumSupportedHeadTracking: 0
|
||||
maximumSupportedHeadTracking: 1
|
||||
hololens:
|
||||
depthFormat: 1
|
||||
depthBufferSharingEnabled: 1
|
||||
lumin:
|
||||
depthFormat: 0
|
||||
frameTiming: 2
|
||||
enableGLCache: 0
|
||||
glCacheMaxBlobSize: 524288
|
||||
glCacheMaxFileSize: 8388608
|
||||
oculus:
|
||||
sharedDepthBuffer: 1
|
||||
dashSupport: 1
|
||||
lowOverheadMode: 0
|
||||
protectedContext: 0
|
||||
v2Signing: 1
|
||||
enable360StereoCapture: 0
|
||||
isWsaHolographicRemotingEnabled: 0
|
||||
enableFrameTimingStats: 0
|
||||
enableOpenGLProfilerGPURecorders: 1
|
||||
allowHDRDisplaySupport: 0
|
||||
useHDRDisplay: 0
|
||||
D3DHDRBitDepth: 0
|
||||
hdrBitDepth: 0
|
||||
m_ColorGamuts: 00000000
|
||||
targetPixelDensity: 30
|
||||
resolutionScalingMode: 0
|
||||
resetResolutionOnWindowResize: 0
|
||||
androidSupportedAspectRatio: 1
|
||||
androidMaxAspectRatio: 2.1
|
||||
applicationIdentifier:
|
||||
Standalone: com.Company.ProductName
|
||||
buildNumber: {}
|
||||
Standalone: com.DefaultCompany.UniTask
|
||||
buildNumber:
|
||||
Standalone: 0
|
||||
VisionOS: 0
|
||||
iPhone: 0
|
||||
tvOS: 0
|
||||
overrideDefaultApplicationIdentifier: 0
|
||||
AndroidBundleVersionCode: 1
|
||||
AndroidMinSdkVersion: 19
|
||||
AndroidMinSdkVersion: 22
|
||||
AndroidTargetSdkVersion: 0
|
||||
AndroidPreferredInstallLocation: 1
|
||||
aotOptions:
|
||||
@@ -181,12 +182,15 @@ PlayerSettings:
|
||||
APKExpansionFiles: 0
|
||||
keepLoadedShadersAlive: 0
|
||||
StripUnusedMeshComponents: 1
|
||||
strictShaderVariantMatching: 0
|
||||
VertexChannelCompressionMask: 4054
|
||||
iPhoneSdkVersion: 988
|
||||
iOSTargetOSVersionString: 10.0
|
||||
iOSTargetOSVersionString: 12.0
|
||||
tvOSSdkVersion: 0
|
||||
tvOSRequireExtendedGameController: 0
|
||||
tvOSTargetOSVersionString: 10.0
|
||||
tvOSTargetOSVersionString: 12.0
|
||||
VisionOSSdkVersion: 0
|
||||
VisionOSTargetOSVersionString: 1.0
|
||||
uIPrerenderedIcon: 0
|
||||
uIRequiresPersistentWiFi: 0
|
||||
uIRequiresFullScreen: 1
|
||||
@@ -220,32 +224,48 @@ PlayerSettings:
|
||||
iOSLaunchScreeniPadFillPct: 100
|
||||
iOSLaunchScreeniPadSize: 100
|
||||
iOSLaunchScreeniPadCustomXibPath:
|
||||
iOSUseLaunchScreenStoryboard: 0
|
||||
iOSLaunchScreenCustomStoryboardPath:
|
||||
iOSLaunchScreeniPadCustomStoryboardPath:
|
||||
iOSDeviceRequirements: []
|
||||
iOSURLSchemes: []
|
||||
macOSURLSchemes: []
|
||||
iOSBackgroundModes: 0
|
||||
iOSMetalForceHardShadows: 0
|
||||
metalEditorSupport: 1
|
||||
metalAPIValidation: 1
|
||||
metalCompileShaderBinary: 0
|
||||
iOSRenderExtraFrameOnPause: 0
|
||||
iosCopyPluginsCodeInsteadOfSymlink: 0
|
||||
appleDeveloperTeamID:
|
||||
iOSManualSigningProvisioningProfileID:
|
||||
tvOSManualSigningProvisioningProfileID:
|
||||
VisionOSManualSigningProvisioningProfileID:
|
||||
iOSManualSigningProvisioningProfileType: 0
|
||||
tvOSManualSigningProvisioningProfileType: 0
|
||||
VisionOSManualSigningProvisioningProfileType: 0
|
||||
appleEnableAutomaticSigning: 0
|
||||
iOSRequireARKit: 0
|
||||
iOSAutomaticallyDetectAndAddCapabilities: 1
|
||||
appleEnableProMotion: 0
|
||||
shaderPrecisionModel: 0
|
||||
clonedFromGUID: 5f34be1353de5cf4398729fda238591b
|
||||
templatePackageId: com.unity.template.2d@3.1.0
|
||||
templateDefaultScene: Assets/Scenes/SampleScene.unity
|
||||
useCustomMainManifest: 0
|
||||
useCustomLauncherManifest: 0
|
||||
useCustomMainGradleTemplate: 0
|
||||
useCustomLauncherGradleManifest: 0
|
||||
useCustomBaseGradleTemplate: 0
|
||||
useCustomGradlePropertiesTemplate: 0
|
||||
useCustomGradleSettingsTemplate: 0
|
||||
useCustomProguardFile: 0
|
||||
AndroidTargetArchitectures: 1
|
||||
AndroidTargetDevices: 0
|
||||
AndroidSplashScreenScale: 0
|
||||
androidSplashScreen: {fileID: 0}
|
||||
AndroidKeystoreName: '{inproject}: '
|
||||
AndroidKeyaliasName:
|
||||
AndroidEnableArmv9SecurityFeatures: 0
|
||||
AndroidBuildApkPerCpuArchitecture: 0
|
||||
AndroidTVCompatibility: 0
|
||||
AndroidIsGame: 1
|
||||
@@ -258,11 +278,15 @@ PlayerSettings:
|
||||
height: 180
|
||||
banner: {fileID: 0}
|
||||
androidGamepadSupportLevel: 0
|
||||
chromeosInputEmulation: 1
|
||||
AndroidMinifyRelease: 0
|
||||
AndroidMinifyDebug: 0
|
||||
AndroidValidateAppBundleSize: 1
|
||||
AndroidAppBundleSizeToValidate: 100
|
||||
m_BuildTargetIcons: []
|
||||
m_BuildTargetPlatformIcons: []
|
||||
m_BuildTargetBatching: []
|
||||
m_BuildTargetShaderSettings: []
|
||||
m_BuildTargetGraphicsJobs:
|
||||
- m_BuildTarget: MacStandaloneSupport
|
||||
m_GraphicsJobs: 0
|
||||
@@ -298,8 +322,13 @@ PlayerSettings:
|
||||
m_BuildTargetGraphicsAPIs:
|
||||
- m_BuildTarget: AndroidPlayer
|
||||
m_APIs: 150000000b000000
|
||||
m_Automatic: 0
|
||||
m_Automatic: 1
|
||||
- m_BuildTarget: iOSSupport
|
||||
m_APIs: 10000000
|
||||
m_Automatic: 1
|
||||
m_BuildTargetVRSettings: []
|
||||
m_DefaultShaderChunkSizeInMB: 16
|
||||
m_DefaultShaderChunkCount: 0
|
||||
openGLRequireES31: 0
|
||||
openGLRequireES31AEP: 0
|
||||
openGLRequireES32: 0
|
||||
@@ -309,7 +338,11 @@ PlayerSettings:
|
||||
iPhone: 1
|
||||
tvOS: 1
|
||||
m_BuildTargetGroupLightmapEncodingQuality: []
|
||||
m_BuildTargetGroupHDRCubemapEncodingQuality: []
|
||||
m_BuildTargetGroupLightmapSettings: []
|
||||
m_BuildTargetGroupLoadStoreDebugModeSettings: []
|
||||
m_BuildTargetNormalMapEncoding: []
|
||||
m_BuildTargetDefaultTextureCompressionFormat: []
|
||||
playModeTestRunnerEnabled: 0
|
||||
runPlayModeTestAsEditModeTest: 0
|
||||
actionOnDotNetUnhandledException: 1
|
||||
@@ -319,14 +352,20 @@ PlayerSettings:
|
||||
cameraUsageDescription:
|
||||
locationUsageDescription:
|
||||
microphoneUsageDescription:
|
||||
bluetoothUsageDescription:
|
||||
macOSTargetOSVersion: 10.13.0
|
||||
switchNMETAOverride:
|
||||
switchNetLibKey:
|
||||
switchSocketMemoryPoolSize: 6144
|
||||
switchSocketAllocatorPoolSize: 128
|
||||
switchSocketConcurrencyLimit: 14
|
||||
switchScreenResolutionBehavior: 2
|
||||
switchUseCPUProfiler: 0
|
||||
switchEnableFileSystemTrace: 0
|
||||
switchLTOSetting: 0
|
||||
switchApplicationID: 0x01004b9000490000
|
||||
switchNSODependencies:
|
||||
switchCompilerFlags:
|
||||
switchTitleNames_0:
|
||||
switchTitleNames_1:
|
||||
switchTitleNames_2:
|
||||
@@ -342,6 +381,7 @@ PlayerSettings:
|
||||
switchTitleNames_12:
|
||||
switchTitleNames_13:
|
||||
switchTitleNames_14:
|
||||
switchTitleNames_15:
|
||||
switchPublisherNames_0:
|
||||
switchPublisherNames_1:
|
||||
switchPublisherNames_2:
|
||||
@@ -357,6 +397,7 @@ PlayerSettings:
|
||||
switchPublisherNames_12:
|
||||
switchPublisherNames_13:
|
||||
switchPublisherNames_14:
|
||||
switchPublisherNames_15:
|
||||
switchIcons_0: {fileID: 0}
|
||||
switchIcons_1: {fileID: 0}
|
||||
switchIcons_2: {fileID: 0}
|
||||
@@ -372,6 +413,7 @@ PlayerSettings:
|
||||
switchIcons_12: {fileID: 0}
|
||||
switchIcons_13: {fileID: 0}
|
||||
switchIcons_14: {fileID: 0}
|
||||
switchIcons_15: {fileID: 0}
|
||||
switchSmallIcons_0: {fileID: 0}
|
||||
switchSmallIcons_1: {fileID: 0}
|
||||
switchSmallIcons_2: {fileID: 0}
|
||||
@@ -387,6 +429,7 @@ PlayerSettings:
|
||||
switchSmallIcons_12: {fileID: 0}
|
||||
switchSmallIcons_13: {fileID: 0}
|
||||
switchSmallIcons_14: {fileID: 0}
|
||||
switchSmallIcons_15: {fileID: 0}
|
||||
switchManualHTML:
|
||||
switchAccessibleURLs:
|
||||
switchLegalInformation:
|
||||
@@ -396,7 +439,6 @@ PlayerSettings:
|
||||
switchReleaseVersion: 0
|
||||
switchDisplayVersion: 1.0.0
|
||||
switchStartupUserAccount: 0
|
||||
switchTouchScreenUsage: 0
|
||||
switchSupportedLanguagesMask: 0
|
||||
switchLogoType: 0
|
||||
switchApplicationErrorCodeCategory:
|
||||
@@ -438,6 +480,7 @@ PlayerSettings:
|
||||
switchNativeFsCacheSize: 32
|
||||
switchIsHoldTypeHorizontal: 0
|
||||
switchSupportedNpadCount: 8
|
||||
switchEnableTouchScreen: 1
|
||||
switchSocketConfigEnabled: 0
|
||||
switchTcpInitialSendBufferSize: 32
|
||||
switchTcpInitialReceiveBufferSize: 64
|
||||
@@ -448,7 +491,12 @@ PlayerSettings:
|
||||
switchSocketBufferEfficiency: 4
|
||||
switchSocketInitializeEnabled: 1
|
||||
switchNetworkInterfaceManagerInitializeEnabled: 1
|
||||
switchPlayerConnectionEnabled: 1
|
||||
switchUseNewStyleFilepaths: 0
|
||||
switchUseLegacyFmodPriorities: 0
|
||||
switchUseMicroSleepForYield: 1
|
||||
switchEnableRamDiskSupport: 0
|
||||
switchMicroSleepForYieldTime: 25
|
||||
switchRamDiskSpaceSize: 12
|
||||
ps4NPAgeRating: 12
|
||||
ps4NPTitleSecret:
|
||||
ps4NPTrophyPackPath:
|
||||
@@ -475,6 +523,7 @@ PlayerSettings:
|
||||
ps4ShareFilePath:
|
||||
ps4ShareOverlayImagePath:
|
||||
ps4PrivacyGuardImagePath:
|
||||
ps4ExtraSceSysFile:
|
||||
ps4NPtitleDatPath:
|
||||
ps4RemotePlayKeyAssignment: -1
|
||||
ps4RemotePlayKeyMappingDir:
|
||||
@@ -517,6 +566,9 @@ PlayerSettings:
|
||||
ps4disableAutoHideSplash: 0
|
||||
ps4videoRecordingFeaturesUsed: 0
|
||||
ps4contentSearchFeaturesUsed: 0
|
||||
ps4CompatibilityPS5: 0
|
||||
ps4AllowPS5Detection: 0
|
||||
ps4GPU800MHz: 1
|
||||
ps4attribEyeToEyeDistanceSettingVR: 0
|
||||
ps4IncludedModules: []
|
||||
ps4attribVROutputEnabled: 0
|
||||
@@ -528,6 +580,7 @@ PlayerSettings:
|
||||
webGLMemorySize: 16
|
||||
webGLExceptionSupport: 1
|
||||
webGLNameFilesAsHashes: 0
|
||||
webGLShowDiagnostics: 0
|
||||
webGLDataCaching: 1
|
||||
webGLDebugSymbols: 0
|
||||
webGLEmscriptenArgs:
|
||||
@@ -536,18 +589,47 @@ PlayerSettings:
|
||||
webGLAnalyzeBuildSize: 0
|
||||
webGLUseEmbeddedResources: 0
|
||||
webGLCompressionFormat: 1
|
||||
webGLWasmArithmeticExceptions: 0
|
||||
webGLLinkerTarget: 1
|
||||
webGLThreadsSupport: 0
|
||||
webGLWasmStreaming: 0
|
||||
webGLDecompressionFallback: 0
|
||||
webGLInitialMemorySize: 32
|
||||
webGLMaximumMemorySize: 2048
|
||||
webGLMemoryGrowthMode: 2
|
||||
webGLMemoryLinearGrowthStep: 16
|
||||
webGLMemoryGeometricGrowthStep: 0.2
|
||||
webGLMemoryGeometricGrowthCap: 96
|
||||
webGLPowerPreference: 2
|
||||
scriptingDefineSymbols: {}
|
||||
additionalCompilerArguments: {}
|
||||
platformArchitecture: {}
|
||||
scriptingBackend:
|
||||
Android: 1
|
||||
Server: 1
|
||||
Standalone: 1
|
||||
il2cppCompilerConfiguration: {}
|
||||
managedStrippingLevel: {}
|
||||
il2cppCodeGeneration: {}
|
||||
managedStrippingLevel:
|
||||
Android: 1
|
||||
EmbeddedLinux: 1
|
||||
GameCoreScarlett: 1
|
||||
GameCoreXboxOne: 1
|
||||
Nintendo Switch: 1
|
||||
PS4: 1
|
||||
PS5: 1
|
||||
QNX: 1
|
||||
Stadia: 1
|
||||
Standalone: 1
|
||||
VisionOS: 1
|
||||
WebGL: 1
|
||||
Windows Store Apps: 1
|
||||
XboxOne: 1
|
||||
iPhone: 1
|
||||
tvOS: 1
|
||||
incrementalIl2cppBuild: {}
|
||||
suppressCommonWarnings: 1
|
||||
allowUnsafeCode: 0
|
||||
useDeterministicCompilation: 1
|
||||
additionalIl2CppArgs:
|
||||
scriptingRuntimeVersion: 1
|
||||
gcIncremental: 0
|
||||
@@ -578,11 +660,13 @@ PlayerSettings:
|
||||
metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628,
|
||||
a: 1}
|
||||
metroSplashScreenUseBackgroundColor: 0
|
||||
syncCapabilities: 0
|
||||
platformCapabilities: {}
|
||||
metroTargetDeviceFamilies: {}
|
||||
metroFTAName:
|
||||
metroFTAFileTypes: []
|
||||
metroProtocolName:
|
||||
vcxProjDefaultLanguage:
|
||||
XboxOneProductId:
|
||||
XboxOneUpdateKey:
|
||||
XboxOneSandboxId:
|
||||
@@ -601,6 +685,7 @@ PlayerSettings:
|
||||
XboxOneCapability: []
|
||||
XboxOneGameRating: {}
|
||||
XboxOneIsContentPackage: 0
|
||||
XboxOneEnhancedXboxCompatibilityMode: 0
|
||||
XboxOneEnableGPUVariability: 1
|
||||
XboxOneSockets: {}
|
||||
XboxOneSplashScreen: {fileID: 0}
|
||||
@@ -609,10 +694,7 @@ PlayerSettings:
|
||||
XboxOneXTitleMemory: 8
|
||||
XboxOneOverrideIdentityName:
|
||||
XboxOneOverrideIdentityPublisher:
|
||||
vrEditorSettings:
|
||||
daydream:
|
||||
daydreamIconForeground: {fileID: 0}
|
||||
daydreamIconBackground: {fileID: 0}
|
||||
vrEditorSettings: {}
|
||||
cloudServicesEnabled:
|
||||
UNet: 1
|
||||
luminIcon:
|
||||
@@ -626,12 +708,22 @@ PlayerSettings:
|
||||
luminVersion:
|
||||
m_VersionCode: 1
|
||||
m_VersionName:
|
||||
hmiPlayerDataPath:
|
||||
hmiForceSRGBBlit: 1
|
||||
embeddedLinuxEnableGamepadInput: 1
|
||||
hmiLogStartupTiming: 0
|
||||
hmiCpuConfiguration:
|
||||
apiCompatibilityLevel: 6
|
||||
activeInputHandler: 0
|
||||
windowsGamepadBackendHint: 0
|
||||
cloudProjectId:
|
||||
framebufferDepthMemorylessMode: 0
|
||||
qualitySettingsNames: []
|
||||
projectName:
|
||||
organizationId:
|
||||
cloudEnabled: 0
|
||||
enableNativePlatformBackendsForNewInputSystem: 0
|
||||
disableOldInputManagerSupport: 0
|
||||
legacyClampBlendShapeWeights: 1
|
||||
hmiLoadingImage: {fileID: 0}
|
||||
platformRequiresReadableAssets: 0
|
||||
virtualTexturingSupportEnabled: 0
|
||||
insecureHttpOption: 0
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
m_EditorVersion: 2020.2.1f1
|
||||
m_EditorVersionWithRevision: 2020.2.1f1 (270dd8c3da1c)
|
||||
m_EditorVersion: 2022.3.39f1
|
||||
m_EditorVersionWithRevision: 2022.3.39f1 (4e1b0f82c39a)
|
||||
|
||||
121
src/UniTask/ProjectSettings/SceneTemplateSettings.json
Normal file
121
src/UniTask/ProjectSettings/SceneTemplateSettings.json
Normal file
@@ -0,0 +1,121 @@
|
||||
{
|
||||
"templatePinStates": [],
|
||||
"dependencyTypeInfos": [
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.AnimationClip",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.Animations.AnimatorController",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.AnimatorOverrideController",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.Audio.AudioMixerController",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.ComputeShader",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Cubemap",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.GameObject",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.LightingDataAsset",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.LightingSettings",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Material",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.MonoScript",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.PhysicMaterial",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.PhysicsMaterial2D",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Rendering.PostProcessing.PostProcessResources",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Rendering.VolumeProfile",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.SceneAsset",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Shader",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.ShaderVariantCollection",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Texture",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Texture2D",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Timeline.TimelineAsset",
|
||||
"defaultInstantiationMode": 0
|
||||
}
|
||||
],
|
||||
"defaultDependencyTypeInfo": {
|
||||
"userAdded": false,
|
||||
"type": "<default_scene_template_dependencies>",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
"newSceneOverride": 0
|
||||
}
|
||||
@@ -9,6 +9,7 @@ UnityConnectSettings:
|
||||
m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
|
||||
m_EventUrl: https://cdp.cloud.unity3d.com/v1/events
|
||||
m_ConfigUrl: https://config.uca.cloud.unity3d.com
|
||||
m_DashboardUrl: https://dashboard.unity3d.com
|
||||
m_TestInitMode: 0
|
||||
CrashReportingSettings:
|
||||
m_EventUrl: https://perf-events.cloud.unity3d.com
|
||||
@@ -22,6 +23,7 @@ UnityConnectSettings:
|
||||
m_Enabled: 0
|
||||
m_TestMode: 0
|
||||
m_InitializeOnStartup: 1
|
||||
m_PackageRequiringCoreStatsPresent: 0
|
||||
UnityAdsSettings:
|
||||
m_Enabled: 0
|
||||
m_InitializeOnStartup: 1
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!162 &1
|
||||
EditorUserSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 4
|
||||
m_ConfigSettings:
|
||||
RecentlyUsedScenePath-0:
|
||||
value: 22424703114646680e0b0227036c6c1118131a25340527392367083debf42d
|
||||
flags: 0
|
||||
vcSharedLogLevel:
|
||||
value: 0d5e400f0650
|
||||
flags: 0
|
||||
m_VCAutomaticAdd: 1
|
||||
m_VCDebugCom: 0
|
||||
m_VCDebugCmd: 0
|
||||
m_VCDebugOut: 0
|
||||
m_SemanticMergeMode: 2
|
||||
m_VCShowFailedCheckout: 1
|
||||
m_VCOverwriteFailedCheckoutAssets: 1
|
||||
m_VCProjectOverlayIcons: 1
|
||||
m_VCHierarchyOverlayIcons: 1
|
||||
m_VCOtherOverlayIcons: 1
|
||||
m_VCAllowAsyncUpdate: 0
|
||||
Reference in New Issue
Block a user