HuldaGnodim 发表于 2022-1-12 13:20

Puerts v13之前的版本添加 Dotween扩展支持

Dotween扩展在Ts里不生效,甚至报错方法undefined

平常在unity里使用Dotween,习惯通过代码编写一些小动画,dotween的扩展用起来也很舒服 transform.DoScale这些用起来很方便也易读。

而在ts里使用这些扩展就遇到了问题,在ts 的Configure里添加Dotween之后,在ts里也可以调用dotween代码,像 doFade、doScale还有Sequence.Insert等等都可以在编写Typescirpt脚本里使用,但在编译为js在unity里运行时,就会出现无效或者直接异常方法undefine的情况。
造成这种情况的一部分原因是,有相同的声明方法覆盖了正确的方法,导致指向的方法不对。
解决

在低版本的puerts中要正常使用需要 扩展函数$extension()
官方链接:https://github.com/Tencent/puerts/blob/master/doc/unity/manual.md
namespace PuertsTest{    public class BaseClass    {    }    public static class BaseClassExtension    {      public static T Extension1<T>(this T a) where T : BaseClass      {            Debug.Log(string.Format("Extension1<{0}>", typeof(T)));            return a;      }    }}import {PuertsTest} from 'csharp'import {$extension} from 'puerts'$extension(PuertsTest.BaseClass, PuertsTest.BaseClassExtension);let obj = new PuertsTest.BaseClass();obj.Extension1();
所以在项目初始化的脚本里添加
$extension(UnityEngine.Component, DG.Tweening.ShortcutExtensions);$extension(UnityEngine.Transform, DG.Tweening.ShortcutExtensions);$extension(UnityEngine.RectTransform, DG.Tweening.ShortcutExtensions); // DoScale// $extension(UnityEngine.RectTransform, DG.Tweening.DOTweenModuleUI); // DoAnchorPos$extension(DG.Tweening.Tweener, DG.Tweening.TweenExtensions);$extension(DG.Tweening.Tweener, DG.Tweening.TweenSettingsExtensions);$extension(DG.Tweening.Sequence, DG.Tweening.TweenExtensions);$extension(DG.Tweening.Sequence, DG.Tweening.TweenSettingsExtensions);$extension(UnityEngine.UI.Image, DG.Tweening.DOTweenModuleUI);$extension(UnityEngine.UI.Text, DG.Tweening.DOTweenModuleUI);$extension(TMPro.TextMeshProUGUI, DG.Tweening.DOTweenModuleUI);$extension(UnityEngine.CanvasGroup, DG.Tweening.DOTweenModuleUI);这里有对统一组件进行了两次扩展,比如Sequence,是因为它的扩展方法在多个扩展类里。想知道某个ui组件需要对应哪个Dotween的扩展类,直接在C#调一下方法,然后进去看方法属于哪个类就知道了
[*]这里有个未解决的bug,RectTransform继承了Transform
DoScale属于 DG.Tweening.ShortcutExtensions
DoAncchorPos属于 DG.Tweening.DOTweenModuleUI
而RectTransform两个方法都用到了,但如果同时添加这两个扩展,会出现js执行异常(目前尚未解决,好像是js的代码没执行)而只添加DG.Tweening.DOTweenModuleUI,RectTransform.DoScale不会执行,会有警告。但同时使用 DoScaleX 和 DoScaleY可以绕过这个问题而且能正常执行。
不扩展是用Dotween的方式

通过命名空间和扩展类直接调用方法
比如DoFade 在DG.Tweening.DOTweenModuleUI里
DG.Tweening.DOTweenModuleUI.DoFade(this.image,1,1)
同理 sequence
DG.Tweening.TweenSettingsExtensions.Insert(this.seq,0,Tween)升级Puerts至最新版本 在v12还是v13已经修复了这个问题只需在扩展列表里添加就好,不用在手动扩展

releasehttps://github.com/Tencent/puerts/releases
顺便贴一个查看puerts的版本号的地方

https://github.com/Tencent/puerts/blob/master/unity/Assets/Puerts/Src/JsEnv.cs#L67
页: [1]
查看完整版本: Puerts v13之前的版本添加 Dotween扩展支持