# ネイティブプラグイン

> Details on using native plug-ins.

Unity はネイティブプラグインをサポートしています。ネイティブプラグインは、C、C++、Objective-C などの言語で記述できるネイティブコードのライブラリです。プラグインを使用すると、C# で記述するコードでこれらのライブラリから関数を呼び出すことができます。Unity とミドルウェアライブラリや既存の C/C++ コードをこの機能で統合できます。

ネイティブのプラグインは、C# スクリプトが他のユーザースクリプトにアクセスする簡単な C インターフェースを提供します。また、ある低レベルのレンダリングイベントが発生したとき (例えば、グラフィックススデバイスを作成したときなど) に、ネイティブプラグインによってエクスポートされた関数を呼び出すことも可能です。詳細は、[低レベルのネイティブプラグインインターフェース](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native-plugin-interface.md) を参照してください。

ネイティブプラグインの例については、[Native Renderer Plugin](https://github.com/Unity-Technologies/NativeRenderingPlugin) を参照してください。

## ネイティブプラグインの使い方

ネイティブプラグインを使用するには、以下を行います。

1. 必要な機能にアクセスするための関数を C 言語で記述します。
2. 関数をライブラリにコンパイルします。
3. Unity で、ネイティブライブラリの関数を呼び出す C# スクリプトを作成します。

ネイティブプラグインは、ターゲットプラットフォームのネイティブコードのコンパイラーでビルドされます。プラグイン関数は C 言語の呼び出しインターフェースを使用するため、名前マングリングの問題を避けるために、C リンケージで関数を宣言する必要があります。

## 例

1 つの機能を持つ非常に簡単なネイティブライブラリに、以下のようなコードがあるとします。

`float ExamplePluginFunction () { return 5.0F; }`

このコードに Unity 内からアクセスするには、以下の C# スクリプトを使用します。

```lang-C#
using UnityEngine;
using System.Runtime.InteropServices;

class ExampleScript : MonoBehaviour {
	#if UNITY_IPHONE
	// On iOS plugins are statically linked into
	// the executable, so we have to use __Internal as the
	// library name.
	[DllImport ("__Internal")]
	#else
	// Other platforms load plugins dynamically, so pass the
	// name of the plugin's dynamic library.
	[DllImport ("PluginName")]   
	#endif
	private static extern float ExamplePluginFunction ();

    void Awake () {
		// Calls the ExamplePluginFunction inside the plugin
		// And prints 5 to the console
		print (ExamplePluginFunction ());
       }
    }
```

## 追加リソース

* [低レベルのネイティブプラグインインターフェース](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native-plugin-interface.md)
* [Mono Interop with native libraries](https://www.mono-project.com/docs/advanced/pinvoke/)
* [MSDN の P-invoke に関するドキュメント](https://docs.microsoft.com/en-us/dotnet/framework/interop/marshaling-data-with-platform-invoke?redirectedfrom=MSDN)
