unity学习

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:

  1. 在c#里面申明方法
    [DllImport ("__Internal")]
    private static extern void _func();
  2. 在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.多个物体使用同一个材质球,只会存在一个材质球对象。也就是说只要设置材质球属性,所有物体都会受影响。

转载于:https://my.oschina.net/yizhangxyz/blog/678051

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值