mirror of
https://github.com/Cysharp/UniTask.git
synced 2026-05-19 05:30:12 +00:00
Compare commits
16 Commits
v2.5.11
...
0db2f737b8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0db2f737b8 | ||
|
|
d3e71502d6 | ||
|
|
63708841f5 | ||
|
|
06067cd4c8 | ||
|
|
d9983cfe27 | ||
|
|
70eb7cd3ee | ||
|
|
cc3c70af90 | ||
|
|
8042b29ff8 | ||
|
|
b0d01ca75f | ||
|
|
7a63ab7088 | ||
|
|
bdf102f145 | ||
|
|
41cea030ab | ||
|
|
f9fd769be7 | ||
|
|
579304fe47 | ||
|
|
740ca7ef01 | ||
|
|
7c0f199fe0 |
5
.github/dependabot.yaml
vendored
5
.github/dependabot.yaml
vendored
@@ -5,3 +5,8 @@ updates:
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly" # Check for updates to GitHub Actions every week
|
||||
ignore:
|
||||
# I just want update action when major/minor version is updated. patch updates are too noisy.
|
||||
- dependency-name: '*'
|
||||
update-types:
|
||||
- version-update:semver-patch
|
||||
|
||||
22
.github/workflows/build-debug.yml
vendored
22
.github/workflows/build-debug.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: Cysharp/Actions/.github/actions/checkout@main
|
||||
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
|
||||
- run: dotnet build -c Debug
|
||||
- run: dotnet test -c Debug
|
||||
@@ -26,20 +26,20 @@ jobs:
|
||||
matrix:
|
||||
unity: ["2022.3.39f1", "6000.0.12f1"] # Test with LTS
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
timeout-minutes: 30 # Unity build takes more than 20min.
|
||||
steps:
|
||||
- name: Load secrets
|
||||
id: op-load-secret
|
||||
uses: 1password/load-secrets-action@v2
|
||||
uses: 1password/load-secrets-action@581a835fb51b8e7ec56b71cf2ffddd7e68bb25e0 # v2.0.0
|
||||
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"
|
||||
UNITY_EMAIL: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/username"
|
||||
UNITY_PASSWORD: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/credential"
|
||||
UNITY_SERIAL: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/serial"
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: Cysharp/Actions/.github/actions/checkout@main
|
||||
|
||||
# Execute scripts: Export Package
|
||||
# /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export
|
||||
@@ -56,10 +56,6 @@ jobs:
|
||||
targetPlatform: StandaloneLinux64
|
||||
buildMethod: PackageExporter.Export
|
||||
|
||||
- uses: Cysharp/Actions/.github/actions/check-metas@main # check meta files
|
||||
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)
|
||||
@@ -79,6 +75,10 @@ jobs:
|
||||
- name: Execute UnitTest
|
||||
run: ./src/UniTask/bin/UnitTest/StandaloneLinux64_IL2CPP/test
|
||||
|
||||
- uses: Cysharp/Actions/.github/actions/check-metas@main # check meta files
|
||||
with:
|
||||
directory: src/UniTask
|
||||
|
||||
# Store artifacts.
|
||||
- uses: Cysharp/Actions/.github/actions/upload-artifact@main
|
||||
if: ${{ startsWith(matrix.unity, '2021') }} # only execute 2021
|
||||
|
||||
10
.github/workflows/build-docs.yml
vendored
10
.github/workflows/build-docs.yml
vendored
@@ -11,21 +11,21 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v4
|
||||
- uses: Cysharp/Actions/.github/actions/checkout@main
|
||||
- uses: Cysharp/Actions/.github/actions/checkout@main
|
||||
with:
|
||||
repository: Cysharp/DocfxTemplate
|
||||
path: docs/_DocfxTemplate
|
||||
- uses: Kirbyrawr/docfx-action@master
|
||||
- uses: Kirbyrawr/docfx-action@db9a22c8fe1e8693a2a21be54cb0b87dfaa72cc4
|
||||
name: Docfx metadata
|
||||
with:
|
||||
args: metadata docs/docfx.json
|
||||
- uses: Kirbyrawr/docfx-action@master
|
||||
- uses: Kirbyrawr/docfx-action@db9a22c8fe1e8693a2a21be54cb0b87dfaa72cc4
|
||||
name: Docfx build
|
||||
with:
|
||||
args: build docs/docfx.json
|
||||
- name: Publish to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: docs/_site
|
||||
|
||||
12
.github/workflows/build-release.yml
vendored
12
.github/workflows/build-release.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- run: echo ${{ needs.update-packagejson.outputs.sha }}
|
||||
- uses: actions/checkout@v4
|
||||
- uses: Cysharp/Actions/.github/actions/checkout@main
|
||||
with:
|
||||
ref: ${{ needs.update-packagejson.outputs.sha }}
|
||||
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
|
||||
@@ -51,17 +51,17 @@ jobs:
|
||||
steps:
|
||||
- name: Load secrets
|
||||
id: op-load-secret
|
||||
uses: 1password/load-secrets-action@v2
|
||||
uses: 1password/load-secrets-action@581a835fb51b8e7ec56b71cf2ffddd7e68bb25e0 # v2.0.0
|
||||
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"
|
||||
UNITY_EMAIL: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/username"
|
||||
UNITY_PASSWORD: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/credential"
|
||||
UNITY_SERIAL: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/serial"
|
||||
|
||||
- run: echo ${{ needs.update-packagejson.outputs.sha }}
|
||||
- uses: actions/checkout@v4
|
||||
- uses: Cysharp/Actions/.github/actions/checkout@main
|
||||
with:
|
||||
ref: ${{ needs.update-packagejson.outputs.sha }}
|
||||
# Execute scripts: Export Package
|
||||
|
||||
9
.github/workflows/toc.yml
vendored
9
.github/workflows/toc.yml
vendored
@@ -8,8 +8,7 @@ on:
|
||||
jobs:
|
||||
generateTOC:
|
||||
name: TOC Generator
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: technote-space/toc-generator@v4.3.1
|
||||
with:
|
||||
TOC_TITLE: "## Table of Contents"
|
||||
uses: Cysharp/Actions/.github/workflows/toc-generator.yaml@main
|
||||
with:
|
||||
TOC_TITLE: "## Table of Contents"
|
||||
secrets: inherit
|
||||
|
||||
12
README.md
12
README.md
@@ -33,6 +33,7 @@ For advanced tips, see blog post: [Extends UnityWebRequest via async decorator p
|
||||
- [AsyncEnumerable and Async LINQ](#asyncenumerable-and-async-linq)
|
||||
- [Awaitable Events](#awaitable-events)
|
||||
- [Channel](#channel)
|
||||
- [vs Awaitable](#vs-awaitable)
|
||||
- [For Unit Testing](#for-unit-testing)
|
||||
- [ThreadPool limitation](#threadpool-limitation)
|
||||
- [IEnumerator.ToUniTask limitation](#ienumeratortounitask-limitation)
|
||||
@@ -67,6 +68,7 @@ async UniTask<string> DemoAsync()
|
||||
await SceneManager.LoadSceneAsync("scene2");
|
||||
|
||||
// .WithCancellation enables Cancel, GetCancellationTokenOnDestroy synchornizes with lifetime of GameObject
|
||||
// after Unity 2022.2, you can use `destroyCancellationToken` in MonoBehaviour
|
||||
var asset2 = await Resources.LoadAsync<TextAsset>("bar").WithCancellation(this.GetCancellationTokenOnDestroy());
|
||||
|
||||
// .ToUniTask accepts progress callback(and all options), Progress.Create is a lightweight alternative of IProgress<T>
|
||||
@@ -293,6 +295,8 @@ public class MyBehaviour : MonoBehaviour
|
||||
}
|
||||
```
|
||||
|
||||
After Unity 2022.2, Unity adds CancellationToken in [MonoBehaviour.destroyCancellationToken](https://docs.unity3d.com/ScriptReference/MonoBehaviour-destroyCancellationToken.html) and [Application.exitCancellationToken](https://docs.unity3d.com/ScriptReference/Application-exitCancellationToken.html).
|
||||
|
||||
When cancellation is detected, all methods throw `OperationCanceledException` and propagate upstream. When exception(not limited to `OperationCanceledException`) is not handled in async method, it is propagated finally to `UniTaskScheduler.UnobservedTaskException`. The default behaviour of received unhandled exception is to write log as exception. Log level can be changed using `UniTaskScheduler.UnobservedExceptionWriteLogType`. If you want to use custom behaviour, set an action to `UniTaskScheduler.UnobservedTaskException.`
|
||||
|
||||
And also `OperationCanceledException` is a special exception, this is silently ignored at `UnobservedTaskException`.
|
||||
@@ -953,6 +957,14 @@ public class AsyncMessageBroker<T> : IDisposable
|
||||
}
|
||||
```
|
||||
|
||||
vs Awaitable
|
||||
---
|
||||
Unity 6 introduces the awaitable type, [Awaitable](https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Awaitable.html). To put it simply, Awaitable can be considered a subset of UniTask, and in fact, Awaitable's design was influenced by UniTask. It should be able to handle PlayerLoop-based awaits, pooled Tasks, and support for cancellation with `CancellationToken` in a similar way. With its inclusion in the standard library, you may wonder whether to continue using UniTask or migrate to Awaitable. Here's a brief guide.
|
||||
|
||||
First, the functionality provided by Awaitable is equivalent to what coroutines offer. Instead of `yield return`, you use await; `await NextFrameAsync()` replaces `yield return null`; and there are equivalents for `WaitForSeconds` and `EndOfFrame`. However, that's the extent of it. Being coroutine-based in terms of functionality, it lacks Task-based features. In practical application development using async/await, operations like `WhenAll` are essential. Additionally, UniTask enables many frame-based operations (such as `DelayFrame`) and more flexible PlayerLoopTiming control, which are not available in Awaitable. Of course, there's no Tracker Window either.
|
||||
|
||||
Therefore, I recommend using UniTask for application development. UniTask is a superset of Awaitable and includes many essential features. For library development, where you want to avoid external dependencies, using Awaitable as a return type for methods would be appropriate. Awaitable can be converted to UniTask using `AsUniTask`, so there's no issue in handling Awaitable-based functionality within the UniTask library. Of course, if you don't need to worry about dependencies, using UniTask would be the best choice even for library development.
|
||||
|
||||
For Unit Testing
|
||||
---
|
||||
Unity's `[UnityTest]` attribute can test coroutine(IEnumerator) but can not test async. `UniTask.ToCoroutine` bridges async/await to coroutine so you can test async methods.
|
||||
|
||||
468
README_CN.md
468
README_CN.md
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@ namespace Cysharp.Threading.Tasks
|
||||
static Action<object> continuation = SetCompletionSource;
|
||||
|
||||
Func<UniTask> taskFactory;
|
||||
UniTaskCompletionSource completionSource;
|
||||
AutoResetUniTaskCompletionSource completionSource;
|
||||
UniTask.Awaiter awaiter;
|
||||
|
||||
object syncLock;
|
||||
@@ -19,7 +19,7 @@ namespace Cysharp.Threading.Tasks
|
||||
public AsyncLazy(Func<UniTask> taskFactory)
|
||||
{
|
||||
this.taskFactory = taskFactory;
|
||||
this.completionSource = new UniTaskCompletionSource();
|
||||
this.completionSource = AutoResetUniTaskCompletionSource.Create();
|
||||
this.syncLock = new object();
|
||||
this.initialized = false;
|
||||
}
|
||||
@@ -27,7 +27,7 @@ namespace Cysharp.Threading.Tasks
|
||||
internal AsyncLazy(UniTask task)
|
||||
{
|
||||
this.taskFactory = null;
|
||||
this.completionSource = new UniTaskCompletionSource();
|
||||
this.completionSource = AutoResetUniTaskCompletionSource.Create();
|
||||
this.syncLock = null;
|
||||
this.initialized = true;
|
||||
|
||||
@@ -129,7 +129,7 @@ namespace Cysharp.Threading.Tasks
|
||||
static Action<object> continuation = SetCompletionSource;
|
||||
|
||||
Func<UniTask<T>> taskFactory;
|
||||
UniTaskCompletionSource<T> completionSource;
|
||||
AutoResetUniTaskCompletionSource<T> completionSource;
|
||||
UniTask<T>.Awaiter awaiter;
|
||||
|
||||
object syncLock;
|
||||
@@ -138,7 +138,7 @@ namespace Cysharp.Threading.Tasks
|
||||
public AsyncLazy(Func<UniTask<T>> taskFactory)
|
||||
{
|
||||
this.taskFactory = taskFactory;
|
||||
this.completionSource = new UniTaskCompletionSource<T>();
|
||||
this.completionSource = AutoResetUniTaskCompletionSource<T>.Create();
|
||||
this.syncLock = new object();
|
||||
this.initialized = false;
|
||||
}
|
||||
@@ -146,7 +146,7 @@ namespace Cysharp.Threading.Tasks
|
||||
internal AsyncLazy(UniTask<T> task)
|
||||
{
|
||||
this.taskFactory = null;
|
||||
this.completionSource = new UniTaskCompletionSource<T>();
|
||||
this.completionSource = AutoResetUniTaskCompletionSource<T>.Create();
|
||||
this.syncLock = null;
|
||||
this.initialized = true;
|
||||
|
||||
|
||||
@@ -135,8 +135,8 @@ namespace Cysharp.Threading.Tasks
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
cancellationTokenRegistration.Dispose();
|
||||
core.Reset();
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancellationTokenRegistration = default;
|
||||
parent.triggerEvent.Remove(this);
|
||||
parent = null;
|
||||
@@ -453,8 +453,8 @@ namespace Cysharp.Threading.Tasks
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
cancellationTokenRegistration.Dispose();
|
||||
core.Reset();
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancellationTokenRegistration = default;
|
||||
parent.triggerEvent.Remove(this);
|
||||
parent = null;
|
||||
|
||||
@@ -67,13 +67,13 @@ namespace Cysharp.Threading.Tasks
|
||||
return (UniTask.FromCanceled(cancellationToken), default(CancellationTokenRegistration));
|
||||
}
|
||||
|
||||
var promise = new UniTaskCompletionSource();
|
||||
var promise = AutoResetUniTaskCompletionSource.Create();
|
||||
return (promise.Task, cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationTokenCallback, promise));
|
||||
}
|
||||
|
||||
static void Callback(object state)
|
||||
{
|
||||
var promise = (UniTaskCompletionSource)state;
|
||||
var promise = (AutoResetUniTaskCompletionSource)state;
|
||||
promise.TrySetResult();
|
||||
}
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
readonly Queue<T> items;
|
||||
readonly SingleConsumerUnboundedChannelReader readerSource;
|
||||
UniTaskCompletionSource completedTaskSource;
|
||||
AutoResetUniTaskCompletionSource completedTaskSource;
|
||||
UniTask completedTask;
|
||||
|
||||
Exception completionError;
|
||||
@@ -208,7 +208,7 @@ namespace Cysharp.Threading.Tasks
|
||||
return parent.completedTask;
|
||||
}
|
||||
|
||||
parent.completedTaskSource = new UniTaskCompletionSource();
|
||||
parent.completedTaskSource = AutoResetUniTaskCompletionSource.Create();
|
||||
return parent.completedTaskSource.Task;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -353,8 +353,8 @@ namespace Cysharp.Threading.Tasks
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
cancellationRegistration.Dispose();
|
||||
core.Reset();
|
||||
cancellationRegistration.Dispose();
|
||||
|
||||
RestoreOriginalCallback();
|
||||
|
||||
|
||||
@@ -36,11 +36,11 @@ namespace Cysharp.Threading.Tasks.Linq
|
||||
|
||||
public UniTask<bool> MoveNextAsync()
|
||||
{
|
||||
var tcs = new UniTaskCompletionSource<bool>();
|
||||
var tcs = AutoResetUniTaskCompletionSource<bool>.Create();
|
||||
|
||||
cancellationToken.Register(state =>
|
||||
{
|
||||
var task = (UniTaskCompletionSource<bool>)state;
|
||||
var task = (AutoResetUniTaskCompletionSource<bool>)state;
|
||||
task.TrySetCanceled(cancellationToken);
|
||||
}, tcs);
|
||||
|
||||
|
||||
@@ -18,13 +18,13 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
#endif
|
||||
|
||||
/// <summary>This CancellationToken is canceled when the MonoBehaviour will be destroyed.</summary>
|
||||
/// <summary>This CancellationToken is canceled when the GameObject will be destroyed.</summary>
|
||||
public static CancellationToken GetCancellationTokenOnDestroy(this GameObject gameObject)
|
||||
{
|
||||
return gameObject.GetAsyncDestroyTrigger().CancellationToken;
|
||||
}
|
||||
|
||||
/// <summary>This CancellationToken is canceled when the MonoBehaviour will be destroyed.</summary>
|
||||
/// <summary>This CancellationToken is canceled when the Component will be destroyed.</summary>
|
||||
public static CancellationToken GetCancellationTokenOnDestroy(this Component component)
|
||||
{
|
||||
#if UNITY_2022_2_OR_NEWER
|
||||
|
||||
@@ -255,7 +255,7 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
@@ -289,7 +289,6 @@ namespace Cysharp.Threading.Tasks
|
||||
return false;
|
||||
}
|
||||
|
||||
cancellationTokenRegistration.Dispose();
|
||||
core.TrySetResult(null);
|
||||
return false;
|
||||
}
|
||||
@@ -297,9 +296,9 @@ namespace Cysharp.Threading.Tasks
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
cancellationTokenRegistration.Dispose();
|
||||
core.Reset();
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
@@ -367,7 +366,7 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
@@ -413,9 +412,9 @@ namespace Cysharp.Threading.Tasks
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
cancellationTokenRegistration.Dispose();
|
||||
core.Reset();
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@ namespace Cysharp.Threading.Tasks
|
||||
/// </summary>
|
||||
public static UniTask<T> AsUniTask<T>(this Task<T> task, bool useCurrentSynchronizationContext = true)
|
||||
{
|
||||
var promise = new UniTaskCompletionSource<T>();
|
||||
var promise = AutoResetUniTaskCompletionSource<T>.Create();
|
||||
|
||||
task.ContinueWith((x, state) =>
|
||||
{
|
||||
var p = (UniTaskCompletionSource<T>)state;
|
||||
var p = (AutoResetUniTaskCompletionSource<T>)state;
|
||||
|
||||
switch (x.Status)
|
||||
{
|
||||
@@ -46,11 +46,11 @@ namespace Cysharp.Threading.Tasks
|
||||
/// </summary>
|
||||
public static UniTask AsUniTask(this Task task, bool useCurrentSynchronizationContext = true)
|
||||
{
|
||||
var promise = new UniTaskCompletionSource();
|
||||
var promise = AutoResetUniTaskCompletionSource.Create();
|
||||
|
||||
task.ContinueWith((x, state) =>
|
||||
{
|
||||
var p = (UniTaskCompletionSource)state;
|
||||
var p = (AutoResetUniTaskCompletionSource)state;
|
||||
|
||||
switch (x.Status)
|
||||
{
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
public static UniTask<T> ToUniTask<T>(this IObservable<T> source, bool useFirstValue = false, CancellationToken cancellationToken = default)
|
||||
{
|
||||
var promise = new UniTaskCompletionSource<T>();
|
||||
var promise = AutoResetUniTaskCompletionSource<T>.Create();
|
||||
var disposable = new SingleAssignmentDisposable();
|
||||
|
||||
var observer = useFirstValue
|
||||
@@ -109,7 +109,7 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
static readonly Action<object> callback = OnCanceled;
|
||||
|
||||
readonly UniTaskCompletionSource<T> promise;
|
||||
readonly IPromise<T> promise;
|
||||
readonly SingleAssignmentDisposable disposable;
|
||||
readonly CancellationToken cancellationToken;
|
||||
readonly CancellationTokenRegistration registration;
|
||||
@@ -117,7 +117,7 @@ namespace Cysharp.Threading.Tasks
|
||||
bool hasValue;
|
||||
T latestValue;
|
||||
|
||||
public ToUniTaskObserver(UniTaskCompletionSource<T> promise, SingleAssignmentDisposable disposable, CancellationToken cancellationToken)
|
||||
public ToUniTaskObserver(IPromise<T> promise, SingleAssignmentDisposable disposable, CancellationToken cancellationToken)
|
||||
{
|
||||
this.promise = promise;
|
||||
this.disposable = disposable;
|
||||
@@ -180,14 +180,14 @@ namespace Cysharp.Threading.Tasks
|
||||
{
|
||||
static readonly Action<object> callback = OnCanceled;
|
||||
|
||||
readonly UniTaskCompletionSource<T> promise;
|
||||
readonly IPromise<T> promise;
|
||||
readonly SingleAssignmentDisposable disposable;
|
||||
readonly CancellationToken cancellationToken;
|
||||
readonly CancellationTokenRegistration registration;
|
||||
|
||||
bool hasValue;
|
||||
|
||||
public FirstValueToUniTaskObserver(UniTaskCompletionSource<T> promise, SingleAssignmentDisposable disposable, CancellationToken cancellationToken)
|
||||
public FirstValueToUniTaskObserver(IPromise<T> promise, SingleAssignmentDisposable disposable, CancellationToken cancellationToken)
|
||||
{
|
||||
this.promise = promise;
|
||||
this.disposable = disposable;
|
||||
|
||||
@@ -42,7 +42,6 @@ namespace Cysharp.Threading.Tasks
|
||||
return new UniTask(AsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token);
|
||||
}
|
||||
|
||||
#if !UNITY_2023_1_OR_NEWER
|
||||
public struct AsyncOperationAwaiter : ICriticalNotifyCompletion
|
||||
{
|
||||
AsyncOperation asyncOperation;
|
||||
@@ -82,7 +81,6 @@ namespace Cysharp.Threading.Tasks
|
||||
asyncOperation.completed += continuationAction;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
sealed class AsyncOperationConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationConfiguredSource>
|
||||
{
|
||||
@@ -101,7 +99,6 @@ namespace Cysharp.Threading.Tasks
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
bool allowReturn;
|
||||
|
||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||
|
||||
@@ -129,8 +126,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
result.allowReturn = false;
|
||||
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
@@ -158,16 +154,9 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
if (allowReturn)
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
allowReturn = true;
|
||||
}
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -194,15 +183,9 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (allowReturn)
|
||||
// Already completed
|
||||
if (completed || asyncOperation == null)
|
||||
{
|
||||
TryReturn();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (completed)
|
||||
{
|
||||
allowReturn = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -219,8 +202,6 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
if (asyncOperation.isDone)
|
||||
{
|
||||
cancellationTokenRegistration.Dispose();
|
||||
allowReturn = true;
|
||||
core.TrySetResult(AsyncUnit.Default);
|
||||
return false;
|
||||
}
|
||||
@@ -231,31 +212,29 @@ namespace Cysharp.Threading.Tasks
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
cancellationTokenRegistration.Dispose();
|
||||
core.Reset();
|
||||
asyncOperation.completed -= continuationAction;
|
||||
asyncOperation = default;
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
void Continuation(AsyncOperation _)
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
progress.Report(asyncOperation.progress);
|
||||
}
|
||||
|
||||
core.TrySetResult(AsyncUnit.Default);
|
||||
}
|
||||
}
|
||||
@@ -350,7 +329,6 @@ namespace Cysharp.Threading.Tasks
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
bool allowReturn;
|
||||
|
||||
UniTaskCompletionSourceCore<UnityEngine.Object> core;
|
||||
|
||||
@@ -378,8 +356,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
result.allowReturn = false;
|
||||
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
@@ -407,16 +384,9 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
if (allowReturn)
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
allowReturn = true;
|
||||
}
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -447,15 +417,9 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (allowReturn)
|
||||
// Already completed
|
||||
if (completed || asyncOperation == null)
|
||||
{
|
||||
TryReturn();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (completed)
|
||||
{
|
||||
allowReturn = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -472,8 +436,6 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
if (asyncOperation.isDone)
|
||||
{
|
||||
cancellationTokenRegistration.Dispose();
|
||||
allowReturn = true;
|
||||
core.TrySetResult(asyncOperation.asset);
|
||||
return false;
|
||||
}
|
||||
@@ -484,31 +446,29 @@ namespace Cysharp.Threading.Tasks
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
cancellationTokenRegistration.Dispose();
|
||||
core.Reset();
|
||||
asyncOperation.completed -= continuationAction;
|
||||
asyncOperation = default;
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
void Continuation(AsyncOperation _)
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
progress.Report(asyncOperation.progress);
|
||||
}
|
||||
|
||||
core.TrySetResult(asyncOperation.asset);
|
||||
}
|
||||
}
|
||||
@@ -604,7 +564,6 @@ namespace Cysharp.Threading.Tasks
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
bool allowReturn;
|
||||
|
||||
UniTaskCompletionSourceCore<UnityEngine.Object> core;
|
||||
|
||||
@@ -632,8 +591,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
result.allowReturn = false;
|
||||
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
@@ -661,16 +619,9 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
if (allowReturn)
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
allowReturn = true;
|
||||
}
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -701,15 +652,9 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (allowReturn)
|
||||
// Already completed
|
||||
if (completed || asyncOperation == null)
|
||||
{
|
||||
TryReturn();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (completed)
|
||||
{
|
||||
allowReturn = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -726,8 +671,6 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
if (asyncOperation.isDone)
|
||||
{
|
||||
cancellationTokenRegistration.Dispose();
|
||||
allowReturn = true;
|
||||
core.TrySetResult(asyncOperation.asset);
|
||||
return false;
|
||||
}
|
||||
@@ -738,31 +681,29 @@ namespace Cysharp.Threading.Tasks
|
||||
bool TryReturn()
|
||||
{
|
||||
TaskTracker.RemoveTracking(this);
|
||||
cancellationTokenRegistration.Dispose();
|
||||
core.Reset();
|
||||
asyncOperation.completed -= continuationAction;
|
||||
asyncOperation = default;
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
void Continuation(AsyncOperation _)
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
progress.Report(asyncOperation.progress);
|
||||
}
|
||||
|
||||
core.TrySetResult(asyncOperation.asset);
|
||||
}
|
||||
}
|
||||
@@ -859,7 +800,6 @@ namespace Cysharp.Threading.Tasks
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
bool allowReturn;
|
||||
|
||||
UniTaskCompletionSourceCore<AssetBundle> core;
|
||||
|
||||
@@ -887,8 +827,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
result.allowReturn = false;
|
||||
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
@@ -916,16 +855,9 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
if (allowReturn)
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
allowReturn = true;
|
||||
}
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -956,15 +888,9 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (allowReturn)
|
||||
// Already completed
|
||||
if (completed || asyncOperation == null)
|
||||
{
|
||||
TryReturn();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (completed)
|
||||
{
|
||||
allowReturn = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -981,8 +907,6 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
if (asyncOperation.isDone)
|
||||
{
|
||||
cancellationTokenRegistration.Dispose();
|
||||
allowReturn = true;
|
||||
core.TrySetResult(asyncOperation.assetBundle);
|
||||
return false;
|
||||
}
|
||||
@@ -992,32 +916,30 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
bool TryReturn()
|
||||
{
|
||||
cancellationTokenRegistration.Dispose();
|
||||
TaskTracker.RemoveTracking(this);
|
||||
core.Reset();
|
||||
asyncOperation.completed -= continuationAction;
|
||||
asyncOperation = default;
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
void Continuation(AsyncOperation _)
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
progress.Report(asyncOperation.progress);
|
||||
}
|
||||
|
||||
core.TrySetResult(asyncOperation.assetBundle);
|
||||
}
|
||||
}
|
||||
@@ -1129,7 +1051,6 @@ namespace Cysharp.Threading.Tasks
|
||||
CancellationTokenRegistration cancellationTokenRegistration;
|
||||
bool cancelImmediately;
|
||||
bool completed;
|
||||
bool allowReturn;
|
||||
|
||||
UniTaskCompletionSourceCore<UnityWebRequest> core;
|
||||
|
||||
@@ -1157,8 +1078,7 @@ namespace Cysharp.Threading.Tasks
|
||||
result.cancellationToken = cancellationToken;
|
||||
result.cancelImmediately = cancelImmediately;
|
||||
result.completed = false;
|
||||
result.allowReturn = false;
|
||||
|
||||
|
||||
asyncOperation.completed += result.continuationAction;
|
||||
|
||||
if (cancelImmediately && cancellationToken.CanBeCanceled)
|
||||
@@ -1187,16 +1107,9 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
|
||||
{
|
||||
if (allowReturn)
|
||||
{
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
allowReturn = true;
|
||||
}
|
||||
TryReturn();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1227,20 +1140,15 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (allowReturn)
|
||||
// Already completed
|
||||
if (completed || asyncOperation == null)
|
||||
{
|
||||
TryReturn();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (completed)
|
||||
{
|
||||
allowReturn = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
asyncOperation.webRequest.Abort();
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
return false;
|
||||
}
|
||||
@@ -1252,9 +1160,14 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
if (asyncOperation.isDone)
|
||||
{
|
||||
cancellationTokenRegistration.Dispose();
|
||||
allowReturn = true;
|
||||
core.TrySetResult(asyncOperation.webRequest);
|
||||
if (asyncOperation.webRequest.IsError())
|
||||
{
|
||||
core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest));
|
||||
}
|
||||
else
|
||||
{
|
||||
core.TrySetResult(asyncOperation.webRequest);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1263,22 +1176,24 @@ namespace Cysharp.Threading.Tasks
|
||||
|
||||
bool TryReturn()
|
||||
{
|
||||
cancellationTokenRegistration.Dispose();
|
||||
TaskTracker.RemoveTracking(this);
|
||||
core.Reset();
|
||||
asyncOperation.completed -= continuationAction;
|
||||
asyncOperation = default;
|
||||
progress = default;
|
||||
cancellationToken = default;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
cancelImmediately = default;
|
||||
return pool.TryPush(this);
|
||||
}
|
||||
|
||||
void Continuation(AsyncOperation _)
|
||||
{
|
||||
if (completed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
completed = true;
|
||||
cancellationTokenRegistration.Dispose();
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
core.TrySetCanceled(cancellationToken);
|
||||
@@ -1289,11 +1204,6 @@ namespace Cysharp.Threading.Tasks
|
||||
}
|
||||
else
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
progress.Report(asyncOperation.progress);
|
||||
}
|
||||
|
||||
core.TrySetResult(asyncOperation.webRequest);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "com.cysharp.unitask",
|
||||
"displayName": "UniTask",
|
||||
"author": { "name": "Cysharp, Inc.", "url": "https://cysharp.co.jp/en/" },
|
||||
"version": "2.5.9",
|
||||
"version": "2.5.10",
|
||||
"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: b055f3837a55b4a44abf9bf4bcb3594f
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1 +0,0 @@
|
||||
MyTEST
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 49ccc900467d35543bb602a3de4d786a
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -21,6 +21,7 @@ using System.Linq.Expressions;
|
||||
using UnityEngine.Events;
|
||||
|
||||
|
||||
|
||||
// using DG.Tweening;
|
||||
|
||||
|
||||
@@ -179,7 +180,7 @@ public class SandboxMain : MonoBehaviour
|
||||
|
||||
|
||||
//UnityAction action;
|
||||
|
||||
|
||||
|
||||
return 10;
|
||||
}
|
||||
@@ -591,78 +592,69 @@ public class SandboxMain : MonoBehaviour
|
||||
|
||||
async UniTaskVoid Start()
|
||||
{
|
||||
var p = Progress.Create<float>(x =>
|
||||
await new WhenEachTest().Each();
|
||||
|
||||
|
||||
// UniTask.Delay(TimeSpan.FromSeconds(1)).TimeoutWithoutException
|
||||
|
||||
|
||||
var currentLoop = PlayerLoop.GetDefaultPlayerLoop();
|
||||
PlayerLoopHelper.Initialize(ref currentLoop, InjectPlayerLoopTimings.Minimum); // minimum is Update | FixedUpdate | LastPostLateUpdate
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// TestAsync(cts.Token).Forget();
|
||||
|
||||
okButton.onClick.AddListener(UniTask.UnityAction(async () =>
|
||||
{
|
||||
Debug.Log(x);
|
||||
});
|
||||
var foo = await Resources.LoadAsync("test2").ToUniTask(progress: p) as TextAsset;
|
||||
Debug.Log(foo.text);
|
||||
//var foo2 = await Resources.LoadAsync("test2").ToUniTask() as TextAsset;
|
||||
//Debug.Log(foo2.text); // onemore?
|
||||
await UniTask.WaitForEndOfFrame(this);
|
||||
var texture = new Texture2D(Screen.width, Screen.height);
|
||||
texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
|
||||
texture.Apply();
|
||||
|
||||
var jpg = texture.EncodeToJPG();
|
||||
File.WriteAllBytes("testscreencapture.jpg", jpg);
|
||||
Debug.Log("ok?");
|
||||
|
||||
//var texture = ScreenCapture.CaptureScreenshotAsTexture();
|
||||
//if (texture == null)
|
||||
//{
|
||||
// Debug.Log("fail");
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// var jpg = texture.EncodeToJPG();
|
||||
// File.WriteAllBytes("testscreencapture.jpg", jpg);
|
||||
// Debug.Log("ok?");
|
||||
//}
|
||||
}));
|
||||
|
||||
//await new WhenEachTest().Each();
|
||||
cancelButton.onClick.AddListener(UniTask.UnityAction(async () =>
|
||||
{
|
||||
//clickCancelSource.Cancel();
|
||||
|
||||
//RunCheck(PlayerLoopTiming.Initialization).Forget();
|
||||
//RunCheck(PlayerLoopTiming.LastInitialization).Forget();
|
||||
//RunCheck(PlayerLoopTiming.EarlyUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.LastEarlyUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.FixedUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.LastFixedUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.PreUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.LastPreUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.Update).Forget();
|
||||
//RunCheck(PlayerLoopTiming.LastUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.PreLateUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.LastPreLateUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.PostLateUpdate).Forget();
|
||||
//RunCheck(PlayerLoopTiming.LastPostLateUpdate).Forget();
|
||||
|
||||
//// UniTask.Delay(TimeSpan.FromSeconds(1)).TimeoutWithoutException
|
||||
await UniTask.Yield();
|
||||
}));
|
||||
|
||||
|
||||
//var currentLoop = PlayerLoop.GetDefaultPlayerLoop();
|
||||
//PlayerLoopHelper.Initialize(ref currentLoop, InjectPlayerLoopTimings.Minimum); // minimum is Update | FixedUpdate | LastPostLateUpdate
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//// TestAsync(cts.Token).Forget();
|
||||
|
||||
//okButton.onClick.AddListener(UniTask.UnityAction(async () =>
|
||||
//{
|
||||
// await UniTask.WaitForEndOfFrame(this);
|
||||
// var texture = new Texture2D(Screen.width, Screen.height);
|
||||
// texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
|
||||
// texture.Apply();
|
||||
|
||||
// var jpg = texture.EncodeToJPG();
|
||||
// File.WriteAllBytes("testscreencapture.jpg", jpg);
|
||||
// Debug.Log("ok?");
|
||||
|
||||
// //var texture = ScreenCapture.CaptureScreenshotAsTexture();
|
||||
// //if (texture == null)
|
||||
// //{
|
||||
// // Debug.Log("fail");
|
||||
// //}
|
||||
// //else
|
||||
// //{
|
||||
// // var jpg = texture.EncodeToJPG();
|
||||
// // File.WriteAllBytes("testscreencapture.jpg", jpg);
|
||||
// // Debug.Log("ok?");
|
||||
// //}
|
||||
//}));
|
||||
|
||||
//cancelButton.onClick.AddListener(UniTask.UnityAction(async () =>
|
||||
//{
|
||||
// //clickCancelSource.Cancel();
|
||||
|
||||
// //RunCheck(PlayerLoopTiming.Initialization).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.LastInitialization).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.EarlyUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.LastEarlyUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.FixedUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.LastFixedUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.PreUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.LastPreUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.Update).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.LastUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.PreLateUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.LastPreLateUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.PostLateUpdate).Forget();
|
||||
// //RunCheck(PlayerLoopTiming.LastPostLateUpdate).Forget();
|
||||
|
||||
// await UniTask.Yield();
|
||||
//}));
|
||||
await UniTask.Yield();
|
||||
}
|
||||
|
||||
async UniTaskVoid RunCheck(PlayerLoopTiming timing)
|
||||
|
||||
Reference in New Issue
Block a user