// automatically generated by the FlatBuffers compiler, do not modify

package MyGame.Example;

import java.nio.*;
import java.lang.*;
import java.util.*;
import com.google.flatbuffers.*;

public class ArrayStructT {
  private float a;
  private int[] b;
  private byte c;
  private MyGame.Example.NestedStructT[] d;
  private int e;
  private long[] f;

  public float getA() { return a; }

  public void setA(float a) { this.a = a; }

  public int[] getB() { return b; }

  public void setB(int[] b) { if (b != null && b.length == 15) this.b = b; }

  public byte getC() { return c; }

  public void setC(byte c) { this.c = c; }

  public MyGame.Example.NestedStructT[] getD() { return d; }

  public void setD(MyGame.Example.NestedStructT[] d) { if (d != null && d.length == 2) this.d = d; }

  public int getE() { return e; }

  public void setE(int e) { this.e = e; }

  public long[] getF() { return f; }

  public void setF(long[] f) { if (f != null && f.length == 2) this.f = f; }


  public ArrayStructT() {
    this.a = 0.0f;
    this.b = new int[15];
    this.c = 0;
    this.d = new MyGame.Example.NestedStructT[2];
    this.e = 0;
    this.f = new long[2];
  }
}

