- 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
![](https://koobas.hobune.stream/wayback/20220612231343im_/https://answers.unity.com/themes/thub/images/avi.jpg)
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