前書き この記事は、2023のUnityアドカレの12/14の記事です。 今年は、完走賞に挑戦してみたいと思います。Qiita君ぬい欲しい! はじめに プログラミングにおける必須機能として、「関数呼び出し」というものがあるのは皆さまご存知でしょう。しかし、関数呼び出しにはコストがかかります。 なので、コンパイラによって関数の「呼び出し」を関数の中身に置き換えてしまう最適化を「インライン展開」といいます。 .NET Frameworkや.NET(CoreCLR)では、メソッドに[MethodImpl(MethodImplOptions.AggressiveInlining)]をつけることで、インライン展開されやすくなるらしいです。つけたからといって必ずインライン展開されるとは限らず、何らかの条件付きのようです。(条件についてははっきりしたことが分かっていないので、ソースも読んでみたいですね)
はじめに こんにちは、情熱開発部プログラム2課の安東です。 入社してから今月で丁度一年、業務では経験を積む機会がたくさんありましたが、その中で初めてマーシャリングというものを扱うことになりました。 しかし、Web上には入門向けの記事が多くなく、学ぶのに少し苦労しました。 そういう経緯もありましたので、今回はUnityでマーシャリングをしてC#とネイティブプラグイン間でやりとりできるよう入門向けに解説していきたいと思います。 前提 今回はUnityにおけるマーシャリングを扱います。 その中でも、C言語リンケージのBlittable型とそのポインタ・構造体のマーシャリングが行えるよう入門向けに解説していきます。 .NET Frameworkも同様にC#ですが動作環境が異なりますので、それらの差異に関しては別のサイトをご参考ください。 マーシャリングとは そもそも、マーシャリングという言葉を聞い
UnityでC++ライブラリを使用することがあったため、リンク先の記事で説明がなかった部分について深掘りしてみた。 C++ライブラリ(DLL)をUnity(C#)向けに作成して利用するシンプルな方法 C++なんもわからん状態から書いたので、あとで編集追記することになる予感。 参照コード 記事内のコードをファイル名だけ編集したもの。 #pragma once #ifdef DLLFORUNITY_EXPORTS # define EXPORT __declspec(dllexport) #else # define EXPORT __declspec(dllimport) #endif class ExportTest { public: int TestFunc(int a); }; extern "C" EXPORT ExportTest* createExportTest(); ext
こんにちは、エンジニアリングマネージャーの渡辺(@mochi_neko_7)です。 本記事では、Unity/C#からC/C++で作られたネイティブプラグインを呼び出す、いわゆるC# Bridgeなどを作成する際に知っておくべきこと、注意すべきことを紹介します。 ネイティブプラグインを自分で触っているとUnityをクラッシュさせてしまうことも多いと思いますが、通常のように分かりやすいログが出るわけではないため何が原因なのか分かりにくいことも多いのではないでしょうか? 最近はUnityはC#のIL2CPPビルドでパフォーマンスも改善されていますし、そこまでC/C++を触るケースが多くないのかネットにあまり情報も多くはない印象ですが、知らないとデバッグ自体しづらいことも多いです。 自分が雰囲気でコードを書いていたらすぐにUnityをクラッシュさせてしまったので、そのデバッグ過程で得られた理解を整
Unityで開発中に、Unity上で管理しているGPUリソース(Texture2D, GraphicsBuffer等)をCUDAで実装されたライブラリで高速に処理して、それをさらにUnityに戻して利用したい、みたいな場面が極々々々稀に存在します。 かなりニッチな需要だと感じたので、備忘録的な意味でも実際に存在した場面でどうやったのかを紹介できればと思います。 前提知識 C++を使用したNative Plugin周り 多少のCUDAの知識 環境 筆者側で動作確認できた環境なので、その他の環境でも動く可能性はあります(さすがにGPUはNVIDIA必須ですが) Windows 10以上 Unity2020.1以上 D3D11 Pascal世代以降のNVIDIA GPU CUDA 11.3 そもそもなぜCUDA? そもそもな話Unityは、Textureや、頂点データ等を含むGraphicsBu
はじめに 現在、 Unity + ネイティブプラグインで趣味開発をしています。 .NET でネイティブコードを使うには P/Invoke の記述が必要になります。 P/Invoke 定義は数個くらいの関数だったら手書きでも構わないのですが、数が多かったりネイティブ側のインターフェースが Fix されてなくて頻繁に変更が発生したりするとそれに追従するのも手間が大変になるわけです。構造体や列挙型の定義も面倒です。 こういった場合、 P/Invoke のコードを自動生成してくれるツールを使うのがよいです。今回試してみたツールが CppSharp SharpGenTools の 2 つになります。どちらも有名な .NET のプロダクトに採用されているのですが、 SharpGenTools については結局うまく使うことができなかったので CppSharp で進めています。 今回の記事では趣味開発で得
はじめに 前回C++プラグインの各種プラットフォームのテンプレートを作成した記事を書きました。 配列と構造体の連携方法を備忘録として残します。 ソースは前回作成したテンプレートを元にビルドしていきます。 C++コード ヘッダー #ifndef SOURCE_LIBRARY_HPP #define SOURCE_LIBRARY_HPP #ifdef _WINDOWS #define _CRT_SECURE_NO_WARNINGS #define DLL_EXPORT __declspec(dllexport) #endif #ifndef _WINDOWS #define DLL_EXPORT #endif struct SampleStruct { int a; float b; char c; }; extern "C" { DLL_EXPORT void intArray(int* p
なにが学べるの? Unity for Android の環境向けに、Android Studio を利用してスタティックライブラリを生成、使用するまでの方法を解説します。Android 向けにライブラリが公開されているものの、Unity 向けにまだ公開されていないような場合に、自身で Unity 向けにライブラリを使用するような場合に有用な知識です。 今回の知識を利用して、V8 エンジンを Android で動かしてみました。 環境 Windows 10 Pro (ver. 21H2) Android Studio 2021.2.1 Unity 2020.3.25f1 Architecture - ARM64 GitHub で公開 今回の記事で実装したものを GitHub にあげてあるので、実際に動くもので確認したい方は clone してお試しください。 Android Studio で空
なにが学べるの? 自分自身でC++の実装を行うことはあまりないと思いますが、例えば、Unity向けのDLLが提供されていないなどの場合、そのラッパーをC++で記述してDLLとの橋渡しを自分で実装するというケースはあるでしょう。この記事では、そうしたC++を作成しそれをUnity上で扱うためのTipsを紹介します。この記事を通して、どうやってDLLを作成するのか、どうやってそれを利用するのかの知識が得られます。そうした際の参考になれば幸いです。 環境 Windows 10 Pro (ver. 21H2) Visual Studio 2019 (ver. 16.11.13) Unity 2020.3.25f1 Architecture - x64 C++プロジェクトを作成する まずはVisual StudioでC++プロジェクトを作成しましょう。Visual Studio 2019を開き、以下
はじめに C++で作成したプラグインをUnityで利用する方法は調べると出てきますが、複数のプラットフォームでの対応の仕方がまとまっている記事がなかったので今回まとめたいと思い立ちました。 主要なプラットフォームのテンプレートを作成してみました。 こちらのテンプレートはC#側に計算結果や文字列を渡して表示するだけのサンプルになります。 主要なプラットフォーム 何が主要なのかと言うのは私の主観になってしまいますが、ソーシャルゲームアプリを開発する上では以下のプラットフォームが対応されれば十分だと考えています。 Windows MacOS iOS Android ビルド周りに関しては、Windows以外はMacでのやり方で書いていきます。 C++のプラグインがなぜ必要なのか? 普段の開発で自前で実装することは少ないと思いますが、必要になる理由は大きく以下の2つがあるかと思います。 1.処理速度
1. はじめに ご存知の通り、Unityはマルチプラットフォームアプリケーションを実現するための優れた方法の一つです。特に、Android / iOS向けのモバイルマルチプラットフォーム開発において高い効率を発揮することが知られています。しかし、高いパフォーマンスの求められる処理やバイナリデータの操作、あるいは歴史的経緯といった理由からC/C++製のネイティブプラグインが必要となる場面も少なくないのではないでしょうか。 そこで、本記事ではUnity層とC/C++層のソースコードを共通化しつつ、マルチプラットフォームでのビルドを実現するための導入方法について紹介していこうと思います。基本的に、筆者自身が実現するにあたって調べたことや実験したことなどのまとめですので、経験則に基づいた内容も多くなっております。突っ込みどころがありましたらぜひコメントいただけますと幸いです。 1.1. 本記事で説
基本的に、以下のページにある手順で進めればNative Plugin を作成できるのですが 解説が、VS2013ベースになっているので、Visuai Studio 2017で実施した場合に ハマッた部分を、忘れないうちにスクショ付きでまとめました。 部分的にしか解説してないので、全体は以下のページを参照してください。 qiita.com Visual Studio Community 2017 Unity 2017.3.0f3 Windows 10 Fall creator update でやりました。 DLLビルド用のVSプロジェクトの準備 既存のソリューションに、DLL作成用のプロジェクトを追加する場合はこんな感じでスタート 2018/8/17追記 VS2017 update 3 ではこの部分がまた変更になっています。 * Visual Studio 2017 Update 3 以降で
C++ から Unity の C# の API を呼べるようにするプラグイン兼ライブラリです。C++ スクリプト的に使いたい場合や、既存の C++ のライブラリと Unity のやりとりを簡単にできるようにすることを目的としています。 Mono の API を叩いて C# のアセンブリにアクセスすることで実現しています。 注意すべき点として、Mono を経由する処理は遅く、Unity の C# の API を呼ぶ処理は普通に C# で実行したのと同等の速度になります。 高速化を目的として C++ 化する場合、C# の関数を呼ぶ以外の純粋なスクリプトの処理内容が相応に重い場合でないとあまり効果はありません。 技術的な詳細に興味があればこちらもご参照ください。 http://i-saint.hatenablog.com/entry/2014/10/24/190807 MIT License:
概要 UnityといえばC#で開発するのが基本ですが、Native Pluginという機能を使えば、他の言語 (C++など) で書かれたコードを呼び出すことができます。 今回はじめてNative Pluginを作ってみたので、調べたことなどをメモしておきたいと思います。 C++のライブラリ (Eigenとlibigl) を用いてUnity上でメッシュのガウス曲率を可視化した例 背景と動機 普段はC++でコンピュータグラフィクス関連の研究をしています(プロダクトの開発は行なっていません)。私がC++を使う主な理由は 過去に自分で書いたコードを使いまわしたいから 優秀な数学演算のライブラリや高度なジオメトリ処理のライブラリを使えるから 高速化がしやすいから などです。一方でUnityを使うこともあります。私がUnityを使う際の主な理由は 優秀なリアルタイムレンダリングが予め用意されているから
C++で new し、C#側で一旦コピー、さらにC++で削除 hoge.h #pragma once #define DLL_UNITY extern "C" __declspec(dllexport) typedef unsigned char byte ; DLL_UNITY void loadData (byte** data, int* dataSize); DLL_UNITY void freeData (byte** data); hoge.cpp #include "hoge.h" void loadData(byte** data, int* dataSize) { int s = 10; byte* d = new byte[size]; // ... *data = d; *dataSize = s; } void freeData(byte** data) { del
Unity 5.2 からIL2CPP(C#のコードをC++に変換する)が使用できるようになりました(プレビューとして) やり方をココにメモしておきます。 設定方法 Preference(MacならばUnity > Preference、Windowsならば Edit > Preference)を開き、External Toolsを選択します。 AndroidSDKとJDKとNDK等々、設定していないパッケージを「Download」ボタンを押してダウンロード先へジャンプし、ダウンロードします。 圧縮ファイル(もしくはインストーラー)を解凍し、「Browse」ボタンで解凍したフォルダを選択します。 Editor > Project Settings > Playerでプレイヤー設定を開き、Android の Other Settings の Configuration の Scripting
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く