jacksondunstan / UnityNativeScripting

Unity Scripting in C++
https://jacksondunstan.com/articles/3938
MIT License
1.34k stars 135 forks source link

problem with calling typed method with arguments #61

Open merlin1277 opened 4 years ago

merlin1277 commented 4 years ago

Hello,

Generate bindings breaks when trying to generate the binding for a "method<>(args)", it works well with "method<>()".

{
                "Name": "UnityEngine.Object",
                "Methods": [
                    {
                        "Name": "Instantiate",
                        "ParamTypes": [
                            "UnityEngine.Object"
                        ],
                        "GenericParams": [
                            {
                                "Types": [
                                 "UnityEngine.Component"

                                ]
                            },
                            {
                                "Types": [
                                    "UnityEngine.GameObject"
                                ]
                            },
                            {
                                "Types": [
                                    "UnityEngine.MeshRenderer"
                                ]
                            },
                            {
                                "Types": [
                                    "UnityEngine.ParticleSystem"
                                ]
                            },
                            {
                                "Types": [
                                    "UnityEngine.Light"
                                ]
                            },
                            {
                                "Types": [
                                    "UnityEngine.AudioSource"
                                ]
                            },
                            {
                                "Types": [
                                    "UnityEngine.TextMesh"
                                ]
                            }
                        ]
                    }
                ]
            }

it doesnt find a matching method . the c# method is public static T Instantiate<>(T original) where T : Object; , on the UnityEngine.Object type;

Thank you for helping ,

Regards,

Merlin

jacksondunstan commented 4 years ago

It looks like the code generator isn't finding the method because it's generic so it's types are T instead of Object. I'd happily accept a PR with a fix.

majorika commented 3 years ago

simple workaround : Set ParamTypes to ["UnityEngine.T"], however UnityEngine.T does not seem appropriate.

I found a new problem with Instantiate. ex)

GameObject a = GameObject::CreatePrimitive(PrimitiveType::Sphere);
a.AddComponent<MyGame::BaseBallScript>();
GameObject b = UnityEngine::Object::Instantiate<UnityEngine::GameObject>(a);

b instantiated with a BaseBallScript, but b's BaseBallScript.transform.GetInstanceID() will be return a's InstanceID. a will move 2x faster, b doesn't move.

root cause : a's CppHandle value also copied to b's when using Instantiate method. It's ok while calling base constructor, but between base constructor to Awake, CppHandle value overwritten to original's.