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(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);
  1. 这里有对统一组件进行了两次扩展,比如Sequence,是因为它的扩展方法在多个扩展类里。
  2. 想知道某个ui组件需要对应哪个Dotween的扩展类,直接在C#调一下方法,然后进去看方法属于哪个类就知道了
  3. 这里有个未解决的bug,RectTransform继承了Transform
    DoScale属于 DG.Tweening.ShortcutExtensions
    DoAncchorPos属于 DG.Tweening.DOTweenModuleUI
    而RectTransform两个方法都用到了,但如果同时添加这两个扩展,会出现js执行异常(目前尚未解决,好像是js的代码没执行
  4. 而只添加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已经修复了这个问题只需在扩展列表里添加就好,不用在手动扩展

release https://github.com/Tencent/puerts/releases

顺便贴一个查看puerts的版本号的地方

https://github.com/Tencent/puerts/blob/master/unity/Assets/Puerts/Src/JsEnv.cs#L67

你可能感兴趣的:(Puerts v13之前的版本添加 Dotween扩展支持)