unity中的常遇到的问题

1.使用unity的MovieTexture播放视频在物体上,对象只能在电脑上

2.移动端播放全屏视频 Handheld.PlayFullScreenMovie(),视频文件必须放置在StreamingAssets文件夹下

3.Unity的其他特殊文件夹??

4.Unity实例化物体(destObject,position,rotation,parent)和(destObject,position,rotation),前者会先让预制物体实例化为parent的子物体,并且使其scale值乘以父物体的scale值,再调整其位置,这样得出的结果事宜相对坐标,往往会发生预料之外。后一种为直接实例化,没有父子依赖关系,也不调整其scale值,可以后面添加父子关系,这样的结果更好。一般情况下,最好將预制物体的坐标设为(0,0,0)。

5.使用 transform.parent.TransformPoint(transform.localPosition)来进行坐标转换,不管有几层父子关系,都以其最高层来转化。

6.今天弄了一天还是没解决一个问题:
我要在下图模型如图选中的小圆球的position位置实例化一个饼状的物体并设置该物体为小球的子物体,小球为该模型的骨骼的子物体,饼状预制物体的坐标为(0,0,0),脚本是依附在小球上的

代码如下

实例化后的结构如下(此处我把视图放到模型里面可以看到饼状物体)

为什么我的预制物体无法实例化到小圆球的坐标位置,求解求解求解,有人遇到过此问题求解,我快崩溃了

 


 利用一个capsule作为小球的子物体来代替该小球就可以让物体实例化在capsule的位置,这说明模型自带的子物体的位置真的不能作为一个预制物体的位置参考,否则会出错,最有效的方式是建立一个unity物体,然后调整位置,并为该物体的子物体,让unity物体代替该物体的定位功能。

 

7.上面主要出现的问题的原因是,物体实例化子物体参考的是自身的pivot坐标,center坐标是以colider组件来定义的坐标,物体的移动,转向,世界坐标,子物体实例化位置,都是以pivot来做参考的,pivot是物体网格渲染的真实坐标。并且如果物体没有父物体,那么检视面板显示的是pivot世界坐标,如果有父物体,那么显示的是相对坐标,在脚本里相对坐标可以用localposition获得。

 

8.修改某些物体的pivot坐标的方法,由于pivot是在建模的时候固定的,所以无法真实修改,但是可以让此物体成为某个空物体的子物体,让后调节它们的相对位置,最后让这个空物体代替原来的物体。但是对于某些动画模型来说最好不要这样做,最好是用其他模型工具实际修改。

 

9.Destroy函数会在一帧的结尾执行。

7.MonoBehaviour类中的鼠标事件如OnMouseDown只对空间中的物体有效,对UGUI无效,对UGUI需要新的事件系统接口新的:EvenSystem。

 

8.对于拖拽事件,OnPointerDown不能代替OnBeginDrag,OnPointerClick不能代替OnEndDrag。否则会发生无法复位的Bug。

 

9.模型的Animation下的Curves可以添加参数曲线,若要使用此参数,可在animator组件中添加和此参数同名的参数,但是参数值以animation下的值为准。

 

10.脚本组件下面有start()函数或者update函数时,在检视面板中才有勾选框。

7.预制物体的脚本GameObject成员变量的值只能是预制物体对象,不能引用场景中的对象。

 

8.网格碰撞器的面数必须小于256面。

 

9.如果物体A与物体B发生碰撞,C是物体A的子物体,并且物体C没有Rigidbody组件,A和B都有Rigidbody组件,并且碰撞点在C,那么发生碰撞的是A与B的Rigidbody。但是如果C有Rigidbody组件,那么发生碰撞的就是C与B。也就是说碰撞的是两个逻辑上最近的Rigidbody。

 

10.mesh filter定义了物体的形状,mesh render定义了物体的渲染显示。

 

11.拖拽精灵子图到空物体创建精灵动画时有可能没有弹出动画创建窗口,这可能是软件反应延迟,可删除刚创建的没用的子物体,再次拖拽。

 

7.Animator Controller Animator override Controller的关系类似于父类虚函数与子类重写函数的关系,可以为两个形状不同,但是动画转换条件相同的,只是动画不同的物体其中一个添加Animator override Controller,然后重用上一个的Animator Controller,然后替换相应的动画即可,当此类物体的数量很多时,用这种方式可以节省时间。

8.layer主要通过光线投射来选择性地忽略碰撞器,或者添加碰撞功能。而sorting layer就是一个渲染层级的顺序的控制。
9.[Serializable]可以使其定义的变量在inspector面板下显示。[HideInspector]用在public变量前面表示即使是公共变量,也不会在Inspector中显示。
10.AnimatorTrigger类型的参数,设置其值之后立即就会自动恢复原来的值,用于设置某些攻击技能状态很有效。

7.OnLevelWasLoaded(int index),在一个场景加载完成后调用。
8.Mathf.Lerp(float a,float b,float t)函数用于插值运算,即让a变化到b,变化插值为t。即a=a*(1-t)+b*t;此方法有2D和3D的重载。
9.Instantiate(obj,position,rotation)函数用于实例化物体,当rotation为Quaternion.identity时表示使用obj原来的旋转。
10.重复和延迟执行的方法:
Invoke(methodName: string, time: float): void;
用于调用并延迟执行某个方法
methodName要执行的方法名称,time延迟多久之后执行。
InvokeRepeating(methodName: string, time: float, repeatRate: float): void;
用于调用并延迟执行某个方法,之后重复执行该方法
Methodname方法名称,time多久之后执行,repeatRate执行间隔
11.广播消息:BroadcastMessage(“MethodName”):用于调用所有子物体的MethodName方法。
12.协同程序的使用:
(1)什么是协调程序
        unity协程是一个能暂停执行,暂停后立即返回,直到中断指令完成后继续执行的函数。
        它类似一个子线程单独出来处理一些问题,性能开销较小,但是他在一个MonoBehaviour提供的主线程里只能有一个处于运行状态的协程。
(2)协同程序的特点
1、协程在中断指令(YieldInstruction)产生时暂停执行
2、协程一暂停执行便立即返回 //中断协程后返回主函数,暂停结束后继续执行协程剩余的函数。
3、中断指令完成后从中断指令的下一行继续执行
        4、同一时刻、一个脚本实例中可以有多个暂停的协程,但只有一个运行着的协程
        5、函数体全部执行完后,协程结束
        6、协程可以很好的控制跨越一定帧数后执行的行为
        7、协程在性能上、相比于一般函数几乎没有更多的开销
      8、协同程序都是在主程序中运行,并且会在每一帧中检测你yield后面的条件是否满足,若满足会继续执行。
比如当一个状态函数到达某一个状态时需要执行某个程序,但是又不能影响其他函数的执行,此时可以使用协程序另外开辟一个线程来执行,提高运行速度。

32.场景中不要直接拖拽引用切换场景不销毁的物体,因为当场景再次切换回来的时候,引用的物体将不再是原来的物体,会造成某些调用丢失。

 

33.关于游戏暂停:使用Time.timeScale。其中Time.timeScale将会影响fixedUpdate函数,而Update函数将不会受到影响。并且影响到的变量是deltaTime,fixedDeltaTime不会受到影响。使用时应该使用Update函数和deltaTime的配合使用。因为fixedUpdate只是使其帧率降低,在其中使用运动等会发生跳帧现象。

32.光照烘培和太阳光:

即将静态物体自发光,影子与环境光等进行预先的烘培,从而使光照的效果得到预先的计算存储。当有其他光源靠近时,相关部分会根据烘培的效果进行呈现。

首先点击playerSetting,设置光照为Deferred

(1)首先打开Lighting窗口,点击Object,点击renderers,点选场景中要进行烘培的物体(被选择的物体烘培后会在相互之间烘培出反射的环境光效果),点选Lightmap static,这样物体就会形成静态物体。这里如果baking设置为baked,那么烘培的结果是地上出现固定的影子。如果选择realtime,那么地上的阴影就是实时的。

(2)选择要用于烘培的光源。点击renderes旁边的lights,在层次视图中点选一个光源,光源类型暂时只能是平行光,设置光照强度和反射的强度。

(3)进行环境设置:点击Scene,这里在Sun下选择一个光源,这样天空中会出现一个太阳,太阳的位置,角度等将跟随该光源变化。设置环境光的强度。点击precomputed Realtime GI设置CPU Usage的质量。然后点击build。

40.关于Destroy

调用Destroy()

系统会首先执行disable操作

然后会执行OnDisable方法

这里如果在OnDisable根据名字或者标签查找该物体将会的系统的一个错误提示,但是不会发生使程序崩溃的错误警告go.IsActive() && go.GetTag() != 0,

最后执行OnDestroy方法

这里如果在OnDisable根据名字或者标签查找该物体将会得到空的结果。

 

41.退出场景导致的问题解决办法

有三个敌人,攻击这三个敌人,血量为零时调用destroy销毁敌人。在敌人的的ondestory中判断是否还有标签为敌人的物体存在,如果没有就判定赢了,如果有就判断自己是否死亡,如果死亡就输了。这里如果退出场景的时候自己先被系统销毁,就会发生赢了的结果。如果敌人先被销毁,就会发生输了的结果。现在怎么让这两种情况都不会发生

8:18:48

牛牛她爸 2017/7/10 8:18:48

@阿辉用一个列表来记住三个敌人

牛牛她爸 2017/7/10 8:19:01

打死一个就从列表中标记他dead

 

40.光照探头的使用:

在光照烘培的基础上,让烘培的光照对非静态物体产生应该有的光照效果(该静态物体的renderer下需要设置light probe为blend probe)。

(1)设置光源,相关设置和光照烘培相同,在设置灯光类型中baking需要设置为baked。

(2)添加光照探头,新建空物体,添加light probe group组件,然后在光源附近添加尽量多的光照探头。

(3)然后点击lighting下的build进行烘培。

(4)放入一个物体,在其renderer下Light Probes选择Blend Probes。

40.太阳光晕:

(1)新建光晕物体new Flare,并添加贴图设置尺寸颜色。

(2)将该物体添加到光源的light组件下flare下。此时如果该光源是和天阳相关的,那么光晕就会产生在太阳上,否则会产生在光源上。对于其他比如和太阳相关的物体,添加组件Lend Flare,添加flare文件,然后点击Directional。

 

45.导出包导致的BUG:导出Asset包之后,项目中的tag便签并不会一起export,因此再导入到其他项目或者电脑上之后,相应的tag的代码就会失效,导致一些错误,当build之后,这些错误就会显现出来。正确的导出之后还要复制用户的设置文件夹。

 

三.需要掌握的Unity知识

一、Unity作为3D游戏引擎必须要掌握固定流水线和可编程流水线,因为涉及到矩阵变换的知识点,在项目开发中会用得到的,如果读者不懂的可以查阅资料。

二、Unity作为3D引擎有自己的坐标系,在此强调一点,虽然它的图形API分为DirectX和OpenGL,但是它的世界坐标系是左手坐标系。

三、另外要掌握的坐标系有屏幕坐标系,UI坐标系,视口坐标,包括它们的原点是在哪个位置,因为在项目开发中也会涉及到以上三个坐标系之间的变换。

四、函数的执行顺序,比如Awake,OnEnable,Start 等,以及3D碰撞体的执行效率,比如球体,胶囊体,立方体,Mesh等等。

五、程序的优化处理,这个是面试考察的重点,内存的管理也是Unity程序开发的重中之重。内存管理无非就是对内存的使用,针对UI的内存管理使用的是图集方式,Unity自身的图集功能浪费内存,比如2048*2048的图集大小,它占的内存是4M,也就是说不管图集是否填满,它都需要在内存中开辟4M的空间,但是如果使用Texture Packer工具就可以节省没有填满的空间,针对大量UI的加载可以采用分类打包图集的方法处理。当然内存池的使用也是可以应用到UI的管理,另外就是对3D场景资源的管理,需要场景图片有自己的图库,这样图片可以重复利用,另外模型的面数,骨骼数量,材质数量这些都需要去关注。

六、内存优化还需要涉及到图片的格式,不带Alpha通道的图片采用jpg格式,带有Alpha通道的采用png格式,这是一种处理方式,另外一种处理方式就是将Alpha通道单独拿出来,所有的图片都是jpg格式,然后用带有Alpha通道的图片跟jpg格式文件进行结合使用。这样也可以优化图片的大小。

七、在架构设计方面,就要注意了,代码的编写,比如常用的设计模式,工厂模式,单例模式,MVC模式,FSM模式,观察者模式等,这些模式作为开发者必须要掌握的。(屁,指挥单例模式)

八、接下来就是Shader编写了,在这里给读者推荐一个编辑器工具Shader Forge编辑器,对于一些材质渲染非常好用,这个可以作为读者学习Shader的工具。

九、另外对于C#中定义的String,StringBuilder或者List,ArrayList等它们之间的区分要搞清楚。

十、不同机型的适配处理,技术验证等。

十一、热更新技术的实现,市面上应用比较广的是ulua作为脚本语言的框架设计。

十二、作为客户端开发者也需要了解一些网络方面的知识,比如tcp,udp,http这些协议处理的方式。

十四、作为渲染场景的后处理方式,比如Bloom,Blur,HDR,SSAO,PSSM等等。

十五、C#中的事件监听,委托的使用也要熟练掌握。

十六、协程与多线程的区别。

十七、文本文件的加载,比如json,xml,csv,二进制等等。

十八、有必要掌握的插件:PlayMaker,ITween,Behavior Designer。

posted @ 2019-05-29 23:32  小辉歌  阅读(1574)  评论(0编辑  收藏  举报