LayoutKind.Explicit FieldOffset structs getting wrecked at Instantiate()

Hi,

I have a structure defined like this(To be a Union):

using UnityEngine;StructLayout(LayoutKind.Explicit, Pack = 16)]
public struct CJI_ORDER_PARAM
{
		#region
		[FieldOffset(0)]
		public bool isOn;
		[FieldOffset(0)]
		public bool triggered;

		[FieldOffset(0)]
		public float fVal;
		[FieldOffset(0)]
		public float timeVal;

}

And a class that uses it thus:

public class AIOrderBase : MonoBehaviour
{
	public CJI_ORDER_PARAM param1;
}

And still another that does:

AIOrderBase gameAIOrderTemplate; // This is set to a valid value
			
AIOrderBase retVal  = Instantiate(gameAIOrderTemplate);

retVal.param1.fVal = 42.0f;  // Or any member...this crashes Unity hard

If I use a regular struct(no layout), it works fine. Anyone out there know why the Field offset version would hard crash Unity and sometimes require a restart of my machine?

No warning or complaints from the compiler or the runtime…just hard Unity-stopping crash. Clues?

Ah, it was because I had these in the structure at the same offset as some intrinsic types. Look at the comment for “other objects” at the bottom to see the offenders:

[StructLayout(LayoutKind.Explicit, Pack = 4)]
public struct CJI_ORDER_PARAM
{
  
		#region
		[FieldOffset(0)]
		public bool isOn;
		[FieldOffset(0)]
		public bool triggered;
	
		// Other objects OFFENDERS
		[FieldOffset(0)]
		public Transform target;
		[FieldOffset(0)]
		public AIAgentBase focusObj;
		[FieldOffset(0)]
		public AIAgentBase targetObj;

I put them at some other offset like this:

// Other objects
         [FieldOffset(16)]
         public Transform target;
         [FieldOffset(16)]
         public AIAgentBase focusObj;
         [FieldOffset(16)]
         public AIAgentBase targetObj;

And:

retVal.param1.isTriggered = true;

// OR
retVal.param1.fVal = 42.0f;
// OR
retVal.param1.focusObj = this;

…Works. It seems when they overlap that they will cause a crash even if just using retVal.param1.fVal only–when never touching the other members. Weird and my solution defeats the attempt at a true union Maybe GameObject thingees/pointers/refs cannot share space like this.It is scary that nothing catches it before or during runtime.