- Home /
 
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?
Answer by clancy1066 · Apr 14, 2020 at 12:45 AM
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.
Your answer
 
             Follow this Question
Related Questions
GUIText transition trouble 1 Answer
There is a generation lag 1 Answer
Projectile not firing 2 Answers
My prefab isn't getting destroyed 1 Answer
Instantiate not working? 0 Answers