Laya核心库 + 逻辑 + 资源 移植到 Vite + Vue 3 进行项目开发

news2024/11/29 18:36:18

Laya项目移植到Vite + Vue 3

  • 为什么写这篇文章
    • 初遇 Laya
    • 结识 Vite + Vue 3
    • Vite 构建 Vue 3 项目
      • 快速初始化项目
      • VSCode打开项目/目录文件介绍
        • public 目录
      • 安装Volar扩展
    • 导入Laya核心JS库
      • 拷贝Laya项目bin/libs
      • libs文件夹放入Vue项目下public文件夹中
    • 导入Laya项目逻辑
      • 拷贝Laya项目src下所以内容
    • 进行基础配置
    • 驱动-dev、构建-build、预览-preview

为什么写这篇文章

初遇 Laya

那是去年三月初入职,接手项目主要方向通过 Unity + Oculus 进行开发,主要涉及(人物模块 + 场景模块 + UI模块 + VR交互)! 后因使用VR 头盔、APP等形式的产品不易推广项目进行调整,需要研究Web端输出。Unity自带的Web包效果是很好的,但是每次修改编译时间过长,包整体过大在web端是不能接受的。三月底研究Laya、白鹭等引擎决定使用Laya + Unity进行 3D Web 项目开发,由Unity 通过Laya 插件中导出模型资源。

结识 Vite + Vue 3

今年五月初追溯去年三月已有一年零两个月,通过 Laya + Unity 进行3D H5开发也历经几个项目,其中也有许多项目可复用,会copy项目进行精简优化在进行新功能开发,也苦恼新项目中优化过的功能也不能很好的复刻到旧项目中进行维护。公司层面也有进行产品化的构想,从提出构想->头脑风暴->初步结论 历经三周,前后端形成统一意见“产品化==低代码”。抒写PPT过程中低代码平台技术选型为 JavaScript 框架:Vite + Vue 3 / UI框架:Element Plus / 可视化图表:antv/x6 等进行基础开发,业务产品使用Laya 核心js库 为基础进行开发。

Vite 构建 Vue 3 项目

Vite官方中文文档:点击跳转

快速初始化项目

npm create vite [project name]   // npm create vite my-vue 创建名为my-vue的项目

1、选择框架 - Vue
请添加图片描述
2、选择语言 - TypeScript
请添加图片描述
3、依次执行命令行

 cd my-vue       // 进入新建项目目录
 npm install     // 初始化项目安装模块
 npm run dev     // 启动项目

请添加图片描述
4、完成 通过Local路径可在浏览器查看
请添加图片描述
5、效果预览
请添加图片描述

VSCode打开项目/目录文件介绍

VSCode:文件 -> 打开文件夹 在弹出窗口中选中项目文件夹
在这里插入图片描述

public 目录

如果你有下列这些资源:
不会被源码引用(例如 robots.txt)
必须保持原有文件名(没有经过 hash)
…或者你压根不想引入该资源,只是想得到其 URL。

那么你可以将该资源放在指定的 public 目录中,它应位于你的项目根目录。该目录中的资源在开发时能直接通过 / 根路径访问到,并且打包时会被完整复制到目标目录的根目录下。
目录默认是 /public,但可以通过 publicDir 选项 来配置。
请注意:
引入 public 中的资源永远应该使用根绝对路径 —— 举个例子,public/icon.png 应该在源码中被引用为 /icon.png。
public 中的资源不应该被 JavaScript 文件引用。

安装Volar扩展

Vue Language Features (Volar):是为Vue、Vitepress和petite-vue构建的语言支持扩展。它基于@vue/reactivity按需计算一切,实现原生TypeScript语言的服务级性能。
请添加图片描述

导入Laya核心JS库

拷贝Laya项目bin/libs

可以整个文件夹拷贝
也可以按需拷贝

libs文件夹放入Vue项目下public文件夹中

因为Laya核心库基本不会有改动,所以不需要进行hash版本控制,所以选择放置在public文件夹中

请添加图片描述

导入Laya项目逻辑

拷贝Laya项目src下所以内容

1、修改src/Main.ts Laya项目主入口和Vue主入口main.ts重名 所以重命名:LayaMain.ts
2、复制主要文件LayaMain.ts、GameConfig.ts、script到Vue/src项目下
请添加图片描述
3、修改main.ts 执行LayaMain.ts逻辑

// import { createApp } from 'vue'
// import './style.css'
// import App from './App.vue'
// createApp(App).mount('#app')

import {LayaMain} from './LayaMain'

// 调用Laya逻辑
new LayaMain();

4、Laya核心库调用
因为Laya核心库是通过配置动态生成index.js文件进行库加载,所以需要在LayaMain.ts中按需导入。

import "../libs/laya.core";
import "../libs/laya.ui";
import "../libs/laya.d3";
import "../libs/laya.device";
import "../libs/laya.physics3D";
import "../libs/laya.device";
import "../libs/laya.html";
import "../libs/laya.particle";
import GameConfig from "./GameConfig";

class LayaMain
{
    constructor() {
		// 根据IDE设置初始化引擎		
		if (window["Laya3D"]) Laya3D.init(GameConfig.width, GameConfig.height);
		else Laya.init(GameConfig.width, GameConfig.height, Laya["WebGL"]);
		。。。
	}
}

进行基础配置

tsconfig.json
下列配置中添加最多的就是关闭严格检查,因为Laya中语法不够严格,导入使用Vite + Vue 架构会出现各种报错。

{
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "skipLibCheck": true,

    /* Bundler mode */
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "resolveJsonModule": true,
    /* 隔离模块 */
    "isolatedModules": false,
    "noEmit": true,
    "jsx": "preserve",

    /* Linting */
    /* TypeScript 会在无法推断类型时回退到any变量的类型 */
    "noImplicitAny": false,
    /* TypeScript 将检查函数中的所有代码路径以确保它们返回值 */
    "noImplicitReturns": true,
    /* 没有隐含的 */
    "noImplicitThis": true,
    /* 没有来自索引签名的属性访问 */
    "noPropertyAccessFromIndexSignature": false,
    /* 没有未经检查的索引访问 */
    "noUncheckedIndexedAccess": false,
    /* 启用本地变量未被读取时的错误报告 */
    "noUnusedLocals": false,
    /* 当未读取函数参数时引发错误 */
    "noUnusedParameters": false,
    /* 启用所有严格类型检查选项 */
    "strict": true,
    /* 严格绑定调用应用:TypeScript 将检查 functions 、bind和的内置方法apply是否使用正确的底层函数参数调用 */
    "strictBindCallApply": false,
    /* 严格的函数类型:启用后,此标志会导致更正确地检查功能参数 */
    "strictFunctionTypes": false,
    /* 在进行类型检查时,要考虑null和undefined */
    "strictNullChecks": false,
    /* 检查已声明但未在构造函数中设置的类属性 */
    "strictPropertyInitialization": false,
    /* 在捕获变量中使用未知 */
    "useUnknownInCatchVariables": false,
    /* 在switch语句中启用故障报告 */
    "noFallthroughCasesInSwitch": true,
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

tsconfig.node.json

{
  "compilerOptions": {
    "composite": true,
    "skipLibCheck": true,
    "module": "ESNext",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true
  },
  "include": ["vite.config.ts"]
}

vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  /* 基础路径 */
  base:"./",
  plugins: [vue()],
  build: {
    terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true,
      },
    },
    // chunkSizeWarningLimit: 1500,大文件报警阈值设置,不建议使用
    rollupOptions: {
      output: { 
        // 静态资源分类打包
        chunkFileNames: 'static/js/[name]-[hash].js',
        entryFileNames: 'static/js/[name]-[hash].js',
        assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
        // manualChunks(id) { 
        //   // 静态资源分拆打包
        //   if (id.includes('node_modules')) {
        //     return id.toString().split('node_modules/')[1].split('/')[0].toString();
        //   }
        // }
      }
    }
  },
})

驱动-dev、构建-build、预览-preview

1、打开package.json文件进行调试
在这里插入图片描述

2、使用VSCode运行和调试功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装db2数据库

1.下载 安装依赖 链接:https://pan.baidu.com/s/1rpZn3H1oN8O0kn8YQMa-gQ?pwd8u9d 提取码:8u9d 需要关闭SELinux 修改配置文件vi /etc/selinux/config,将SELinux置为disabled,并重启机器。 安装缺失的32位包 从RHEL 6开始&…

正式向Win12过渡,微软为Win11开启一大波功能更新

距离 Win 11 正式发布已过去接近两年时间,为了让大家放弃老系统升级 Win 11,微软没少下功夫。 除了各种强制弹窗通知提醒升级外,微软还大刀阔斧砍掉 Win 10 功能更新,并已宣布其最后死期——2025 年 10 月。 然而这一套组合拳下…

『赠书活动 | 第十期』清华社赞助 | 《前端系列丛书》

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 『赠书活动 | 第十期』 本期书籍:《前端系列丛书》 公众号赠书:第二期 参与方式:关注公众号:低调而奢华 …

Dubbo快速入门 —— 基于SpringBoot Starter 开发微服务应用案例 + 知识讲解

💧 D u b b o 快速入门——基于 S p r i n g B o o t S t a r t e r 开发微服务应用案例 知识讲解 \color{#FF1493}{Dubbo快速入门 —— 基于SpringBoot Starter 开发微服务应用案例 知识讲解} Dubbo快速入门——基于SpringBootStarter开发微服务应用案例知识讲解…

7脚手架与jwt

1.引言 企业开发中的前端工程一般不会让程序员自己从零搭建,所以咱们要学会使用别人封装好的架子,或者低代码开发平台,这里 咱们快速上手一个第三方的脚手架。 参考资料 花裤衩 (panjiachen) - Gitee.com 2.安装步骤 # 克隆项目 git clon…

【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法

【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法 【一】为什么有这个问题【二】Object类的中的hashcode方法和equals方法【三】重写hashcode【四】重写equals方法【五】hashmap中使用hashcode和equals方法 【一】为什么有这个问题 因为HashMa…

致我们那年青春热血的高考

#2023高考季# 本来试着去网上查一下当年的高考成绩,无奈查询密码实在想不起来,只能作罢。 2009年,我参加了高考。在这场考试中,我经历了各种复杂的情绪,紧张、焦虑、兴奋和期待,犹如坐过山车一样刺激。 我每…

实验篇(7.2) 05. 通过浏览器访问远端内网服务器 (FortiClient-SSL) ❀ 远程访问

【简介】直接将内网服务器映射成公网IP,可以方便的从任何地方访问服务器的指定端口,但是这种方式下,服务器是公开且暴露的。那有没有即方便、又比较安全的远程访问服务器的方法呢?我们来看看SSL VPN的Web模式。 SSL VPN介绍 从概念…

Linux 高级IO

目录 传统艺能😎概念😍高级IO😂五种 IO 模型👌阻塞 IO🙌非阻塞 IO😍信号驱动IO😊多路转接IO😂 异步IO😘同步通信 VS 异步通信😁同步通信 VS 同步与互斥&#…

Java006——对第一个Java程序HelloWorld的简单认识

一、HelloWorld.java程序整体认识 public class HelloWorld { //创建一个名字叫HelloWorld的类(Java中的类叫class)public static void main(String[] args) {//主程序入口,类似C语言main函数System.out.println("He…

黑客第一步:从认识这些DOS命令开始

文章目录 一、DOS是个啥?二、如何启动DOS命令行?1. 同时按下键盘winR键,打开运行框2. 在运行框输入命令cmd,然后点击确定,即可进入DOS命令行 三、常用的DOS命令 一、DOS是个啥? DOS(Disk Opera…

《精通特征工程》学习笔记(5):数据(特征)降维

1.数据降维 通过自动数据收集和特征生成技术,可以快速获取大量特征,但不是所有特征都是有用的。数据降维就是在保留重要信息的同时消除那些“无信息量的信息”。 “无信息量”有多种定义方法,PCA 关注的是线性相关性,假设我们将…

正态(高斯)分布什么时候等于杨辉三角(二项式)展开

(ab)^10的杨辉三角展开项系数是1,10,45,120,200,252,200,120,45,10,1 这些系数11项的和等于1004,每项除以1004&#xff0c…

数据结构与算法之美 | 递归(Recursion)

什么叫做递归? 递归:去的过程叫“递”,回来的过程叫“归” 递归的三个条件 条件一:一个问题的解可以分解为几个子问题的解 条件二:这个问题与分解之后的子问题,除了数据规模不同,求解思路完全…

CnOpenData全国养老机构数据

一、数据简介 养老机构指为老年人提供集中居住和照料服务的机构,县级以上地方人民政府民政部门负责本行政区域内养老机构的指导、监督和管理。其他有关部门依照职责分工对养老机构实施监督。 与其他服务不同的是,养老服务是一种全人、全员、全程服务,养老…

路径之谜 2016年国赛 深度优先搜索

目录 解题思路 AC代码: 题目描述 小明冒充 XX 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向…

智能 CAN 总线/串口 RS-232485 协议转换器

能CAN/串口协议转换器LCNET Pro RS-232/485提供一路RS-485、一路RS-232和一路CAN通道,实现CAN与串口RS-485或RS-232之间的双向数据智能转换。每个通道独立隔离,每路通道采用金升阳电源模块和信号隔离芯片实现2500VDC电气隔离,电源输入防反设计…

NAT模式 LVS负载均衡群集部署

NAT模式 LVS负载均衡群集部署 一.部署共享存储(NFS服务器:192.168.80.102)1.关闭防火墙,查看是否有rpcbind和nfs-utils的包2.创建两个共享文件目录3.将共享路径及网段添加到/etc/exports中(设置为只可读)4.…

VulnHub项目:MONEYHEIST: CATCH US IF YOU CAN

靶机名称: MONEYHEIST: CATCH US IF YOU CAN 地址:MoneyHeist: Catch Us If You Can ~ VulnHub 这个系列是一部剧改编,还是挺好看的,大家有兴趣可以去看看! 废话不多说,直接上图开始! 渗透…

(单调栈) 496. 下一个更大元素 I——【Leetcode每日一题】

❓496. 下一个更大元素 I 难度:简单 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中 nums1 是 nums2 的子集。 对…