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

SetAnimClass的需要传入参数是一个UClass,但是却必须要我传入UObject #547

Closed
ozbao opened this issue Aug 31, 2023 · 1 comment

Comments

@ozbao
Copy link

ozbao commented Aug 31, 2023

local ABP_Lin_Class = slua.loadClass("/Script/Engine.AnimBlueprint'/Game/Characters/Lin/ABP_Lin.ABP_Lin'")
self.RTGMesh.SetAnimClass(ABP_Lin_Class)

SetAnimClass是SkeletalMeshComponent中的BlueprintCallable函数,
	/** Set the anim instance class. Clears and re-initializes the anim instance with the new class and sets animation mode to 'AnimationBlueprint' */
UFUNCTION(BlueprintCallable, Category = "Components|SkeletalMesh", meta = (Keywords = "AnimBlueprint", DisplayName = "Set Anim Instance Class"))
virtual void SetAnimClass(class UClass* NewClass);

然后报错如下
Slua: Error: ...Project/Main/RunbaPet/Content/Lua/RunbaMainCharacter.lua:20: expect userdata UObject at 1, but got UClass, if you passed an UObject, maybe it's unreachable
...Project/Main/RunbaPet/Content/Lua/RunbaMainCharacter.lua:20: in function <...Project/Main/RunbaPet/Content/Lua/RunbaMainCharacter.lua:10>

如果我使用
local ABP_Lin_Class = slua.loadObject("/Script/Engine.AnimBlueprint'/Game/Characters/Lin/ABP_Lin.ABP_Lin'")
self.RTGMesh.SetAnimClass(ABP_Lin_Class)
那么引擎立刻崩溃

@ozbao ozbao changed the title SetAnimClass的需要传入参数是一个类,但是却必须要我传入UObject SetAnimClass的需要传入参数是一个UClass,但是却必须要我传入UObject Aug 31, 2023
@ozbao
Copy link
Author

ozbao commented Aug 31, 2023

在 Unreal Engine 的 Lua 脚本中,你在代码中看到的 self.RTGMesh:SetAnimClass(ABP_Lin_Class) 和 self.RTGMesh.SetAnimClass(ABP_Lin_Class) 这两种写法有不同的含义。

self.RTGMesh:SetAnimClass(ABP_Lin_Class):这种写法使用了 : 符号,表示这是一个方法调用。在 Unreal Engine 的 Lua 脚本中,当你使用 : 来调用一个方法时,Lua 会自动传递对象本身作为第一个参数(类似于 self 指针),这样方法就可以在内部访问对象的成员和方法。SetAnimClass 方法在这里会被调用,且会自动将 self.RTGMesh 作为第一个参数传递给方法。

self.RTGMesh.SetAnimClass(ABP_Lin_Class):这种写法使用了点 . 来调用方法。在这种情况下,你需要显式地将 self.RTGMesh 作为第一个参数传递给 SetAnimClass 方法,因为点 . 调用方法时不会自动传递对象本身。如果 SetAnimClass 方法期望的第一个参数是一个 UObject 类型(userdata),但你传递了一个 UClass 类型(ABP_Lin_Class),就会出现类型不匹配的错误。

根据你提供的错误信息来看,self.RTGMesh 应该是一个 UObject 实例,但在第二种写法中,你传递了一个 UClass 类型(ABP_Lin_Class)。这导致了类型不匹配的错误。

所以,正确的做法是使用第一种写法,也就是 self.RTGMesh:SetAnimClass(ABP_Lin_Class),这会正确地将 self.RTGMesh 作为第一个参数传递给 SetAnimClass 方法。

问了下chatGPT,才发现:和.符号问题,:会将自己当作第一个参数,不过c++方法没有第一个UObject函数,就很神奇。

@ozbao ozbao closed this as completed Aug 31, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant