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

package MyGame.Example;

import com.google.flatbuffers.BaseVector;
import com.google.flatbuffers.BooleanVector;
import com.google.flatbuffers.ByteVector;
import com.google.flatbuffers.Constants;
import com.google.flatbuffers.DoubleVector;
import com.google.flatbuffers.FlatBufferBuilder;
import com.google.flatbuffers.FloatVector;
import com.google.flatbuffers.IntVector;
import com.google.flatbuffers.LongVector;
import com.google.flatbuffers.ShortVector;
import com.google.flatbuffers.StringVector;
import com.google.flatbuffers.Struct;
import com.google.flatbuffers.UnionVector;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class StructOfStructsT {
  private MyGame.Example.AbilityT a;
  private MyGame.Example.TestT b;
  private MyGame.Example.AbilityT c;

  public MyGame.Example.AbilityT getA() { return a; }

  public void setA(MyGame.Example.AbilityT a) { this.a = a; }

  public MyGame.Example.TestT getB() { return b; }

  public void setB(MyGame.Example.TestT b) { this.b = b; }

  public MyGame.Example.AbilityT getC() { return c; }

  public void setC(MyGame.Example.AbilityT c) { this.c = c; }


  public StructOfStructsT() {
    this.a = new MyGame.Example.AbilityT();
    this.b = new MyGame.Example.TestT();
    this.c = new MyGame.Example.AbilityT();
  }
}

