国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄使用注入的方式為Unity編輯器實(shí)現(xiàn)擴(kuò)展能力

這篇具有很好參考價(jià)值的文章主要介紹了記錄使用注入的方式為Unity編輯器實(shí)現(xiàn)擴(kuò)展能力。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

使用場(chǎng)景

  1. 當(dāng)前項(xiàng)目編輯器中不方便存放或者提交擴(kuò)展代碼
  2. 相同的擴(kuò)展功能需要在多個(gè)項(xiàng)目(編輯器)中使用
  3. 項(xiàng)目開(kāi)發(fā)中,偶爾臨時(shí)需要使用一個(gè)功能,想隨時(shí)使用隨時(shí)卸載

設(shè)計(jì)思路

  1. 使用進(jìn)程注入,將一個(gè)c/c++ dll注入到當(dāng)前運(yùn)行的unity編輯器中
  2. 使用c/c++ dll調(diào)用mono的函數(shù)接口,比如mono_get_root_domain去獲取unity的domain動(dòng)態(tài)去加載想要加載的外部的擴(kuò)展c# dll
  3. 在擴(kuò)展c# dll中調(diào)用 EditorUtility.RequestScriptReload();來(lái)觸發(fā)unity編輯器的重新編譯,重載編輯器中的domain實(shí)現(xiàn)卸載外部c# dll的功能
  4. 在擴(kuò)展c# dll中綁定EditorApplication.update事件,用來(lái)處理主線程的操作,比如AssetDatabase.Refresh();
  5. 使用jsonrpc協(xié)議,用來(lái)調(diào)用c# dll中的部分封裝功能函數(shù),可以實(shí)現(xiàn)在unity編輯器直接展示擴(kuò)展窗口,或者將數(shù)據(jù)傳至其他編輯器進(jìn)行展示

初步實(shí)現(xiàn)

  1. 進(jìn)程注入c/c++ dll
//遠(yuǎn)程進(jìn)程插入dll bypid
bool DllInject::nsertDllToProcessByPid(DWORD Pid, const char* pDllName)
{
	// 提升權(quán)限
	//ImproveProcessPri();

	// 獲取要插入的進(jìn)程ID
	DWORD dwIDExplorer = Pid;
	if (dwIDExplorer == 0)
	{
		MEMBOX("Get Pro ID Error!\n");
		return false;
	}

	// 打開(kāi)進(jìn)程
	HANDLE hProcess = OpenProcess(/*PROCESS_ALL_ACCESS*/0x1F0FFF, FALSE, dwIDExplorer);
	if (hProcess == NULL)
	{
		MEMBOX("Open Process Error!\n");
		return false;
	}

	// 分配空間
	void* pDllPath = VirtualAllocEx(hProcess, 0, strlen(pDllName) + 1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (!pDllPath)
	{
		MEMBOX("pRemoteThread = NULL!\n");
		return false;
	}
	if (!WriteProcessMemory(hProcess, pDllPath, pDllName, strlen(pDllName) + 1, 0))
	{
		MEMBOX("WriteProcessMemory Fail!\n");
		return false;
	}



	//看有Game.exe 是否打開(kāi)   .   打開(kāi)了  GetProcAddress 是不準(zhǔn)的  

	/*
	   1. 檢測(cè)靜態(tài) 變量是否存儲(chǔ)
	   2.

	*/
	

	//卸載保護(hù)
	HMODULE h = GetModuleHandle("MessageHis.dat");
	if (h != NULL)
		FreeLibrary(h);


	PROC AdrMyDllDir = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");//(PROC)::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")),"LoadLibraryA");

	// 創(chuàng)建遠(yuǎn)程線程
	HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)AdrMyDllDir, pDllPath, 0, 0);
	if (!hThread)
	{
		MEMBOX("Remote thread faile.");
		//AfxMessageBox("遠(yuǎn)程線程創(chuàng)建失敗");
		return false;
	}
	WaitForSingleObject(hThread, INFINITE); //等待運(yùn)行完成
	CloseHandle(hThread);//這個(gè)CloseHandle是不會(huì)關(guān)掉遠(yuǎn)程線程的,TerminateThread能關(guān)掉
	VirtualFreeEx(hProcess, pDllPath, strlen(pDllName) + 1, MEM_RELEASE);
	CloseHandle(hProcess);
	MEMBOX("Remote Inject Dll Success");

	//AfxMessageBox("注入成功");
	return true;
}
  1. 調(diào)用mono接口加載c# dll
bool MonoInjecter::InjectMonoAssembly()
{
    //GetProcAddress
    /* grab the root domain */
   // domain = fnGetRootDomain();
   // fnThreadAttach(domain);

    log_trace("Hello %s %s", "fnGeDomainFriendlyName", fnGeDomainFriendlyName(domain));
    log_trace("Hello %s %s", "fnGetRootDir", fnGetRootDir());

    //----------------------------
    domain = fnGetDomainById(1);
    log_trace("Hello %s %ld", "fnGetRootDomain", domain);
    fnThreadAttach(domain);

    log_trace("Hello %s %s", "fnGeDomainFriendlyName", fnGeDomainFriendlyName(domain));
    log_trace("Hello %s %s", "fnGetRootDir", fnGetRootDir());
    //----------------------------

    /* open payload assembly */
    std::string assemblyDir;
    /* Grab our root directory*/
    assemblyDir.append(fnGetRootDir());
    assemblyDir.append(ASSEMBLY_PATH);
    assembly = fnAssemblyOpen(assemblyDir.c_str(), NULL);
    if (assembly == NULL) return false;
    log_trace("Hello %s %ld", "fnAssemblyOpen", assembly);
    image = fnAssemblyGetImage(assembly);
    if (image == NULL) return false;
    log_trace("Hello %s %ld", "fnAssemblyGetImage", image);
    klass = fnClassFromName(image, PAYLOAD_NAMESPACE, PAYLOAD_CLASS);
    if (klass == NULL) return false;
    log_trace("Hello %s %ld", "fnClassFromName", klass);
    /* grab the hack entrypoint */
    method = fnMethodFromName(klass, PAYLOAD_MAIN, 0);
    if (method == NULL) return false;
    log_trace("Hello %s %ld", "fnMethodFromName", method);
    /* call our entrypoint */
    fnRuntimeInvoke(method, NULL, NULL, NULL);
    log_trace("\nHello %s", "run mono dll!\n\n");

    return true;
}
  1. 簡(jiǎn)單實(shí)現(xiàn)一個(gè)編輯器工具用來(lái)查找當(dāng)前已經(jīng)打開(kāi)的unity編輯器進(jìn)程,然后進(jìn)行注入
    記錄使用注入的方式為Unity編輯器實(shí)現(xiàn)擴(kuò)展能力,unity,編輯器,游戲引擎,imgui
  2. 由注入的c# dll調(diào)用的測(cè)試輸出, 當(dāng)前編輯器中是沒(méi)有任何代碼的
    記錄使用注入的方式為Unity編輯器實(shí)現(xiàn)擴(kuò)展能力,unity,編輯器,游戲引擎,imgui

測(cè)試環(huán)境

  1. 操作系統(tǒng)系統(tǒng): windows 11 64位`, (不兼容32位)
  2. unity版本: 2021.3.15f1
  3. .NET6.0(第三方編輯器的實(shí)現(xiàn))

文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-556547.html

到了這里,關(guān)于記錄使用注入的方式為Unity編輯器實(shí)現(xiàn)擴(kuò)展能力的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity使用VS編輯器打開(kāi)項(xiàng)目失敗解決辦法

    Unity使用VS編輯器打開(kāi)項(xiàng)目失敗解決辦法

    具體表現(xiàn)為:項(xiàng)目文件.sln無(wú)法打開(kāi),打開(kāi)腳本文件后無(wú)法關(guān)聯(lián)到Unity編輯器 報(bào)錯(cuò)信息可能不同,參考出錯(cuò)表現(xiàn)即可 首先去清除有邏輯錯(cuò)誤的代碼,先注釋掉,不然后面可能會(huì)無(wú)法自動(dòng)生成解決方案 然后關(guān)閉Unity編輯器,找到項(xiàng)目文件夾,刪除我列出的文件 重新打開(kāi)Unity,重

    2024年02月16日
    瀏覽(28)
  • 從零開(kāi)始入門(mén)創(chuàng)作游戲——Unity編輯器的使用

    從零開(kāi)始入門(mén)創(chuàng)作游戲——Unity編輯器的使用

    還沒(méi)找到工作的我繼續(xù)瞎折騰中,上次搭建環(huán)境就花了我3天的時(shí)間 從零開(kāi)始入門(mén)創(chuàng)作游戲——Unity3d的環(huán)境搭建_默哀d的博客-CSDN博客 接下來(lái)是根據(jù)油土鱉的視頻學(xué)習(xí)創(chuàng)作的一個(gè)小恐龍?zhí)螒?,直接上手做一次學(xué)得更多 https://www.youtube.com/watch?v=UdM9DEys-rI 選擇2D核心模板就可

    2024年02月05日
    瀏覽(33)
  • uniapp 微信小程序 editor富文本編輯器 api 使用記錄

    uniapp 微信小程序 editor富文本編輯器 api 使用記錄

    這里記錄一下自己研究學(xué)習(xí)的結(jié)果 之前一直使用textarea 來(lái)進(jìn)行內(nèi)容的編輯。但是局限性還是太多,最近發(fā)現(xiàn)了editor。覺(jué)得很不錯(cuò) uniapp的官方說(shuō)明 https://uniapp.dcloud.io/component/editor.html 這里有個(gè)例子,看起來(lái)很棒。但是自己使用起來(lái)的時(shí)候, 怎么也沒(méi)有官方demo上面的工具欄 !

    2024年02月09日
    瀏覽(28)
  • Unity 編輯器-查找所有未被使用的Prefab

    Unity 編輯器-查找所有未被使用的Prefab

    需求 接到一個(gè)需求,將Res里所有特效相關(guān)的prefab檢查一下,沒(méi)有使用的移除。 分析 先拆解一下需求,如下 代碼 結(jié)果 結(jié)果如圖所示。每組元素第一個(gè)為查找的prefab,之后的是使用了該prefab的預(yù)設(shè)或配表。 如果一組元素只有一個(gè)對(duì)象,則這個(gè)prefab無(wú)引用。 頂部的按鈕為指定功

    2024年02月16日
    瀏覽(27)
  • unity 簡(jiǎn)單實(shí)現(xiàn)tilemap的保存和讀?。ㄒ员阌糜陉P(guān)卡編輯器)

    ? ? ? ? 最近在學(xué)習(xí)使用Tiledmap,用于制作地圖確實(shí)很方便快捷,但總不能一個(gè)關(guān)卡就做一個(gè)prefab?還是必須將其保存為文本文件才行啊,于是有了以下的嘗試:?? ? ? ? 先定義一個(gè)Tiledmap類(lèi),用于存儲(chǔ)單個(gè)Tiledmap信息 tiles是保存的所有tile塊。key為坐標(biāo)值,value為使用的tile

    2024年02月13日
    瀏覽(23)
  • Sprite Editor圖片編輯器的使用_unity基礎(chǔ)開(kāi)發(fā)教程

    Sprite Editor圖片編輯器的使用_unity基礎(chǔ)開(kāi)發(fā)教程

    SpriteEditor是Unity引擎中的一個(gè)工具,用于創(chuàng)建和編輯2D圖片。它提供了一系列功能,可以對(duì)圖片進(jìn)行剪裁、切割、翻轉(zhuǎn)、旋轉(zhuǎn)、調(diào)整大小等操作,以及設(shè)置圖片的碰撞檢測(cè)形狀和渲染模式。 SpriteEditor可以幫助開(kāi)發(fā)者將多張圖片合并成動(dòng)畫(huà)精靈,并為每一幀設(shè)置播放時(shí)間和循環(huán)

    2024年02月01日
    瀏覽(23)
  • unity 通過(guò) 二維數(shù)組序列化 實(shí)現(xiàn)二維數(shù)組在編輯器面板查看和配置數(shù)據(jù)

    unity 通過(guò) 二維數(shù)組序列化 實(shí)現(xiàn)二維數(shù)組在編輯器面板查看和配置數(shù)據(jù)

    實(shí)現(xiàn)思路如下: 1、定義一個(gè)二維數(shù)組數(shù)據(jù)類(lèi) 2、獎(jiǎng)數(shù)據(jù)類(lèi)標(biāo)記為 Serializable? 并實(shí)現(xiàn) unity內(nèi)置的? ISerializationCallbackReceiver接口,接口提供了序列化和反序列化方法,參見(jiàn)官方文檔(文檔中給出了字典的序列化方法):Unity - Scripting API: ISerializationCallbackReceiver 3、使用unity序列化

    2024年02月08日
    瀏覽(68)
  • 【Unity】AVPro使用踩坑,編輯器模式使用視頻播放正常,打包后視頻無(wú)法播放的問(wèn)題

    【Unity】AVPro使用踩坑,編輯器模式使用視頻播放正常,打包后視頻無(wú)法播放的問(wèn)題

    這個(gè)主要是AVPro的坑 一般使用會(huì)直接Browse給取文件路徑,然后面板上面就能看到視頻文件的名字,這個(gè)方法在編輯器模式下播放是可以獲取到文件的,所以沒(méi)問(wèn)題。 但是打包后路徑變化,拉取到的地址就不對(duì)了。 首先把視頻資源改存到StreamingAssets文件夾路徑下,然后路徑獲

    2024年02月16日
    瀏覽(164)
  • Unity編輯器擴(kuò)展 | 編輯器擴(kuò)展基礎(chǔ)入門(mén)

    Unity編輯器擴(kuò)展 | 編輯器擴(kuò)展基礎(chǔ)入門(mén)

    前言 當(dāng)談到游戲開(kāi)發(fā)工具,Unity編輯器是一個(gè)備受贊譽(yù)的平臺(tái)。它為開(kāi)發(fā)者提供了一個(gè)強(qiáng)大且靈活的環(huán)境,使他們能夠創(chuàng)建令人驚嘆的游戲和交互式體驗(yàn)。 然而,Unity編輯器本身也是可以擴(kuò)展和定制的,這為開(kāi)發(fā)者提供了進(jìn)一步提升工作流程和增強(qiáng)功能的機(jī)會(huì)。 在Unity 編輯器

    2024年02月10日
    瀏覽(88)
  • 【Unity編輯器擴(kuò)展】 | 編輯器擴(kuò)展入門(mén)基礎(chǔ)

    【Unity編輯器擴(kuò)展】 | 編輯器擴(kuò)展入門(mén)基礎(chǔ)

    前言 當(dāng)談到游戲開(kāi)發(fā)工具,Unity編輯器是一個(gè)備受贊譽(yù)的平臺(tái)。它為開(kāi)發(fā)者提供了一個(gè)強(qiáng)大且靈活的環(huán)境,使他們能夠創(chuàng)建令人驚嘆的游戲和交互式體驗(yàn)。 然而,Unity編輯器本身也是可以擴(kuò)展和定制的,這為開(kāi)發(fā)者提供了進(jìn)一步提升工作流程和增強(qiáng)功能的機(jī)會(huì)。 在Unity 編輯器

    2024年02月10日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包