This page has been translated automatically.
Setting Up Development Environment
High-Level Systems
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
Double Precision Coordinates
Bounds-Related Classes
Controls-Related Classes
Core Library
Engine-Related Classes
GUI-Related Classes
Node-Related Classes
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
Rendering-Related Classes
Utility Classes
This version of documentation is OUTDATED! Please switch to the latest one.

Package Class

The Package class is a data provider for the internal FileSystem class. You can load all the resources via this class. This article describes the sample located in the <UnigineSDK>/source/csharp/samples/Api/Systems/Package/ directory.

In the C# API you can inherit from the Package class only once.

See also

  • An example can be found in the <UnigineSDK>/source/csharp/samples/Api/Systems/Package/ directory.
  • The C++ API Unigine::Package class and the Unigine::FileSystem class which have the same methods and behavior as in the C# API.

Package Class Usage Example

C# Side

To use the Unigine.Package class, you should create your own class and inherit it from the Unigine.Package class and override virtual methods.

Source code(C#)
using System;
using System.IO;
using File = System.IO.File;
using System.Runtime.InteropServices;
using Unigine;

class UnigineApp {
	 * Create a class and inherit if from Unigine.Package
	class MyPackage : Package {
		private FileStream file;
		// list of files
		public override int getNumFiles() {
			Log.warning("MyPackage.getNumFiles(): called\n");
			return 2;
		public override string getFileName(int num) {
			Log.warning("MyPackage.getFileName({0}): called\n",num);
			if(num == 0) return "data/package.cpp";
			if(num == 1) return "data/";
			return "";
		// select file
		public override int selectFile(string name,out int size) {
			Log.warning("MyPackage.selectFile(\"{0}\",): called\n",name);
			try {
				file = null;
				if(name == "data/package.cpp") file = File.OpenRead("my_data/package.cpp");
				if(name == "data/") file = File.OpenRead("my_data/");
			catch(Exception e) {
				Log.error("MyPackage.selectFile(): {0}\n",e.Message);
				size = 0;
				return 0;
			size = (int)file.Length;
			return 1;
		// read file
		public override int readFile(IntPtr data,int size) {
			Log.warning("MyPackage.readFile(,{0}): called\n",size);
			try {
				byte[] src = new byte[size];
				int ret = file.Read(src,0,size);
			catch(Exception e) {
				Log.error("MyPackage.readFile(): {0}\n",e.Message);
				return 0;
			return 1;
	static void Main(string[] args) {
		// initialize wrapper
		// create an instance of the MyPackage class and add it to the FileSystem.
		MyPackage package = new MyPackage();
		// initialize engine
		Engine engine = Engine.init(Engine.VERSION,args);
		// enter main loop
		// shutdown engine

The MyPackage class has overridden readFile(), selectFile(), getFileName() and getNumFiles() functions. The class operates with two files located in the my_data folder. In the Main() function we create an instance of the MyPackage class and add it to the FileSystem.

Unigine Script Side

In the UnigineScript package.cpp file:

Source code(UnigineScript)
int init() {
	log.message("Hello from My C# Package\n");
	return 1;


The following result will be shown:

In the console:

MyPackage.selectFile("data/package.cpp",): called
MyPackage.readFile(,866): called
MyPackage.selectFile("data/package.cpp",): called
MyPackage.readFile(,866): called
Loading "data/package.cpp" 4ms
MyPackage.selectFile("data/",): called
MyPackage.readFile(,62): called
Loading "data/" 0ms

Hello from My C# Package
Last update: 2017-07-03
Build: ()