當前位置:首頁 » 編程軟體 » u3d編譯出包難嗎

u3d編譯出包難嗎

發布時間: 2022-09-03 15:23:40

A. u3d工程中不卡 build出包後很卡怎麼辦

發布一個開發者模式看看。

B. microsoft jscript 800a03eb編譯錯誤 u3d腳本不能編輯 怎麼解

1、運行→regedit→進入注冊表, 在→
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks
這個位置有一個正常的鍵值{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 將其他的刪除。
2、打開CMD窗口輸入如下命令:
for %i in (%windir%\system32\*.dll) do regsvr32.exe /s %i 回車
for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %i 回車
兩條分別運行完成後重啟機器。
如果以上方法無法解決只能使用最後一招:
完全注冊dll:打開「運行」輸入→cmd→回車
然後把下面這行字元復制到黑色cmd框裡面去回車等待dll文件全部注冊完成就關閉可以了,為防止輸入錯誤可以復制這條指令,然後在命令提示符後擊滑鼠右鍵→粘貼→回車,耐心等待,直到屏幕滾動停止。
(下面是要運行的代碼):
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
完成後重新啟動機器。

C. android sdk明明安裝了,為什麼u3d生成apk還是顯示沒有安裝

可能是您沒有吧sdk配置到IDE的編譯環境造成的,不知道您用的是AndroidStudio還是EclipseADT開發。我以前用的是EclipseADT,現在用的是AS環境,配置SDK路徑是這樣的,希望能幫到您,如有還有任何疑問可以繼續追問。

D. unity3d 可以給APK簽名嗎

可以。
出apk包,要想在各大平台上上線,必然要經過簽名,當然unity已經有這個功能了
第一,使用正版(免費版也可以),不要使用破解版,雖然這個也可以,但是為了安全起見,還是不要用破解版,也是為了尊重別人的勞動
第二,build的時候選擇android平台,點擊playersettings,在inspector面板上有一個publishing settings,這里就可以進行配置簽名相關的操作。a、Create New Keystore;b、點擊Browse Keystore選擇一個保存的位置;c、Keystore password上輸入密碼;Confirm password再輸入一次密碼;d、在Alias選擇Create New Alias,會打開一個面板,輸入對應的信息後保存退出,輸入密碼。至此簽名配置完成
第三,出包,簽名自動進行

E. unity3D用什麼語言開發好

很有意思的問題.

來看看網路大拿們所做的總結.

當然結果需要您自行考慮.


首先,下文摘錄自InfoQ<JSORC#不存在的腳本之爭>


到底C#和Unity3D里的JS誰好呢?

最常見的問題無非是:用js寫的u3d游戲和用c#寫的u3d游戲,到底誰的運行效率高啊?

最常見的回答為非是:肯定是C#啊,因為js是動態的。肯定不如編譯的語言好。

第二常見的問題無非是:用js開發和用c#開發,哪個更快更適合我啊?

第二常見的回答無非是:js適合個人開發,敏捷快速。c#適合公司開發,規范嚴謹。

咱們還是用和剛才討論與javascript的區別時一樣的思路來整理C#和UnityScript的不同,也就是按照先本質,再表現的順序。同時兼顧回答一下上面的兩個問題。

本質求同存異

開篇就說了,UnityScript是和C#同一個層面的語言,也需要經歷從源代碼到CIL中間語言過渡,最終到編譯成原生語言的過程。所以本質上,最終運行的都是從CIL編譯而來的原生機器語言。但的確會有C#比較快的現象,那麼問題出在哪呢?

一個可能但不是唯一的答案就是UnityScript和C#生成CIL中間語言不同。

這一點想想也很簡單,就像上文提到的var的問題,如果使用Object來處理var的問題,則不可避免的是頻繁的裝箱拆箱的操作,這對效率的影響是很大的。

所以的確,C#的速度更快,但原因是UnityScript會涉及到頻繁的裝箱拆箱操作,進而生成的CIL代碼與C#有差異,而並非UnityScript是動態語言且沒有經過編譯。

現實很單純

開發到底是使用C#還是UnityScript呢?如果不考慮運行的效率,僅僅考慮開發時候的感受,小匹夫就談談自己的看法好啦——那就是珍惜時間,遠離UnityScript。

首先有幾個事實我們要清楚:

UnityScript是脫胎於.NET平台的第三方語言Boo的。所謂的第三方語言和C#的區別,就跟自己到底是不是親生的,爹到底是不是隔壁老王是一樣的。差距可能是全方位,立體式的。社區支持,代碼維護,甚至是編譯出來的CIL代碼質量都可能有很大的差距。選擇UnityScript之前,問問自己之前聽說過Boo嗎?別忘了UnityScript和Boo的淵源。

UnityScript和JavaScript除了長得像之外,根本就沒有什麼關系。你在JavaScript里如魚得水,在UnityScript中如果不小心就可能埋下隱患,而一些隱患可能藏得很深。而且UnityScript也是靜態語言,也需要編譯,所以看不出來選擇它作為開發語言為什麼會有人覺得快。

插件的支持。貌似大多數都是C#寫的吧。

好吧,如果上面的3點都不能說動你,那就看看官方的態度好了。

U3D官方團隊基於數據分析做出的一個語言被使用的百分比圖。

由於Boo語言的使用量基本可以忽略,所以從Unity5.0版本開始就會停止對Boo的文檔支持。同時消失的還有從菜單創建Boo腳本的選項「CreateBooScript」。從U3D團隊對Boo的態度,也可以窺見和Boo聯系密切的UnityScript未來的走勢。

同時U3D團隊也會把支持的重心轉移到C#,也就是說文檔和示例以及社區支持的重心都在C#,C#的文檔會是最完善的,C#的代碼實例會是最詳細的,社區內用C#討論的人數會是最多的。


感謝INFOQ提供的原文支持.

F. u3d debug.log怎麼用

debug.log用來日誌輸出,方便用來做一些簡單的調試(比如下面的例子),當然面對更加精確且復雜的調試,我們肯定使用mono的debug或者vs的debug。

int a = 10;
int b = 20;
int result = 0;
start(){
result = a + b;
debug.log(result);
}
這樣就能在unity的控制台上看到result的結果:30

G. 請問U3D這個錯誤什麼意思Unity3d

只是一個警告,提示無法載入原有的遮罩剔除信息,要使用的話需要重新烘焙
遮罩剔除隻影響性能,不影響實際使用;
第二張圖提示有編譯錯誤,你需要查看紅色的報錯信息,黃色的警告可以無視;

H. U3D如何做代碼混淆

Unity代碼混淆方案
內容提要:Unity引擎下的代碼保護,由於Unity引擎的一些特殊性,實行起來較為復雜,在國內外業界並沒有現成的方案。筆者通過在《QQ樂團》項目上的實際嘗試,得出了一種具體可行,能夠有效保護代碼邏輯的方案。特此分享給關注Unity引擎的項目,希望能提供一些的參考。
背景
Unity引擎上的程序執行在Mono運行時上,使用Mono編譯出的程序集格式與.NET標准一致。C#是Unity引擎下主要的開發語言,它具備不少高級語言特性,如反射、元數據、內置序列化等。但C#同時也是很容易被反編譯的語言,如果不採用任何保護措施,使用常用的工具(.NET Reflector)便能很容易得到可二次編譯的代碼。對項目運營帶來了比較大的風險。
.NET平台下通常的保護手段是混淆編譯出的程序集。VisualStudio自帶了一個混淆工具Dotfuscator可以對程序集進行混淆。功能包括名稱修改,流程混淆,字元串加密等。經過Dotfuscator混淆後的程序集,能夠避免被常用反編譯工具破解。變數的表意性被破壞,同時函數的內部流程也被混淆(如下[B1] )。能有效起到保護源代碼的效果。
publicclass181: 218
{
// Fields
publicuint0;
publicushort1;
publicstaticreadonlyuint2;
publicstaticreadonlyuint3;
// Methods
static181();
public181();
public95.02();
public95.02(ref515A_0, uintA_1);
public95.02(79A_0, refuintA_1);
public95.02(ref79A_0, uintA_1);
public95.02(byte[] A_0, intA_1, refuintA_2);
public95.02(ref481A_0, intA_1, charA_2);
public95.02(refstringA_0, intA_1, charA_2);
public95.02(refbyte[] A_0, intA_1, refintA_2, uintA_3);
public95.03(ref79A_0, uintA_1);
public95.03(refbyte[] A_0, intA_1, refintA_2, uintA_3);
public95.04(refbyte[] A_0, intA_1, refintA_2, uintA_3);
}
public95.00(refsbyteA_0, intA_1)
{
// This item is obfuscated and can not be translated.
goto Label_0006;
if(1!= 0)
{
}
95.0local= 95.0.0;
bytenum= 0;
local = this.0(refnum,A_1);
A_0 = (sbyte) num;
returnlocal;
Unity引擎下,Mono編譯出的程序集,由於採用與.NET相同的格式標准。能夠直接被Dotfuscator混淆。但Unity引擎有一些特殊的地方,使混淆工作與一般的.NET程序存在差異。第三節將主要討論這些特殊點。
Unity引擎下代碼混淆的特殊性
代碼被資源引用[B2] 。Unity的可視化編輯特性在設計上的關鍵之處在於使代碼能夠以組件的形式依附到資源實例上。相比傳統游戲,Unity的兩類資源(scene和prefab)不僅包括數據,還包括附加在資源上的類對象。也就是說,這兩類資源的存儲格式中存在唯一標識某代碼類型的數據。混淆流程必須不破環這種對應關系才能使資源上的代碼邏輯正確被執行。(Unity這樣設計的意義並不是本文討論的重點,而另一篇分享個人對Unity可視化編輯的理解的文章中將會詳細說明。)
發布到Web的Unity項目,在生成播放器可執行包(*.unity)的介面中,將編譯程序集和打包這兩個步驟捆綁在的一起。我們沒辦法像普通.NET程序那樣,對編譯出的程序集進行混淆後再打到播放器可執行包中。
UnityEngine按函數名進行調用。MonoBehaviour是Unity引擎的一個重要的組件基類。其上的很多方法,Unity是通過方法名稱進行訪問的,如Awake、Start、Update等等。這些方法如果在混淆中被改名,將使方法調用失敗。這個問題相對比較好處理,Dotfuscator的重命名功能提供了排除配置。我們只要得到繼承於MonoBehaviour的所有類型,就能生成相應的排除配置,告知Dotfuscator不要對這些方法進行重命名。生成的配置節選如下[B3] :
<option>xmlserialization</option>
<excludelist>
<type name="CEventMgr|CGameRoot|…|…" regex="true" excludetype="false">
<method name="Update"regex="true" />
<method name="LateUpdate"regex="true" />
<method name="FixedUpdate"regex="true" />
<methodname="Awake" regex="true" />
<customattributename="System.Runtime.CompilerServices.CompilerGeneratedAttribute"regex="true" />
<method name=".*"regex="true" />
<field name=".*"regex="true" />
</type>
<type name=".*"regex="true">
<customattributename="ANoRenameInObfuscate" regex="true" />
</type>
<type name=".*"excludetype="false" regex="true">
<method name=".*"regex="true">
<customattributename="ANoRenameInObfuscate" regex="true" />
</method>
</type>
思路
何時混淆?由於Web項目編譯和打包的過程是捆綁在一起的,官方沒有提供獨立的介面。(之前有跟官方反饋,但目前官方並沒有提供具體計劃。)想自己來分析官方的打包格式是行不通並且不太科學的。僅剩的辦法就是自己將代碼編譯成DLL,混淆之後再添加到Unity項目中。
順著這條思路,筆者在《QQ樂團》項目上作了嘗試。將項目中所有執行相關的代碼(不包括編輯器擴展的代碼)移出,指定相關的Unity依賴庫,編譯成DLL。再將此DLL復制到原項目中。這時意料之中的事情發生了——項目中所有資源上的代碼引用全部丟失。為了找到資源對代碼的映射形式,筆者調整Unity編輯器的設定,將資源的序列化格式改為文本格式,並進行對比分析。發現資源中是通過一個GUID來對應具體代碼的[B4] 。(如下)
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 100000}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID:11500000, guid: , type: 1}
m_Name:
mInt: 1
mFloat: .5
中的類型雖然還沒有進行過混淆,但GUID已經發生了變化。將新的GUID替換到資源文件中,引用關系果然恢復了。
Unity引擎下的特殊問題都是可以解決的。於是順著這思路,開發了若干工具,得到了前後GUID的對應關系,並掃描所有資源以進行GUID的替換。另一方面,在混淆之後,類型的變數名發生了改變,資源中變數名賦有具體的值,也需要替換資源中的變數名對應到混淆後的變數名。這一切花費了不少的精力,終於是把工具都做成了。
然而人算不如天算,最終導致此方案走進死角的是一個之前很難意料到的問題:Unity引擎在處理DLL中的模版類型時存在缺陷——DLL中的模版類型沒有GUID,不能被資源所引用。這個問題在Unity官方網站上有少量反饋,而官方承認了這個bug,且沒有給出解決方案。而《QQ樂團》的項目在UI操作上比較廣泛地使用了模版類型,去除模版的使用談何容易。就這樣,這么一個不經意的問題為這個嘗試的方向畫上了句號。
「系著枷鎖跳舞」,這句話是形容的是在各種條件約束下盡可能的追求解決方案的一種狀態。總結之前的失敗,最終還是找到了實際可行的改進方案,並成功應用到《QQ樂團》的Web版本和微客戶端版本上。
最終的思路是將項目進行分層。獨立出一個不被資源引用的,包含最敏感的協議解析和各個系統模塊的「邏輯層」,將邏輯層的代碼獨立編譯成一個DLL,進行混淆再包含到項目中。邏輯層之外的代碼主要包括被資源引用到的,或是系統模塊部分介面定義這樣的不太敏感的內容,姑且稱為「行為層」。為了讓邏輯層可以獨立編譯,我們要求邏輯層可對行為層進行引用,而行為層則只能通過留在行為層的邏輯層介面訪問邏輯層。這樣我們就保護了我們最重要的代碼,同時繞過了資源引用代碼的問題。
這個方案對項目架構提出了一定的要求。一是要求敏感代碼和資源保持獨立,需要一個框架來載入各個模塊,而不是直接將模塊代碼直接附在場景物體的資源中。二是要求層次清晰,不允許反向依賴。有利於《QQ樂團》項目的消息是,《QQ樂團》從最早期就實現了一個較清晰的架構管理方法。因此花費了一定的時間進行分層,和實現介面訪問機制後,就成功執行了這個方案。
實際混淆步驟。《QQ樂團》是使用VisualBuild來執行版本構建和發布流程的。以下介紹版本構建中混淆相關的流程:
從Unity項目的Assets目錄中拷貝出邏輯層的代碼目錄(CodeGameLogic)。和編輯器擴展代碼(避免混淆後編輯器擴展代碼對邏輯層的依賴丟失導致編譯出錯)。
調用Unity.exe命令行編譯剩餘的行為層部分:
這個函數實際執行了:
BuildPipeline.BuildPlayer(new string[] {"Assets/obfuscated.unity" }, "WebPlayerObfuscated",
BuildTarget.WebPlayer, BuildOptions.None);
Editor程序集(也就是編輯器擴展程序集)時編譯失敗,中斷編譯過程,避免在BuildPlayer過程結束時構建生成的DLL被清理掉。BuildPlayer之前故意在Editor目錄下弄一個錯誤的代碼文件即可。
將生成的行為層DLL拷貝到邏輯層構建目錄。行為層DLL的路徑是在項目的Library/ScriptAssemblies下,有Assembly-CSharp.dll和Assembly-CSharp-firstpass.dll兩個文件。另外也拷貝邏輯層依賴的其它DLL到構建目錄,包括UnityEngine.dll,以及項目Plugins目錄下的依賴庫。
調用Mono的編譯器mcs編譯邏輯層DLL——CodeGameLogic.dll。編譯命令如下:
生成DotObfuscator的配置文件」WebCfg.xml」。這里是用自己編寫的工具,掃描CodeGameLogic.dll中的類型,得到不能被混淆的類型名和方法名,加入到配置文件的排出列表中。如「三。3」小節所示。
調用DotObfuscator對CodeGameLogic.dll執行混淆,得到混淆後的CodeGameLogic.dll:
將混淆後的CodeGameLogic.dll拷貝到項目中,然後構建項目。這里要注意的是,如果是構建Web項目,需要將dll拷貝到Plugins目錄。如果是Standalone(即客戶端)項目,直接拷貝到Assets目錄下即可。另外,這次構建是不可以有編譯錯誤的,所以第1部需要移除Editor目錄下的編輯器擴展的代碼。
接下來將構建好的項目與資源合並,就可以得到完整的混淆版本。
總結:
Unity項目的代碼反編譯較為容易。需要在重視代碼混淆工作。
Unity項目的代碼混淆方案實施起來限制較多。本文介紹的方案是筆者知曉的目前唯一可用的混淆方案。對項目的架構分層有強制性的要求。最好是在項目初期就考慮如何對項目進行分層,將需要保護的內容放置在被混淆的層中。

I. UE4,UDK,U3D各多少G知道的說下,急急急!!!

unity3d都裝大概2.45G左右,facebook插件另裝比較好,反正我直接全選沒裝成功過,udk1.84G

J. 如何在沒有U3D軟體的情況下運行unity3d游戲文件

所有的編譯錯誤必須更正,在你進入(播放或游戲)模式前。所有編譯器錯誤,您可以輸入值之前固定。在進入運行模式前所有編譯出錯的地方需要糾正。 把項目里除示例源碼之外的東西刪了, 看控制台的提示,糾正代碼。先把要導入的文件先拷貝到unity3d安裝目錄下對應的文件夾內,之後再返回unity3d軟體,右鍵選擇導入。如果是實景的話可以用攝像機動畫,如果是視頻的話就用mov格式的。最好是T-Pose的,且骨骼命名按照mecanim的規范,這樣導入的話,mecanim可以自動映射,而不用手動去映射。最佳方式是使用軟體內置的錯誤發送報告功能,來提交問題給Unity技術部。可以從Unity菜單的Help->Report a Problem中找到並使用它。需要將這個腳本拖放到想要應用kinect控制的模型上。為了讓模型能夠跟上人的節奏,需要將模型上控制模型動作的關鍵骨骼拖放到這個腳本暴漏的合適的變數中 ,也就是將模型中的骨骼與kincet識別到的人的骨骼綁定起來。另外這個腳本暴漏的變數中,還有一個變數時標識模型是受哪個玩家控制。也需要將這個腳本拖放到場景中的游戲物體上。但是這個游戲物體不是模型,而是由一系列分別代表頭部、肩部、手等人體部位的點組成。需要將游戲物體中的這些關鍵點都拖放到這個腳本暴漏的外部變數中。這樣就可以使用kinect控制游戲物體了,游戲物體是由一系列的點組成的人體。

熱點內容
銳志哪個配置性價比最高 發布:2025-02-12 17:38:43 瀏覽:917
智能推送演算法 發布:2025-02-12 17:38:41 瀏覽:834
拍照上傳器 發布:2025-02-12 17:34:29 瀏覽:651
androidweb框架 發布:2025-02-12 17:32:45 瀏覽:75
安卓編程賀卡 發布:2025-02-12 17:32:44 瀏覽:837
php獲取資料庫的欄位 發布:2025-02-12 17:29:02 瀏覽:765
伺服器地址消失 發布:2025-02-12 17:23:36 瀏覽:950
後台執行php腳本 發布:2025-02-12 17:21:45 瀏覽:470
spring編程式事務 發布:2025-02-12 17:16:55 瀏覽:397
nginx禁止ip訪問 發布:2025-02-12 17:15:14 瀏覽:273