1.unity3d C# 从预设里创建物体的代码怎么写
需要先声明一个public 的 GameObject对象:
public GameObject prefab1;
然后在你想要创建物体的地方写Instantiate方法:
Instantiate(prefab1,位置,角度)//这个方法的返回类型是一个gameobject对象,如果需要也可以用一个gameobject对象来引用创建的物体,比如你写的GameObject go = Instantiate(prefab),就是用go来引用创建的物体。
之后把这段脚本保存为.cs文件绑定给一个对象,比如绑定到摄像机上,然后选中摄像机,会在Inspector面板看到你绑定的脚本组件,在那里能找到一个prefab1字段,因为这个字段是public的,然后把你创建的y1预设拖动到prefab1上,也就是把y1预设引用给prefab1这个gameobject对象,然后运行就能看到效果了。
2.unity3d 相机跟随代码怎么写
需要先声明一个public的GameObject对象:;然后在你想要创建物体的地方写Instantiate方法:Instantiate(prefab1,位置,角度)//这个方法的返回类型是一个gameobject对象,如果需要也可以用一个gameobject对象来引用创建的物体,比如你写的GameObjectgo=Instantiate(prefab),就是用go来引用创建的物体。
之后把这段脚本保存为.cs文件绑定给一个对象,比如绑定到摄像机上,然后选中摄像机,会在Inspector面板看到你绑定的脚本组件,在那里能找到一个prefab1字段,因为这个字段是public的,然后把你创建的y1预设拖动到prefab1上,也就是把y1预设引用给prefab1这个gameobject对象,然后运行就能看到效果了。
3.unity3d关于角色面向控制方向JS代码是怎么写的
人物角色的朝向那个点(或者面向哪个点):transform.LookAt()
人物向方向移动:
transform.Translate(Vector3.forward);//前
transform.Translate(Vector3.back);//后
transform.Translate(Vector3.left);//左
transform.Translate(Vector3.right);//右
代码示例:
var speed:float =2.0;//移动速度
transform.Translate(Vector3.forward*speed *Time.deltaTime);
4.unity3d里照相机跟随鼠标左右移动的代码怎么写
摄像机也是一个gameObject对于移动摄像机的方法其实与移动gameObject的方法是一样的。
这是我的一个方法,放到Update方法里面即可。写得可能不太好,请见谅。
功能是鼠标移动到屏幕边框移动摄像机。 void moveThisCamera() { if (Input .mousePosition .x =(Screen .width-10) ) { float xNew =this.transform .position .x; xNew+=cameraMoveSpeed*Time .deltaTime; this.transform.position =new Vector3 (xNew,this.transform .position .y ,this.transform .position .z); } if (Input .mousePosition .y =(Screen .height-10) ) { float zNew =this.transform .position .z; zNew+=cameraMoveSpeed*Time .deltaTime; this.transform.position =new Vector3 (this.transform .position .x,this.transform .position .y ,zNew); } } 之所以没有用到tranlate方法,是因为有时候因为摄像机的角度不是0,可能会使得摄像机看到的东西变得倾斜。
5.以下unity3d的C#代码是什么意思
back.renderer.sharedMaterial = new Material(back.renderer.sharedMaterial);
根据Material的构造函数来说, new Material(back.renderer.sharedMaterial)是复制了自己原来的材质的shader而新建一个材质,这样做的目的恐怕是在后面的操作中需要更改这个back中的材质,而这个材质是共用的改变了其他共用这个材质的物体也会改变,而新建一个可以获得一个样的材质,而且更改了不会改变其他的材质。
6.如何做Unity3d的代码混淆
Unity代码混淆方案内容提要:Unity引擎下的代码保护,由于Unity引擎的一些特殊性,实行起来较为复杂,在国内外业界并没有现成的方案。
笔者通过在《QQ乐团》项目上的实际尝试,得出了一种具体可行,能够有效保护代码逻辑的方案。特此分享给关注Unity引擎的项目,希望能提供一些的参考。
背景Unity引擎上的程序执行在Mono运行时上,使用Mono编译出的程序集格式与.NET标准一致。C#是Unity引擎下主要的开发语言,它具备不少高级语言特性,如反射、元数据、内置序列化等。
但C#同时也是很容易被反编译的语言,如果不采用任何保护措施,使用常用的工具(.NET Reflector)便能很容易得到可二次编译的代码。对项目运营带来了比较大的风险。
.NET平台下通常的保护手段是混淆编译出的程序集。VisualStudio自带了一个混淆工具Dotfuscator可以对程序集进行混淆。
功能包括名称修改,流程混淆,字符串加密等。经过Dotfuscator混淆后的程序集,能够避免被常用反编译工具破解。
变量的表意性被破坏,同时函数的内部流程也被混淆(如下[B1] )。能有效起到保护源代码的效果。
publicclass181: 218{// Fieldspublicuint0;publicushort1;;;// Methodsstatic181();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] :xmlserialization思路何时混淆?由于Web项目编译和打包的过程是捆绑在一起的,官方没有提供独立的接口。(之前有跟官方反馈,但目前官方并没有提供具体计划。)
想自己来分析官方的打包格式是行不通并且不太科学的。仅剩的办法就是自己将代码编译成DLL,混淆之后再添加到Unity项目中。
顺着这条思路,笔者在《QQ乐团》项目上作了尝试。将项目中所有执行相关的代码(不包括编辑器扩展的代码)移出,指定相关的Unity依赖库,编译成DLL。
再将此DLL复制到原项目中。这时意料之中的事情发生了——项目中所有资源上的代码引用全部丢失。
为了找到资源对代码的映射形式,笔者调整Unity编辑器的设定,将资源的序列化格式改为文本格式,并进行对比分析。发现资源中是通过一个GUID来对应具体代码的[B4] 。
(如下)m_ObjectHideFlags: 1m_PrefabParentObject: {fileID: 0}m_PrefabInternal: {fileID: 100100000}m_GameObject: {fileID: 100000}m_Enabled: 1m_EditorHideFlags: 0m_Script: {fileID:11500000, guid: , type: 1}m_Name:mInt: 1mFloat: .5中的类型虽然还没有进行过混淆,但GUID已经发生了变化。将新的GUID替换到资源文件中,引用关系果然恢复了。
Unity引擎下的特殊问题都是可以解决的。于是顺着这思路,开发了若干工具,得到了前后GUID的对应关系,并扫描所有资源以进行GUID的替换。
另一方面,在混淆之后,类型的变量名发生了改变,资源中变量名赋有具体的值,也需要替换资源中的变量名对应到混淆后的变量名。这一切花费了不少的。
转载请注明出处育才学习网 » unity3d的代码怎么写