Coder Social home page Coder Social logo

saberboy / cocoscreator3dplayable Goto Github PK

View Code? Open in Web Editor NEW
24.0 3.0 14.0 4.8 MB

CocosCreator3D 试玩广告(Playable)制作解决方案,现在已经适配最新版本CocosCreator3D 3.4.1

License: MIT License

Makefile 0.01% Go 0.16% JavaScript 0.26% HTML 99.57%
cocos-creator3d javascript playable wasm webassembly

cocoscreator3dplayable's Introduction

CocosCreator3D PlayableAD

再次感谢该大佬的项目

README 说明

历史版本

制作原理

因为CocosCreator 从3d版本后就开始通过用SystemJS来加载所有的脚本资源,但是SystemJS加载脚本的方式是通过web请求方式(可能方法说得不对)来加载脚本,但是Playable广告制作的前提条件就是不允许通过网络请求来加载资源,所有有关的资源必须要在同一个Html文件里面,所以早期版本是通过魔改SystemJS来加载,但是经过多方面测试(很久很久的测试),发现一些很巧妙的方法,可以不魔改SystemJS就可行

CocosCreator3D 导出手机web项目后,里面很多系统有关的脚本都有以下特征,SystemJS注册的脚本,第一个数组里面是依赖项,代表依赖那些模块,会优先加载依赖模块

System.register(['dependency'], function (_export, _context) {
  var dep;
  return {
    setters: [function (_dep) {
      dep = _dep;
    }],
    execute: function () {
      _export({
        name: 'value'
      });
    }
  };
});

然后System.register方法的第一个参数可以传入string,这个我称之为别名,通常是js文件的名称加上对应路径,因为有很多相同文件名的js文件,这些会做一些对应处理,像下面这样,比如该js文件为PPS.js,可以修改如下:

System.register('./PPS.js'['./PPY.js'], function (_export, _context) {
  var dep;
  return {
    setters: [function (_dep) {
      dep = _dep;
    }],
    execute: function () {
      _export({
        name: 'value'
      });
    }
  };
});

以上表示PPS.js在加载的时候会优先加载PPY.js文件,然后再加载PPS.js, 下面是PPYjs文件,

System.register('./PPY.js'[], function (_export, _context) {
  var dep;
  return {
    setters: [function (_dep) {
      dep = _dep;
    }],
    execute: function () {
      _export({
        name: 'value'
      });
    }
  };
});

然后把PPY.js,PPS.js注入到Html文件中,类似如下

<script>
  System.register('./PPS.js'['./PPY.js'], function (_export, _context) {
  var dep;
  return {
    setters: [function (_dep) {
      dep = _dep;
    }],
    execute: function () {
      _export({
        name: 'value'
      });
    }
  };
});
</script>
<script>
   System.register('./PPY.js'[], function (_export, _context) {
  var dep;
  return {
    setters: [function (_dep) {
      dep = _dep;
    }],
    execute: function () {
      _export({
        name: 'value'
      });
    }
  };
});
</script>
<script>
   System.import('./PPS.js').catch(function (err) {
        console.error(err);
    })
</script>

(如果想正常运行示例,前提是注入SystemJS模块,否则无法正常运行)最下方的代码会成功执行

以上是简单的示例,该工程就是通过该方法做了大量对应处理,然后生成单个Html文件的

WASM加载文件处理

由于可能需要物理引擎模块,当然也可能会选择WASM模块,这种情况就需要魔改一丢丢引擎源码(打开“项目目录/build/web-mobile/cocos-js/instantiated-**.js”类似这个文件) 查找关键字段

WebAssembly.instantiate()

如图,你会发现该脚本里面使用了fetch方法,这是PlayableAD 不允许的,所以只能更改对应fetch方法,替换如下(路径地址来自WASM路径传入处理)

需要注意以下情况(很重要)其中标记的地方需要跟fetch中的一样,因为每次编译会改变对应变量命名

let url = "cocos-js/" + (e)
let wa = base64DecToArr(window.res[url])
WebAssembly.instantiate(wa, o).then((function (e) {
    var n = e.instance.exports;
    Object.assign(qJ, n),
        t()
}
), n) 

该段脚本获取传入的wasm资源的路径,所有的文本资源与二进制资源全部存在于window.res中

WASM路径传入处理

打开“项目目录/build/web-mobile/cocos-js/bullet.wasm-****.js”类似这个文件

System.register([],(function(e,t){"use strict";return{execute:function(){
  e("default",new URL("assets/bullet.wasm-c98527b6.wasm",t.meta.url).href)}
  }}));

替换‘new URL()’整个参数为’assets/bullet.wasm-c98527b6.wasm‘,很不错,wasm文件的名称在CocosCreator3D 3.4.1版本的名称在打包的时候应该不会改变(如果有修改,请替换为正确的文件名称) 如下:

System.register([],(function(e,t){"use strict";return{execute:function(){
    e("default","assets/bullet.wasm-c98527b6.wasm")
}}}));

必须要执行的操作

wasm加载处理 | WASM路径传入处理 该操作是必须的,因为用到了JavaScript fetch操作方法,只能强制修改引擎源码(如果没有使用wasm可以忽略)

cocoscreator3dplayable's People

Contributors

github-actions[bot] avatar glegoo avatar saberboy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

cocoscreator3dplayable's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.