Unity的‘异步‘操作

我们都知道同步方法是一步一步执行,但是不总能够一条道走到黑,特别是在资源加载的时候

一、协程加载(假异步)

代码如下,比较简单

using System.Collections;
using UnityEngine;

public class CoroutineExample : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    private IEnumerator MyCoroutine()
    {
        Debug.Log("Coroutine Started");

        // 等待2秒
        yield return new WaitForSeconds(2f);

        Debug.Log("Coroutine Resumed after 2 seconds");

        // 每隔1秒打印一次信息,重复5次
        for (int i = 0; i < 5; i++)
        {
            Debug.Log("Coroutine Running: " + i);
            yield return new WaitForSeconds(1f);
        }

        Debug.Log("Coroutine Finished");
    }
}

协程后台实际上是使用状态机进行的

Additional:状态机

状态机(State Machine)是一种用于描述对象在不同状态下的行为和状态转换的数学模型。它通常用于建模实体(Entity)的状态和行为

比如:

using System;
using UnityEngine;

public enum CharacterState
{
    Idle,
    Walk,
    Jump
}

public class CharacterStateMachine
{
    private CharacterState currentState;

    public CharacterStateMachine()
    {
        // 初始状态为站立
        currentState = CharacterState.Idle;
    }

    public void TransitionToState(CharacterState newState)
    {
        if (currentState != newState)
        {
            switch (newState)
            {
                case CharacterState.Idle:
                    // 执行从其他状态到站立状态的转换逻辑
                    Debug.Log("Transitioning to Idle state");
                    break;
                case CharacterState.Walk:
                    // 执行从站立到行走状态的转换逻辑
                    Debug.Log("Transitioning to Walk state");
                    break;
                case CharacterState.Jump:
                    // 执行从站立或行走到跳跃状态的转换逻辑
                    Debug.Log("Transitioning to Jump state");
                    break;
                default:
                    break;
            }

            currentState = newState;
        }
    }

    public CharacterState GetCurrentState()
    {
        return currentState;
    }
}

public class CharacterController : MonoBehaviour
{
    private CharacterStateMachine stateMachine;

    void Start()
    {
        stateMachine = new CharacterStateMachine();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            // 当按下W键时,切换到行走状态
            stateMachine.TransitionToState(CharacterState.Walk);
        }
        else if (Input.GetKeyDown(KeyCode.Space))
        {
            // 当按下空格键时,切换到跳跃状态
            stateMachine.TransitionToState(CharacterState.Jump);
        }

        Debug.Log("Current state: " + stateMachine.GetCurrentState());
    }
}

这就是一种简单的状态机,简单说就是几种状态,对应几种枚举,在每一种状态下执行一种命令

二、Async/Await异步加载

拿这个登录的方法举例

 public async UniTask<bool> Login(string username, string password)
    {
        var url = $"{root}?username={username}&password={password}";
        HTTPRequest request = new HTTPRequest(new Uri(url), HTTPMethods.Post);
        await request.Send();
        if (request.Exception != null)
        {
            Debug.Log("请求异常" + request.Exception.Message);
            return false;
        }
        else if (request.Response.IsSuccess)
        {
            Debug.Log("response success!");
            string stringResponse = request.Response.DataAsText;
            response = JsonMapper.ToObject<ResponseResult>(stringResponse);
            bool isSuccess = response.success;
            Debug.Log(isSuccess);
            Debug.Log(response.result);
            return isSuccess;
        }
        return false;
    }

把链接的请求丢给服务器,然后让服务器返回相应的内容,我们做出下一步的判断,这个方法就使用了async/await方法进行,避免放到主线程会堵塞线程

三、Thread线程

还是拿代码进行举例

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 创建一个新线程并指定执行的方法
        Thread thread = new Thread(new ThreadStart(WorkerMethod));

        // 启动线程
        thread.Start();

        // 主线程继续执行其他工作
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("Main Thread: " + i);
            Thread.Sleep(1000); // 主线程休眠1秒
        }

        // 等待新线程执行完成
        thread.Join();

        Console.WriteLine("Main Thread Done");
    }

    static void WorkerMethod()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("Worker Thread: " + i);
            Thread.Sleep(1000); // 新线程休眠1秒
        }
    }
}

我们可以看出,协程是类似于线程的,不过它不是真正的线程,事实上它是一种轻量级的协作多任务系统,它使用状态机和主线程来实现异步操作,而不是创建新的操作系统线程。这使得编写异步代码变得更加容易,而无需担心多线程的复杂性。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity是一款非常流行的游戏开发引擎,它支持异步加载和等待操作,这对于提高游戏性能、优化用户体验非常重要。 异步加载是指在游戏运行过程中,可以异步地加载资源、场景或者其他数据,而不会阻塞游戏的进行。通过使用异步加载机制,可以在游戏进行过程中不断地加载数据,减少加载时间,提高游戏的效率和流畅度。 在Unity中,异步加载可以通过协程(Coroutine)实现。通过使用协程,可以将加载任务分为多个小部分,每次只加载一部分数据,然后通过等待的方式继续加载下一部分,以此类推,直到所有数据全部加载完毕。 Unity提供了一些常用的异步加载方法,例如LoadSceneAsync用于异步加载场景,LoadAssetAsync用于异步加载资源。这些方法都返回一个AsyncOperation对象,通过检查该对象的isDone属性,可以判断加载是否完成,通过该对象的progress属性,可以获取加载进度。 在等待异步加载完成时,可以使用yield return关键字暂停协程的执行,等待加载完成后再继续执行后续操作。例如可以使用yield return StartCoroutine来等待异步加载的完成,实现等待的效果。 总之,Unity的异步加载和等待机制是游戏开发中非常重要的一环,能够提高游戏的效率和流畅度,提升用户体验。通过使用异步加载和等待机制,可以更好地进行资源管理和加载优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laker404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值