u3d编译出包难吗
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控制游戏物体了,游戏物体是由一系列的点组成的人体。