MENU閉じる

HEXA BLOG

プログラム

HEXA BLOGプログラム2018.3.8

真ラーメン作りとオマケ

こんにちは、前回のブログでラーメン職人になった「ふじひー」です。

では早速パワーアップしたラーメンです。
newラーメン

ノーマルとスペキュラーとラフネスが適当に付いたので、ちょっとリアルになった気がします。

がしかし、デファードレンダリングなので半透明を扱えず、ラーメンスープは何にもしてませ~ん。

-ラーメン終了-

と言う事で(?)「安易に真似しない方が良い、ゲーム開発にそんなに役に立たないプログラミング講座」します。

しかも第一弾(予定)です。

記念すべき第一弾の講座は、学生時代に作成した自作エンジンのC++ホットリロード機能を解説します。

ずばりホットリロードの実装は「LoadLibrary」でググれば、もう完成です。

もう教える事は無いのですが、簡単に自作エンジンでの実装を紹介します。

とりあえず表面上うまく動作している実装な可能性大ですので、真似する前によくググる事をお勧めします。

では、自作エンジン作ったUnityで言うスクリプトっぽい物を実装解説します。

まず前提
Engine.vcxproj:ホットリロードする側
Script.vcxproj:ホットリロードされる側

エンジンのプロジェクトで、エンジンから呼び出したい仮想メンバ関数を持った基底クラス(ScriptBase)を作成。
スクリプトのプロジェクトでも、同じくScriptBaseを作成。(同じヘッダファイルをプロジェクトに追加すればOK)

// Engine.vcxproj & Script.vcxproj

class ScriptBase
{
public:
	virtual ~ScriptBase() {}
	virtual void Update() {}
};

スクリプトのプロジェクトで、ScriptBaseを継承したクラス(今回はMawaruScript)を作成して、適当な処理をさせる。

// Script.vcxproj

class MawaruScript : public ScriptBase
{
public:
	void Update() override
	{
		printf("すっごく回っている処理");
	}
};

そのインスタンスをScriptBaseにキャストして返す関数(CreateScriptInstance)用意して、DLLで公開。

// Script.vcxproj

ScriptBase* __cdecl CreateScriptInstance(const char* className)
{
	// ごにょごにょして生成するクラスを判別
	if( std::string(className) == "MawaruScript" ) {
		return new MawaruScript();
	}
	return nullptr;
}

ビルドしてDLLを生成。

エンジンのプロジェクトでは、DLLを動的読み込みして、CreateScriptInstance関数からMawaruScriptのインスタンスを取得。

// Engine.vcxproj

typedef ScriptBase* (__cdecl *CreateScriptInstanceFunc)(const char*);
HMODULE										hDllModule;
CreateScriptInstanceFunc	pfnCreate;
ScriptBase*								pScript;
void HotReload()
{
	// DLLの動的読み込みと関数の取得
	hDllModule = LoadLibrary("Script.dll");
	pfnCreate = (CreateScriptInstanceFunc)GetProcAddress(hDllModule, "CreateScriptInstance");

	// 生成と更新と破棄
	pScript = pfnCreate("MawaruScript");
	(*pScript).Update();
	delete pScript;

	// 今回は読み込んだDLLはもう要らないのですぐ開放
	FreeLibrary(hDllModule);
}

MawaruScriptの処理を変更後、DLLを生成しなおして、エンジン側からHotReload関数を呼び出すと更新されているのが確認できる。
あとは煮るなり焼くなりヌルチェックするなりする。
-完-

次回はリフレクションもどきか、ヌル参照しても落ちないエンジンあたりを予定。

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE