If you do the following
[BepInAutoPlugin]
public partial class TestPluginPlugin : BasePlugin
{
public override void Load()
{
ClassInjector.RegisterTypeInIl2Cpp<MyBehaviour>();
ClassInjector.RegisterTypeInIl2Cpp<MyTestObj>();
MyBehaviour myBehaviour = new GameObject().AddComponent(Il2CppType.Of<MyBehaviour>()).Cast<MyBehaviour>();
MyTestObj myTestObj = new GameObject().AddComponent(Il2CppType.Of<MyTestObj>()).Cast<MyTestObj>();
myTestObj.myBehaviour.Value = myBehaviour;
MyTestObj myNewTest = Object.Instantiate(myTestObj).Cast<MyTestObj>();
Log.LogMessage("myNewTest.myBehaviour.mySpriteRenderer: " + myNewTest.myBehaviour.Value);
}
}
public class MyBehaviour : MonoBehaviour
{
public MyBehaviour(IntPtr ptr) : base(ptr) { }
public Il2CppReferenceField<GameObject> mySpriteRenderer;
}
public class MyTestObj : MonoBehaviour
{
public MyTestObj(IntPtr ptr) : base(ptr) { }
public Il2CppReferenceField<MyBehaviour > myBehaviour;
}
The game will crash once you call Object.Instantiate(myTestObj)
Though, if you switch the return type to be something more generic i.e MonoBehaviour in myBehaviour, it works fine
If you do the following
The game will crash once you call Object.Instantiate(myTestObj)
Though, if you switch the return type to be something more generic i.e MonoBehaviour in myBehaviour, it works fine