Web前端体验Unity3D 虚拟人开发(一)

您所在的位置:网站首页 unity3D开发语言 Web前端体验Unity3D 虚拟人开发(一)

Web前端体验Unity3D 虚拟人开发(一)

2023-03-10 03:38| 来源: 网络整理| 查看: 265

最近都说前端已死,前端们或者即将成为前端的或多或少都被影响,或转行或观望着入不入圈。其实大家不用焦虑,只要扪心自问,入前端是由于被前端相关技术所吸引还是由于她的薪酬回报(门槛低,薪资还行)。如果只会写页面又是出于后者考虑的,建议别继续折磨自己了。这篇文章献给想成为曾经的前端和不忘初心的前端,不同路有不同的风景,只是不要过分焦虑地看风景。

回归正题,虚拟人其实在Unity和UE中都要相关的模板项目,但是由于种种原因我这边还是选择Unity从0开发的,想做UE的可以做个参考。

背景

这是去年(2022)体验虚拟人的一个项目,目的是想在发布会这种场合通过虚拟人媒介展示公司成果。由于Unity组的小伙伴都很忙,然后项目本身对Unity技术要求也不是很高,再加上Plan B会涉及前端视频流方案,就让我这个原本做前端的上了。

对比语言

Unity3D目前是用C#开发的,如果早期接触过的同学应该知道,它也可以用JavaScript编写,不过后来由于种种原因不支持了。至于什么原因,我们来问问神奇的海螺吧,呸,New Bing吧。

Unity3d不再支持JavaScript

不过,C#和JavaScript就没有一点点关系了么?JavaScript的超集TypeScript的主要作者是Anders Hejlsberg,他也是C#的设计者,都是基于C的。哇喔~

开发环境

Unity3D在安装的时候推荐是用Visual Studio开发的,但是也可以在Unity里选择VSCode作为编辑器,为了能得心应手,我选择了VSCode,配置方式如下。

在VSCode里,我还装了不在继续维护的Debug for Unity, 全靠它解决了不少Bug,如果以后完全不能用的话估计也不能用VSCode作为Unity开发的编辑器了。这点大家注意

生命周期Unity3d生命周期

我们看下主要几个生命周期:

// 生命周期第一个事件 void Awake() { } // 当脚本文件是enable状态,Awake之后就会触发的事件 void Start() { } // 更新 void Update() { } // 应用退出 void OnApplicationQuit() { }

看了这个这几个生命周期,Vue/React是不是要拍大腿,大喊:这个我熟!

协程与异步

如果说语言上的关系是硬凑,生命周期上的雷同是巧合,那么协程和异步上的相似真是太神奇了。JavaScript和Unity都是单线程的设计,当主线程在当前帧执行时间过长而影响渲染时,我们就需要协程/异步。

稍微不同是,协程执行Update和LateUpdate之间,异步执行在事件队列的宏任务和微任务上,LateUpdate是对Update在当前帧的补充,微任务是对当前循环中宏任务的补充。

Unity多线程和WebWorker

JavaScript和Unity的设计虽然都是单线程的,但是都预留了可以使用多线程的方式。

但这两个都是有局限性,Unity多线程无法调用UnityEngine API,也就无法操作Unity Object。WebWorker无法访问主线程的DOM对象。这无疑切断了多线程控制展示层的东西,不过仔细想想很合理,多线程并发的情况下,你说UI展示上该听哪个线程的?

架构

该项目主要功能是通过对话的形式将用户和虚拟人的对话内容呈现出来,并驱动虚拟人口型和动作。流程方面涉及3端,前端(Android+Unity),业务逻辑云端,提供原子API能力的云端, 大致数据流向如下

数据流向功能

Android:

UI音频采集对话展示承载Unity。

Unity:

虚拟人渲染声音播放(TTS)表情驱动(TTF)动作驱动(TTA)Idle衔接舞蹈,打断(Dance/Interrupt)眼神锁定,眨眼(LookAt/Blink)

云端:

数据整合ASR(Automatic Speech Recognition)语音识别NLP(Natural Language Processing)模型回复对话内容TTS(Text to Speech)文本转语音TTF(Text to Face)文本转表情TTA(Text to Action)文本转动作。

第二篇,开发逻辑

第三篇,细节避坑



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3