Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Unity] Bug: JS派生C#类后,super 访问异常 #1784

Open
3 tasks done
Geequlim opened this issue Jul 10, 2024 · 1 comment
Open
3 tasks done

[Unity] Bug: JS派生C#类后,super 访问异常 #1784

Geequlim opened this issue Jul 10, 2024 · 1 comment
Assignees
Labels
bug Something isn't working Unity

Comments

@Geequlim
Copy link
Contributor

前置阅读 | Pre-reading

Puer的版本 | Puer Version

2.0.5

Unity的版本 | Unity Version

2022.3.17

发生在哪个平台 | Platform

Editor(win)

错误信息 | Error Message

使用案例:通过TS 重写FariyGUI的GLoader实现加载并展示远程图像

通过为C# GLoader 的 url 属性赋值时调用 LoadExternal 方法,里面调用了JS的实现。JS的实现中访问
super.url 在编辑器中报错url的setter调用没有目标对象,发布程序后能够正常工作。

报错信息

Error: c# exception:Non-static method requires a target.,stack:  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00019] in <e3b07672ffbd43c1838e1ebbe94cbdf5>:0 
  at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in <e3b07672ffbd43c1838e1ebbe94cbdf5>:0 
  at Puerts.OverloadReflectionWrap.Invoke (Puerts.JSCallInfo jsCallInfo) [0x00083] in ./tiny_modules/puerts@2.0.5/Runtime/Src/Default/Wrapper/ReflectionWrap.cs:319 
  at Puerts.MethodReflectionWrap.Invoke (System.IntPtr isolate, System.IntPtr info, System.IntPtr self, System.Int32 argumentsLen) [0x00070] in ./tiny_modules/puerts@2.0.5/Runtime/Src/Default/Wrapper/ReflectionWrap.cs:404 
    at TinyFairyGUIGLoader.loadExternal (/home/geequlim/Documents/work/super-playground/project/Build/scripts/webpack:///src/framework/unity/tiny/game/modules/fairygui/index.ts:310:42)
    at TinyFairyGUIGLoader.__loadExternal (/home/geequlim/Documents/work/super-playground/project/Build/scripts/webpack:///src/framework/unity/tiny/game/modules/fairygui/index.ts:296:36)
    at LotteryDetailWindow.view.m_list.itemRenderer (/home/geequlim/Documents/work/super-playground/project/Build/scripts/webpack:///src/game/main-game/lottery/LotteryDetail.window.ts:51:18)
    at LotteryDetailWindow.<anonymous> (/home/geequlim/Documents/work/super-playground/project/Build/scripts/webpack:///src/game/main-game/lottery/LotteryDetail.window.ts:92:20)
    at Generator.next (<anonymous>)
    at fulfilled (/home/geequlim/Documents/work/super-playground/project/Build/scripts/bundle.js:22100:24),stack:  at Puerts.GenericDelegate.Action () [0x00032] in ./tiny_modules/puerts@2.0.5/Runtime/Src/Default/JSType/GenericDelegate.cs:432 
  at FairyGUI.GLoader.LoadExternal () [0x0000f] in /home/geequlim/Documents/work/super-playground/project/Assets/Plugins/FairyGUI/Scripts/UI/GLoader.cs:490 
  at FairyGUI.GLoader.LoadContent () [0x0003c] in /home/geequlim/Documents/work/super-playground/project/Assets/Plugins/FairyGUI/Scripts/UI/GLoader.cs:405 
  at FairyGUI.GLoader.set_url (System.String value) [0x00021] in /home/geequlim/Documents/work/super-playground/project/Assets/Plugins/FairyGUI/Scripts/UI/GLoader.cs:97 
  at FairyGUI.GLoader.set_icon (System.String value) [0x00001] in /home/geequlim/Documents/work/super-playground/project/Assets/Plugins/FairyGUI/Scripts/UI/GLoader.cs:105 
  at FairyGUI.GLabel.set_icon (System.String value) [0x0000e] in /home/geequlim/Documents/work/super-playground/project/Assets/Plugins/FairyGUI/Scripts/UI/GLabel.cs:34 
  at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0006a] in <e3b07672ffbd43c1838e1ebbe94cbdf5>:0 

问题重现 | Bug reproduce

FairyGUI.GLoade C#关键代码
namespace FairyGUI {
    public class GLoader : GObject, IAnimationGear, IColorGear {

#if FAIRYGUI_PUERTS
        public Action __loadExternal;
        public Action<NTexture> __freeExternal;
#endif

        public string url {
            get { return _url; }
            set {
                if (_url == value) return;

                ClearContent();
                _url = value;
                LoadContent();
                UpdateGear(7);
            }
        }

        protected void LoadContent() {
            ClearContent();

            if (string.IsNullOrEmpty(_url))
                return;

            if (_url.StartsWith(UIPackage.URL_PREFIX))
                LoadFromPackage(_url);
            else
                LoadExternal();
        }

        virtual protected void LoadExternal()
        {
#if FAIRYGUI_PUERTS
            if (__loadExternal != null)
            {
                __loadExternal();
                return;
            }
#endif
            Texture2D tex = (Texture2D)Resources.Load(_url, typeof(Texture2D));
            if (tex != null)
                onExternalLoadSuccess(new NTexture(tex));
            else
                onExternalLoadFailed();
        }

    }
}
TypeScript关键代码
export class TinyFairyGUIGLoader extends FairyGUI.GLoader {

	static getOverrideURL(url: string): string { return url; }

	constructor() {
		super();
		this.__freeExternal = this.freeExternal.bind(this);
		this.__loadExternal = this.loadExternal.bind(super);
	}

	public get url(): string { return this.$url || this.$internalURL; }
	public set url(value: string) {
		this.$url = value;
		super.url = this.$internalURL = TinyFairyGUIGLoader.getOverrideURL(this.url);
	}
	private $internalURL: string;
	private $url: string;

	protected loadExternal() {
		const url = super.url; // <<< 编辑器中这里报错
		// TODO: 这里忽略具体加载逻辑
	}
}
@Geequlim Geequlim added bug Something isn't working Unity labels Jul 10, 2024
Geequlim added a commit to Geequlim/FairyGUI-unity that referenced this issue Jul 11, 2024
1. 增加设置组件内容的功能
2. puerts 新增 __setUrl 回调,用于将C#通过 icon/Label.icon 等情况设置的 url 同步到脚本层 用于修正 Tencent/puerts#1784
3. _useResize 逻辑优化,兼容旧版本的fairygui导出的二进制产物(仅GLoader内装组件生效)
@chexiongsheng
Copy link
Collaborator

chexiongsheng commented Jul 19, 2024

首先我一向不建议ts继承c#。
其次即使我按你说的“JS派生C#类后”,super 访问并无异常。
应该你工程还有别的什么导致了问题。我从你的描述没法重现,或者你可以提供个干净的demo。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working Unity
Projects
None yet
Development

No branches or pull requests

2 participants