Skip to content

CoroutineHelper โ€‹

ๅ‘ฝๅ็ฉบ้—ด: Cwl.Helper.Unity;

ไธ€็งๆ–นไพฟ็š„ๆ–นๅผๆฅ่ฐƒ็”จๅง”ๆ‰˜ๆˆ–ๅ็จ‹๏ผŒๅœจไปปไฝ•ไธŠไธ‹ๆ–‡ไธญ๏ผŒๆ— ่ฎบๆ˜ฏๅฆไธบ MonoBehaviour ๅฎžไพ‹ใ€‚

็ซ‹ๅณ โ€‹

cs
static void MyTask();

CoroutineHelper.Immediate(MyTask);
CoroutineHelper.Immediate(() => {
    // some other stuff
    MyTask();
});

ๅœจไธ‹ไธ€ไธช Unity Update ไบ‹ไปถๅŽ็ซ‹ๅณ่ฐƒ็”จๅง”ๆ‰˜ใ€‚

cs
static IEnumerator MyCoroutineTask();

CoroutineHelper.Immediate(MyCoroutineTask());

ๅœจไธ‹ไธ€ไธช Unity Update ไบ‹ไปถๅŽ็ซ‹ๅณ่ฐƒ็”จๅ็จ‹ใ€‚

ๆกไปถๅปถ่ฟŸ โ€‹

ๆกไปถ่งฆๅ‘็š„ๆ ธๅฟƒใ€‚

cs
static void CleanupTask();

CoroutineHelper.Deferred(CleanupTask, () => SomeCheck.ShouldClean);

static void AddStuffToPlayer(int id);

CoroutineHelper.Deferred(
    () => AddStuffToPlayer(114514),
    () => EMono.core.IsGameStarted);

ๅฝ“ๆกไปถไธบ็œŸๆ—ถ่ฐƒ็”จๅง”ๆ‰˜ใ€‚

ๅธงๅปถ่ฟŸ โ€‹

ๆœ‰ๆ—ถไฝ ๆƒณๅปถ่ฟŸๆŸไบ›ๅธงๅ†ๆ‰ง่กŒไฝ ็š„ๅŠจไฝœใ€‚ไพ‹ๅฆ‚๏ผŒๅœจไธŽ UI ็›ธๅ…ณ็š„ไปฃ็ ไธญ๏ผŒไฝ ๅฏ่ƒฝๅธŒๆœ›ๅ…ˆ่ฎฉ UI ๅˆทๆ–ฐ๏ผŒ็„ถๅŽๅœจ 1 ๅธงๅŽ็ป˜ๅˆถไฝ ่‡ชๅทฑ็š„ๅ†…ๅฎน๏ผŒไปฅ้€‚ๅบ”ๆ–ฐ็š„ไฝ็ฝฎ/ๆ•ฐๆฎ็ญ‰ใ€‚

cs
static void AdjustPosition();

// default 1 frame
CoroutineHelper.Deferred(AdjustPosition);
// specify frames
CoroutineHelper.Deferred(AdjustPosition, 5);
// anonymous lambda works too
CoroutineHelper.Deferred(
    () => {
        // some other stuff
        AdjustPosition();
    },
    5);

ๆ—ถ้—ดๅปถ่ฟŸ โ€‹

ๆœ‰ๆ—ถไฝ ๅธŒๆœ›ๆŸไธชๆ•ˆๆžœๆŒ็ปญไธ€ๆฎตๆ—ถ้—ด๏ผŒ็„ถๅŽๅ†่ฟ›่กŒๅŽ็ปญๆ“ไฝœใ€‚

cs
static void ClearEffects();

// wait 1.5s
CoroutineHelper.Deferred(ClearEffects, 1.5f);
CoroutineHelper.Deferred(
    () => {
        // some other stuff
        ClearEffects();
    },
    1.5f);

ProgressIndicator โ€‹

ไธบๅผ‚ๆญฅๆ–นๆณ•ๆไพ›ๅœจๅฑๅน•ๅณไธŠ่ง’ๆ˜พ็คบ็Šถๆ€ๆ–‡ๆœฌ็š„ๅธฎๅŠฉ็ฑปใ€‚

cs
static string currentLoading = "";
static bool shouldClose;

IEnumerator MyAsyncTask()
{
    var progress = ProgressIndicator.CreateProgress(
        onUpdate: () => new UpdateInfo(Text: currentLoading, Sprite: null, Color: null),
        shouldKill: () => shouldClose
    );

    foreach (var file in BunchOfFiles) {
        currentLoading = file.Name;
        yield return new SomeTask();
    }

    currentLoading = "finished loading";
    shouldClose = true;
}

ไนŸๅฏไฝฟ็”จๅชๅœจๅฝ“ๅ‰ไฝœ็”จๅŸŸๆ˜พ็คบๅนถ่‡ชๅŠจๅ…ณ้—ญ็š„ไพฟๆท้‡่ฝฝ:

cs
static string currentLoading = "";

IEnumerator MyAsyncTask()
{
    using var progress = ProgressIndicator.CreateProgress(
        () => new UpdateInfo(Text: currentLoading, Sprite: null, Color: null)
    );

    foreach (var file in BunchOfFiles) {
        currentLoading = file.Name;
        yield return new SomeTask();
    }

    currentLoading = "finished loading";
}

ProgressIndicator โ€‹

็”จไบŽๅœจๅฑๅน•ๅณไธŠ่ง’ๆ˜พ็คบๅผ‚ๆญฅๆ“ไฝœ็š„่ฟ›ๅบฆ่ทŸ่ธชๅ™จใ€‚

cs
static string currentLoading = "";
static bool shouldClose;

IEnumerator MyAsyncTask()
{
    var progress = ProgressIndicator.CreateProgress(
        onUpdate: () => new UpdateInfo(Text: currentLoading, Sprite: null, Color: null),
        shouldKill: () => shouldClose
    );

    foreach (var file in BunchOfFiles) {
        currentLoading = file.Name;
        yield return new SomeTask();
    }

    currentLoading = "ๅŠ ่ฝฝๅฎŒๆˆ";
    shouldClose = true;
}

ๆ‚จ่ฟ˜ๅฏไปฅไฝฟ็”จไฝœ็”จๅŸŸ้‡่ฝฝ๏ผŒๅฎƒไผšๅœจๆ–นๆณ•้€€ๅ‡บๆ—ถ่‡ชๅŠจๅ…ณ้—ญ๏ผš

cs
static string currentLoading = "";

IEnumerator MyAsyncTask()
{
    using var progress = ProgressIndicator.CreateProgressScoped(
        () => new UpdateInfo(currentLoading)
    );

    foreach (var file in BunchOfFiles) {
        currentLoading = file.Name;
        yield return new SomeTask();
    }

    currentLoading = "ๅŠ ่ฝฝๅฎŒๆˆ";
}

SpriteCreator โ€‹

ๅธฎๅŠฉๅŠ ่ฝฝ PNG ไฝœไธบ Sprite๏ผŒๅธฆๆœ‰็ผ“ๅญ˜ๅ’Œๅฏ้€‰่ฐƒๆ•ดๅคงๅฐ้€‰้กนใ€‚

cs
Sprite? LoadSprite(this string path, Vector2? pivot = null, string? name = null, int resizeWidth = 0, int resizeHeight = 0);

var filePath = "X:/someimage.png";
var sprite = filePath.LoadSprite(name: "SpriteNewName", resizeWidth: 900, resizeHeight: 600);

้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒ่ฝดๅฟƒไฝไบŽไธญๅฟƒ๏ผˆ0.5, 0.5๏ผ‰๏ผŒไธๆไพ› name ๅ‚ๆ•ฐๆ—ถ๏ผŒSprite ๅ็งฐๅฐ†ไฝฟ็”จๅ†…้ƒจ็ผ“ๅญ˜ๅ็งฐใ€‚ๅฆ‚ๆžœ resizeWidth ๅ’Œ/ๆˆ– resizeHeight ไธไธบ 0๏ผŒๅˆ™ Sprite ๅฐ†่ขซ่ฐƒๆ•ด่‡ณๆŒ‡ๅฎšๅคงๅฐใ€‚

SpriteReplacerHelper โ€‹

็”จไบŽๅฟซ้€Ÿๅ‘ๆธธๆˆๅ†… SpriteSheet ๆทปๅŠ ่ดดๅ›พๅ—๏ผŒๅนถๅธฆๆœ‰ๅฏ้€‰่ฐƒๆ•ดๅคงๅฐ้€‰้กนใ€‚

cs
// file at "X:/someimage_alt.png"
SpriteReplacerHelper.AppendSpriteSheet("someimage_alt", 32, 32);

ๅ…จๅฑ€ไธญๆ‚จๅบ”ๅฝ“ไธบๅ„่ดดๅ›พๅช่ฐƒ็”จ่ฏฅๆ–นๆณ•ไธ€ๆฌก๏ผŒไธ”้ƒจๅˆ†ๆบ่กจ็š„่ดดๅ›พ็”ฑ CWL ่‡ชๅŠจๆทปๅŠ ใ€‚

ChildrenIterator โ€‹

ๅธฎๅŠฉๆŸฅๆ‰พๅ…ทๆœ‰ๅ็งฐ็š„ GameObject ็š„ๅตŒๅฅ—ๅญๅฏน่ฑกใ€‚ๅ‡่ฎพไฝ ๆƒณๆ‰พๅˆฐๅคๅˆ้กต้ข็š„ๅธƒๅฑ€็ป„้ขๆฟไธญๅˆ—่กจๅ…ƒ็ด ็š„ๆ–‡ๆœฌๅฏน่ฑก๏ผŒไฝ ๅฏไปฅ่ฟ™ๆ ทๅš๏ผš

cs
var text = page.transform.GetFirstNestedChildWithName("Content View/Scroll View/Viewport/Content/Profile List/Entry (1)/text");

ๅฏนไบŽ้žๅตŒๅฅ—่ฎฟ้—ฎ๏ผŒไฝฟ็”จ GetFirstChildWithNameใ€‚

ๅฆ‚ๆžœๆœชๆ‰พๅˆฐ๏ผŒๅˆ™่ฟ”ๅ›ž nullใ€‚

ๅ…ถไป–ๅ†…ๅฎน โ€‹

ไธ€ไบ›ไฝ ๅฏ่ƒฝไธ้œ€่ฆ็š„ๅ†…ๅฎน๏ผš