1.发布ios应用的时候会生成一个xcode工程。已经发布过ios,再次发布的时候可以选择replace 或者是append原xcode工程。如果ios工程是不同unity版本创建的,那么不能append。但是如果我们修改过ios的工程,比如修改了工程的一些属性,那么append也会导致问题,这个时候我们需要导出工程,手动选择文件替换之前弄好的工程,要替换的文件有:Data文件夹、Class下面的Native文件夹,有时候需要替换Libraries文件夹。Android工程也可以通过这种方式来更新,需要替换assets和libs下面的东西。
如果报错:xxx bitcode xxx。那么在buildsettings->build options里面把 enable bitcode改为NO就可以了
如果报错:arc forbids explicit message send of dealloc。这是由于在新建工程的时候启用了ARC功能。在xcode中,打开“Build Setting”,找到“Objective-C Automatic Reference Counting”项,将它的值设置成“NO”,即可。
如果报错:libxml/tree.h file not found。在build phases的link Binary里面吧libxml2.tdb加入,
在build settings的header search paths里面把/usr/include/libxml2加入。
如果报错:use of import when modules are disabled。在build settings->apple LLVM
7.0-Language-Modules里面将Enable Modules 改为“YES”就可以了。
如果报错:Undefined symbols for architecture i386:
"_deflate", referenced from:。把libz.tdb加入。
如果报错:error: could not read CFBundleIdentifier from Info.plist (null) 。那么在General里面设置正确的Bundle Identifier就可以了。
如果在启动游戏的时候在这个位置return self[targetScreen] != nil; 报错: 说明要打开ARC,但是我设置了工程是全局禁止ARC的。所以要采用ARC和非ARC共同工作。这时,需要在Build Phases的Compile Source里面将对应的源文件设置选项:-fobjc-arc
加载第三方sdk的时候如果报错:unrecognized selector sent to class。在build settings->Linking->Other Linker Flags里面要加上-ObjC和-lxml2。
2. 发布android应用的时候,如果是第一次运行要指定android sdk。如果提示Bundle Identifier有问题,说明必须要修改一下 Bundle Identifier。然后就直接生成了APK。
3.unity破解(mac版本)。
- 从网上下载对应版本的破解补丁,其实就是2个文件:Unity、Unity_v5.x.ulf。
- 执行sudo su获得管理员权限后,对上面2个文件分别执行chown root:admin Unity,chmod +x Unity_v5.x.ulf。
- 将Unity替换/Applications/Unity/Unity.app/Contents/MacOS/里面的Unity
- 将Unity_v5.x.ulf替换/Library/Application Support/Unity/ 里面的Unity_v5.x.ulf
4.opengl光照模型。三个角色:光源,物体表面材质,光照环境。概念:法线向量,指定顶点的法线。法线向量可以作为顶点属性,像顶点坐标那样传入顶点着色器。也要经过NormalMatrix法线变换矩阵的处理。
unity包含以下几种光源
平行光:Directional Light(类似太阳光)
聚光灯:Spot Light (类似手电筒)
点光源:Point Light (类似路灯)
区域光源:Area Light (只用于烘培)
5.camera属性设置。
clear flags:确定了屏幕哪些部分将被清除,方便使用多个摄像机画不同的元素
backGround:应用于视图中所有元素绘制后,和没有天空盒的情况下,剩余屏幕的颜色
Projection:投影方式:正交投影(Orthographic,忽略物体距离影响),透视投影(Perspective,越远的物体显示越小)。2d游戏一般用正交投影
......
6.unity使用左手坐标系,即z越大,物体越远 。物体一旦放到相机里面,表示在相机里面的显示,是相机的子物体。但如在相机外面 ,如果深度在相机相同或者小于相机,那么就不会显示。元素的坐标相对摄像机的坐标。以网格为单位。
7.常用事件函数:
Awake:实例被装载的死后调用。
Start:Awake之后,update之前调用。
Update:每帧都执行。
FixUpdate:渲染一次执行一次,如果渲染效率比较低,那么FixUpdate调用次数就会小于 Update执行次数。FixUpdate适合做物理引擎控制,update适合游戏逻辑控制。
LateUpdate:每帧执行完毕调用,所有update结束后才调,适合命令脚本,如摄像机的跟随,都是在所有update执行完后调用,不然可能出现摄像机已经推进,但是还有角色的空帧出现。
OnGUI:绘制GUI的时候触发。
ONLevelWasLoaded:当场景加载完毕。
鼠标事件:
OnMouseDown:鼠标按下
OnMouseDrag:拖动鼠标
OnMouseEnter,OnMouseExit,OnMouseOver,OnMouseUp
OnPostRender:仅用于宿主是摄像机的脚本,当此摄像机范围内所有渲染都完成的时候触发此消息。
OnPreCull:仅用于宿主是摄像机的脚本,当此摄像机剔除了某个渲染场景的时候触发此消息。
OnPreRender:仅用于宿主是摄像机的脚本,当此摄像机开始渲染某个场景的时候触发此消息。
8.unity自带的是代码编辑器是monodevelop。如果无法启动,需要给该程序设置权限才可以运行。
9.导入Assets:xxx.unitypackage相当于导出的工程文件。通过Assets导入他,就可以导入工程文件。
10.创建个默认的脚本。自动继承自MonoBehaviour。默认生成start(),update()2个函数。一个用于初始化,一个用于每帧执行
11.Awake与start区别:Awake在MonoBehavior创建后就立刻调用,Start将在MonoBehavior创建后在该帧Update之前,在该Monobehavior.enabled == true的情况下执行。
12.每次打开unity工程的时候会自动生成一个Temp文件夹。当关闭工程的时候,临时文件夹就会被移除。
13.图形用户界面皮肤 GUI Skin,可以通过Assets->create->GUI skin创建。
UGUI的按钮(非ugui元素,可通过添加ugui脚本,比如image,来达到监听事件的目的,注意将image的alpha设置为0) 添加事件处理函数。
第一种方法,添加事件监听器
GameObject btnObj = GameObject.Find(btnName);
Button btn = btnObj.GetComponent<Button>();
btn.onClick.AddListener(delegate() {
this.OnClick(btnObj);
});
第二种方法,继承IPointerClickHandler,实现void OnPointerClick (PointerEventData eventData){}方法
第三种方法,在按钮的Button Component里面设置On Click。指定哪个gameObject的哪个脚本的哪个方法。注意方法名必须是public的。
14.Monodevelop快捷键:
转到定义:command+d
将代码自动缩进:command+]
取消代码缩进:command+[
15.调试程序。首先将monodevelop和unity连接起来:运行monodevelop左上的运行按钮。这个时候再运行unity就可以调试了。
16.材质(material)。用来把网格,粒子渲染器贴到游戏对象上面。主要包含3个属性:
shader,maincolor,texture
可以通过material.mainTexture来设置材质的纹理。
17.网格(MESH):由顶点Vertex组成,MESH+贴图就是模型
Mesh Filter:网格过滤器用于从你的资源中获取网格信息(Mesh)并将其传递到用于将其渲染到屏幕的网格渲染器当中。
Mesh Render:网格渲染器从网格过滤器获得几何形状,并且根据物体的Transform组件的定义位置进行渲染
Mesh collider:网格碰撞起,用于碰撞检测
18.关于UI。我目前使用的unity5.x带有自己的ui系统ugui(有个第三方UI插件Ngui也可以使用)。可以通过Gameobject下面的ui创建。创建一个ui元素后,会自动生成一个EventSystem,和所有UI元素的根节点Canvas。
cavas渲染模式render mode
Screen Space - Overlay:2DUI,不需要摄像机,始终显示在屏幕最前方。
Screen Space - Camera:2D及3DUI,绑定到指定摄像机,UI可以获得3D效果,可以进行3D方面的旋转。
World Space:3DUI,存在3D空间中的UI。
Canvas Scaler(Ui Scale Mode,UI缩放模式)
Constant Pixel Size:像素大小始终不变,即一个100*100的图片在任何的分辨率下都占用100*100的像素。一般PC上会使用这种方式,因为PC端分辨率差异并不大。
Scale With Screen Size:不关心图片的实际像素大小,而只关心Width及Height值,这个值如果是1000,那么100高度的图片在任何分辨率下都只占用屏幕1/10的尺寸。一般移动端会使用这种方式,因为移动端分辨率差异较大。
Constant Physical Size:根据物理单位来进行缩放。
Screen Match Mode(屏幕匹配模式)
Match Width Or Height: 匹配宽度或高度,类似于cocos2d的固定宽高
Expand :扩展,类似于cocos2d的no border
Shrink :收缩,类似于cocos2d的show all
19.unity2d 序列帧动画(Mecanim)制作:
1 在Hierarchy下面创建一个 2d sprite,并且选中它
2 点击window->Animation,打开动画编辑界面。
3 点击红点,创建一个动画。
4 将图片拖动到关键帧上面.
5 可以为一个sprite创建多个动画。 Animator是动画之间的跳转关系视图。(文件内容为一个xx.controller+ 多个 xn.anim)
6 可以将这个动画做成prefab。
7在Animator建立动画之间关联关系。右键点击动画A,选择make transition,然后点 击另一个动画B就可以建立关联,默认情况下,动画A播放完就切换到动画B播放。
8可以通过设置转移条件来控制动画的转移。首先要为Animator添加parameter。然后 在动画连接线的conditions上面设置转移条件。即parameter要满足的条件。然后添加脚本到prefab上面控制动画的转移。(parameter右边的选中框不打勾)
Animator animator = GameObject.Find("animation1").GetComponent<Animator>();
animator.SetBool("para", false);
animator.enabled=true/false可以设置动画播放与暂停。
可以在Animation编辑界面添加property,里面可以指定动画所包含的物体的属性的值。并且可以在时间轴的上方,指定帧事件(动画包含的所有脚本的函数,可以是private)。
20.collider:碰撞盒(物体轮廓描述),用于碰撞检测。给一个sprite添加box collider。当在物理上按下鼠标的时候会调用OnMouseDown事件。碰撞器可以作用于刚体Rigidbody,使刚体间的物理作用生效。当2个物体同时添加了box collider和rigidbody时,便可发生碰撞检测。当然,添加box collider不一定要添加刚体。有2种检测方式:碰撞信息检测和触发信息检测(是否勾选is trigger选项)。
碰撞检测和触发检测(is trigger)区别:
前者有碰撞效果(添加了刚体),调用OnCollisionEnter/Stay/Exit
触发器(Trigger)没有碰撞效果,调用OnTriggerEnter/Stay/Exit
collider分类:
盒子碰撞器:box Collider 2d(矩形),polygon collider 2d(多边形)
网格碰撞器:mesh Collider(复杂网状碰转)
胶囊碰撞器:capsule Collider(圆柱体连接2个半球)
球型碰撞器:Sphere Collider
地形碰撞器:Terrain Collider
21.rigidbody:刚体,使物体产生物理效果。他有如下几个属性:
Gravity scale:受重力的影响程度。mass:质量。is kinematic: 是否开启动力学,开启此项,物体不受力的作用。。。
22.坐标变换。
屏幕坐标:从摄像机视角上显示的叫屏幕,左下角是(0,0),不管摄像机坐标是不是(0,0)
Vector3 _screenSpace = Camera.main.WorldToScreenPoint(transform.position); 物体的世界坐标转换为屏幕坐标。
Vector3 _worldSpace = Camera.main.ScreenToWorldPoint(_vec3ScreenSpace);
屏幕坐标转换为世界坐标。
transform.InverseTransformPoint(worldPos) :世界坐标转化为自身坐标
transform.TransformPoint(localPos) :自身坐标转化为世界坐标
注意transform.position实际上已经是世界坐标了。不是local坐标。这点和cocos2d不同。
获取屏幕宽高:
-Camera.main.ScreenToWorldPoint(new Vector3(-Screen.width / 2f, 0, 0)).x 屏幕宽
-Camera.main.ScreenToWorldPoint(new Vector3(0, -Screen.height / 2f, 0)).y 屏幕高
Camera.main.transform.position:屏幕中心坐标
上述原理:屏幕上的(0,0,0)相当于在屏幕上的左下角,转换为世界坐标后相当于
(-width,-height,z)
23.Shader.Find只能查找使用中或者是Resources下面的shader。当然也可以在系统设置里面将shader设置为初始化就加载。Edit->project settings->Graphic里面,将shader拖进去
24.itween使用(有人建议用dotween,itween消耗大,并且功能不足)。类似cocos2d的action。控制物体移动的。自带的例子:iTween.MoveBy(gameObject, iTween.Hash("x", 2, "easeType", "easeInOutExpo", "speed",10f,"loopType", "pingPong", "delay", .1));
moveBy表示移动一段距离。
x表示x变化量。可以有x y z三个值。
easeType表示移动类型。比如先快后慢等
speed表示移动速度
loopType表示循环类型。共三种 none loop pingPong (一般 循环 来回)
delay表示延迟执行。
25.继承自MonoBehaviour的脚本绑定到物体上后。gameObject就是自身的游戏物体。可以通过GameObject.Find("name")来全局查找游戏物体;
26.场景切换。老式写法Application.LoadLevel("sceneName"),新式写法SceneManager.LoadScene("sceneName")
27.在player settings里面可以设置产品名字,app icon。显示方式(横屏还是竖屏)。等
显示方式有:portrait(竖屏) portrait upside down(竖屏倒置仅ios) landscape right(横屏,向右,仅ios)landscape left(横屏,向左),auto rotation(自动旋转)
product name为app的display name。
28.unity自带的UGUI就有屏幕适配。在Rect transform 里面。可以设置在屏幕中的9个关键点。配置物体自身的锚点。这个时候的x,y就是偏移量。
29.unity调用Android:
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
_androidJavaObj = jc.GetStatic<AndroidJavaObject>("currentActivity");
_androidJavaObj.Call ("_methodName", para);
30.unity 的Assets目录下,有些特殊文件夹名。比如:
Plugins(只能是Assets的直接子目录):用来放native插件。它们会被自动包含进build中去(注意在Plugins/iOS下面的东西会直接复制到ios工程下面的Libraries/Plugins下面)。
Editor(可以在任意目录下,数目不定):该目录下的资源或者脚本不会打进发布包中,只是用于编辑时使用。
Editor Default Resources(只能是Assets的直接子目录):存放Editor的编辑器资源。
Resources(可以在任意目录下,数目不定,可以位于子目录下):里面的资源肯定会被打包进APK或者ipa。会压缩和加密资源。通过Resource.Load进行读取。
StreamingAssets:和Resources差不多,也会打进安装包中,但是文件是只读的,并且不会压缩和加密。通过WWW进行读取。
31. c# 类的public属性可以在unity的脚本属性里面显示出来,可以在里面设置初始值 。
32.可以在代码里面移除gameobject的component。Destroy(GetComponent<UITouchScale>());
33.MonoBehaviour Invoke("methodName",delay);多少秒后调用某个方法。
34.GameObject.Find()、Transform.Find()。都可以查找gameobject。GameObject.Find不能查找隐藏的物体。
35.Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。
36.对于unity2d,将图片导入unity的时候,可以设置图片的纹理格式Texture Type。sprite Mode表示是否切图。可以在下方的Sprite Editor切图。Texture Mode表示贴图模式。
37.动态加载prefab的2种方式。
方法一:GameObject objPrefab = (MonoBehaviour.Instantiate(mPrefab, Vector3.zero, Quaternion.identity) as GameObject);(mPrefab是MonoBehaviour.Instantiate的一个变量,该变量指向一个prefab)
方法二:GameObject objPrefab = (GameObject)Resources.Load("Prefabs/myPrefab");该方法直接加载某个路径下的prefab。
38.持久化数据存储。
a PlayerPrefs,可以存储3种类型的数据。int,float,string。它以键值对的方式将数据存在本地文件里面。
b 本地文件
c ScriptableObject,存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。
39.unity官方支持的脚本语言有c#,javascript,boo,支持混编,这三种脚本都会编译成dll,在运行时实时汇编。当然我们也可以使用lua,他不会编译成dll, 可以实现热更新。
40.unity异步加载scene。
AsyncOperation m_ao = SceneManager.LoadSceneAsync(nextSceneName,LoadSceneMode.Single);
通过m_ao.isDone检测加载是否完毕。
while(!m_ao.isDone){
yield return 0;
}
注意该方法会自动显示nextScene。
41.可以通过transform.gameObject获取游戏物体。
42. gameObject.SetActive可以设置物体是否显示。可以在Inspector面板物体名字左边是否打勾来SetActive初始值。当物体active为false的时候,它身上的脚本是不会执行的。
43.音效Audio Source,在里面可以指定要播放的音效片段。当然也可以在程序里面动态指定。
44.UGUI的image,可以指定image的sprite来指定它显示的内容。
Image _image;
Sprite dialog1,dialog2,dialog3;
dialogImage.sprite = dialog1;
45.程序切换到前后台调用函数。 void OnApplicationPause(bool isPause),isPause==true表示切换到后台。每个MonoBehaviour都可以监听这个事件。
46.UnityEngine.SceneManagement.SceneManager.GetActiveScene().buildIndex。获取当前scene在build里面的构建顺序。
47.MonoBehaviour类的属性(public)可以是一个脚本组件。通过拖动绑定该脚本的物体到属性面板,可以实现脚本组件的指向。这样就可以在MonoBehaviour类里面控制那个脚本方法的调用。
48.UGUI的布局。 Horizontal Layout Group(水平布局)Vertical Layout Group(垂直布局)Grid Layout Group (网格布局)。注意布局要使用RectTransform。
49.gameObject.SendMessage(methodName:调用游戏物体上所有MonoBehaviour中名为methodName的方法
gameObject.SendMessageUpwards(methodName:和SendMessage差不多,只是会调用游戏物体和其父节点的方法
gameObject.BroadcastMessage(methodName:和SendMessage差不多,只是会调用游戏物体和其子节点的方法
50.MonoBehaviour的public属性会在Inspector面板显示。并可在那边初始化。可以通过在属性上面加上[Header("xx")]为Inspector中的属性添加标题。使用的是c#的attribute。
51.指定回调函数为其他对象的脚本里的方法。
[SerializeField]
protected UnityEvent m_OnToolClick = new UnityEvent();
public UnityEvent onToolClick{ get{return m_OnToolClick;} }
这样。在属性面板里面选定对象和他绑定的脚本的方法。
52.UGUI的scrollview。滑动列表。可以结合UGUI的Layout来使用。滑动列表的大小取决于scrollview指定的content的大小。
53.Toggle:选择框。可以指定选中时候要显示的图片Graphic。通过toggle.onValueChanged.AddListener(OnToggleChange)来监听选择变化。可以与ToggleGroup一起使用,使一次只能选中一个Toggle。
54.unity中的render。负责渲染。比如SpriteRender负责sprite的渲染。需要在SpriteRender里面指定纹理和材质(估计纹理最终交由材质处理)。注意材质指明了渲染的细节。可以在材质里面设置shader和纹理。
55.gameobject:unity scene里面所有物体的基类。它负责物体组件(component)的管理。显示与隐藏。
56.transform继承了Component,主要包含矩阵数据。注意所有的物体必须包含一个transform,且不能删除。 所有Component都包含自己的gameObject。我们在物体属性面板看到的Transform Position配置的是物体的localPosition(相当于父亲的局部坐标),在代码里面的transform.position是物体的世界坐标。
57.gl.pushmatrix :把投影矩阵和模型视图矩阵压入堆栈。通过gl.popmatrix来恢复。
58.GL.LoadPixelMatrix();//设置用屏幕坐标绘图
59.RenderTextures:渲染纹理。
是一种特殊的纹理类型在运行时产生和更新。要使用他们,你首先要创建一个新的渲染纹理并且要指定一个摄像机进行渲染。然后你可以在材质中使用渲染纹理就像常规的纹理一样。
RenderTexture.active。unity将所有的东西都绘制到这个 RenderTexture上面。可以通过指定active来更新 某个RenderTexture。可以通过Graphics.DrawTexture来绘制。
可以通过复制纹理到RenderTexture,如下所示。
Graphics.SetRenderTarget (renderTexture);
Graphics.Blit(sourceTexture,renderTexture);
RenderTexture.active = null;
renderTexture初始化:
Graphics.SetRenderTarget (renderTexture);
Color c = new Color(0,0,0,0);
GL.Clear(true,true,c);
RenderTexture.active = null;
60.如果在放大的过程中,scene里面的东西有些不显示了。那么选中任一个gameObject,双击它就可以了。
61.在mac里面同时打开2个工程:open -n /Applications/Unity/Unity.app。
62.GameObject.FindGameObjectWithTag("tagName");通过tag查找一个物体,注意tag是通过tag manager管理的。通过unity界面的Edit->Project settings->Tags and Layers里面添加。在舞台上添加一个物体的时候就可以下拉选择tag manager管理的tag。如果没有这个tag,那么FindGameObjectWithTag会抛出UnityException。
63.unity跨平台实现。
在cocos2d里面跨平台的方法是:一个头文件指定所有平台的方法,然后在编译的时候指定不同的实现方法的文件。在android的实现部分使用jni,在ios里面可以直接调用oc的代码。或者在一个方法实现内部,根绝不同平台调用不同实现。
unity调用ios:
- 在c#里面申明方法
[DllImport ("__Internal")]
private static extern void _func(); - 在oc里面实现代码
extern "C" {
void _func() {
//调用oc代码
}
}
unity调用android:
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject _Obj = jc.GetStatic<AndroidJavaObject>("currentActivity");
这样就可以调用启动的activity里面的方法了。这个activity就是配置在AndroidManifest.xml的启动activity。
当然我们可以在一个方法的实现体内部区分平台来调用不同的实现。
64.unity2d左上角scene查看界面,2d表示以2d的视角查看scene,点击2d可切换到3d查看,点击坐标可以切换摄像机视角。right表示摄像机往右看。
65.当gameobject初始active设置为false的时候component不会加载。也就是说Getcomponent找不到。
66.多个物体使用同一个材质球,只会存在一个材质球对象。也就是说只要设置材质球属性,所有物体都会受影响。