unity中常用脚本生命周期全解

unity中常用脚本生命周期全解,第1张

1)Awake:整个生命周期中只执行一次(脚本文件被加载到场景中的时间调用)

2)OnEnable:整个生命周期执行的次数不确定(当游戏对象或者脚本在激活的时间执行该方法)

3)Start:整个生命周期中只执行一次(用于进行初始化 *** 作)

4)FixedUpdate:以帧为单位进行场景的刷新,以固定的时间来进行间隔执行,主要完成与物理相关的更新 *** 作

5)Update:每一帧与每一帧的执行时间可能是不一样的,Update方法执行速率与硬件和渲染的物体有关系,有时间快,有时间慢,主要完成场景中一些数据的更新和数据的逻辑处理 *** 作

6)LateUpdate:当一帧执行结束,在执行下一帧之前,会调用此方法

7)OnGUI:以帧为单位进行反复的执行

8)OnDisable:整个生命周期执行的次数不确定(当对象或脚本处于不可用或不可激活的时间执行该方法,一般会与OnEnable方法配合使用)

9)OnDestory:整个生命周期只执行一次(当对象(或脚本文件)被销毁的时间执行该方法,在执行该方法的时间,一般会先执行OnDisable方法,将对象变为不可用的状态,然后在销毁)

1)一个游戏对象是否只能绑定一个脚本

    一个游戏对象的身上会绑定多个脚本文件

2)如果一个游戏对象可以绑定多个脚本,那么那个脚本先执行,那个脚本最后执行了

    先绑定的脚本最后执行,最后绑定的脚本先被执行

3)场景中如果存在多个游戏对象,多个游戏对象的身上都绑定了脚本文件,执行顺序又是怎样的

    先绑定的脚本最后执行,最后绑定的脚本先被执行,无论游戏对象上绑定了多少脚本组建,脚本的执行和脚本的绑定顺序有关

注意:绑定在游戏物体对象上面的脚本文件可以手动设置Script Execution Order来决定脚本的执行顺序,值越小代表的执行优先级越高

参考

Unity动画系统详解1:在Unity中如何制作动画?

Unity 动画系统 Animation 和 Animator的小实例

Unity/Animation -- 创建Animation Clip

空场景,找到一张Sprite,拖到面板中,右键添加Animation组件。如下:

选中,点击Unity的 Window->Animation->Animation。注意确认提示中的To begin animation后面的名称,是不是自己要添加的动画目标

这里发现只有Positionz,原因我暂时没搞清楚。而换成3D物体,菜单就是这样的了

这里可以创建另外一个ani

与方式一不同的是,不要先添加Animation组件,直接Window--Animation--Animation,命名保存后,会出现2个文件:

看起来是引擎自动生成了twoImagecontroller控制器,也就是Animator组件,而不是方式一中的Animation组件。创建动画保存后运行,发现动画已经生效了。再创建一个动画twoAni2,然后点击Window--Animation--Animator,来观察Animator视图:

橙色的待机动画是初始状态,其他状态都需要从这里出发,也都能回到这里。每个灰色矩形的状态表示一种动画,箭头连线表示状态切换方向。(关于状态机,后面还会详细说。)

使用Make Transition可以将twoAni2也连接上,这样播完twoAni1后,会播放twoAni2。在这个面板上,双击twoAni1或twoAni2,也可以直接 进入动画编辑窗口。默认的twoAni2一直在循环播放,可以在资源管理窗口找到它,然后把Loop time勾掉

参考

Unity 动画系统 Animation 和 Animator 联系与区别

在unity的老版本中我们只有Animation组件,在46版本以后则增添了Animator组件,如果只是控制一个动画的播放我们则用Animaton组件,如果是很多动画之间相互转换则使用Animator组件,它们两者的区别就是Animator有一个动画控制器(俗称动画状态机),使用它来进行动画切换是非常方便的,但缺点是占用内存比Animaton组件大。

要注意的是Animator Controller和Animation Clip都是文件(File),Animator则是GameObject上的一个组件(Component),不能混为一谈。

Animation窗口有两种模式:录制模式和预览模式。

点击录制按钮后,就进入了录制状态。此时关键帧部分会变成红色。

在录制模式下,不管是在场景中移动、旋转、缩放物体,还是在Inspector面板中修改物体组件的属性(Unity动画支持的属性),Unity都会自动在动画Clip的当前时间上添加关键帧保存。

我们可以在Animation窗口中拖到自己想添加关键帧的地方,然后回到scene场景中修改物体的属性,反复重复这样的步骤,然后退出录制状态,就自动生成想要的动画了。

如果没有在录制模式下,对物体的修改不会自动记录到动画Clip中。如果需要记录,需要手动添加关键帧进行记录。

如果在Inspector中修改了物体的属性,物体的属性会从浅蓝色背景变为浅红色,代表该属性已经被修改。这时候你可以右键点击对应的属性,在d出菜单中点击Add Key即可添加关键帧,将该属性的数据保存到动画Clip中。如果你在当前帧修改了多个属性,可以点击菜单中的Key All Modified(将所有修改的属性记录关键帧)或Key All Animated(记录属性列表中所有属性的数值,即使与上一帧相同数值的属性也会被记录)来一次性将所有修改的属性保存。

也可以点击Animation窗口左侧的Add Keyframe按钮来记录当前属性列表中选中属性的关键帧,如果当前没有选中任何属性,则会记录所有属性。

默认情况下,Animation窗口是DopeSheet模式,显示的是关键帧的点。如果想只使用Dopesheet实现比较好的动画效果还是比较困难的,因为它并不能直观地反映参数随时间变化的函数。这时我们可以在Animation窗口左下角切换到Curves视图, 具体效果如下图

如图,这是一个很简单的Rotation动画,只有X在第43帧变为75634。

将鼠标移到紫色点处,会变成可以移动的四角形,可以直接调节动画效果:

此时返回dopesheet视图,发现关键帧和数值都被改变了

编辑关键帧时,可以多选(在Curve编辑中同理):

你会发现直接拖拽多个关键帧时,后方的关键帧并不会跟随这些关键帧移动。如果你想让后方的关键帧也跟着移动,可以按住R键,同时拖拽这些关键帧。这种编辑方式叫做Ripple Edit(在音视频编辑软件中很常见)。缩放同理。

点击属性视图中Position属性左侧的三角标识,可以展开显示Positionx, Positiony, Positionz的属性。现在选中绿色的那个,去控制y属性。

如果模拟上下跳动的效果,我们可以在动画所有采样点的中点处设置一个Key,表示d跳的最高点。先在0:30处鼠标右键Add key添加一个关键点,然后鼠标左键按住并沿Y轴拖拽来改变该点的Positiony的值。

如下图,添加了两个key,并且Positiony设置为1,中间一段一直为1,多一点跳到高处的滞留时间。

将两侧都改为Linear后,变成了这样,注意那个勾从Clamped Auto变成Broken

在Curves中预定义了五种不同的Key点切线类型,它们分别是:

Evnet事件帧会在游戏运行时,场景中的物体在Animator的控制下,播放该动画片段到对应位置时,触发该物体上的某个脚本中的一个可以作为AnimationEvent挂载的方法

给触发动画的物体挂个脚本后,在事件帧上就能选方法了

参考

unity动画之帧动画使用

这时会提醒你保存一个动画,保存在Assets中/effect/explosionSmoke中,命名为explosionSmoke,保存动画即可 。

可以根据需要,调整Samples值。这样,帧动画就实现了。

可以参考 Unity UGUI系列二 SpriteRenderer和Image

通过观察,上面步骤做出的动画是拖到场景里,使用SpriteRenderer完成的。如果我们想在Canvas下,使用Image制作也是可以的。

1通过管理ram &cpu 清楚非必要进程来扩大游戏可能内存空间,提高游戏运行速度的。

2用虚拟服务器进行加速优化网络。

通用的游戏加速功能可通过以下两种方式实现:

1、基于游戏逻辑

1)修改游戏计算每帧更新所需变量。

2)通过修改代码影响每帧计算的时间结果。

2、与游戏逻辑无关

1)修改主逻辑模块导入表

2)通过InlineHook方式修改Libcso模块的时间函数(gettimeofday/clock_getime)或者修改更加底层的代码。

目前手游存在较多的通用加速功能,通用的加速包括:葫芦侠变速精灵、叉叉及圈圈加速、烧饼加速、晃悠游戏大师加速等,这些工具可通用的加速目前的绝大部分手游。本文重点分析游戏整体加速出现的原因、目前加速的实现方式、加速功能的检测方法。

实现原理

一、游戏通用加速出现的原因

手游和端游的通用加速功能原理都相同,通常游戏需要以帧为单位播放画面,播放画面过程中计算每帧动画播放所需时间(也可理解为两个画面切换的间隔时间),游戏需要调用C库函数获取系统时间以供计算每帧更新。目前手机端绝大部分游戏基于两大引擎,分别为:Cocos2D引擎、Unity3D引擎,引擎中实现了游戏每帧更新相关处理逻辑(包括每帧更新时间的计算),所以导致使用固定引擎的游戏每帧更新所需时间计算过程中调用的Libcso模块完全相同。以下为Unity3D引擎中创建新的的C#文件基本代码内容:

<img src=">

手游通用加速出现的根本原因为:绝大部分手机游戏使用两大引擎(Cocos2D引擎和Unity3D引擎)开发游戏,两大引擎采用固定的Libcso函数计算游戏每帧更新(Cocos2D引擎通过libcso的gettimeofday函数计算每帧更新,Unity3D引擎通过调用clock_gettime计算每帧更新)所需时间,从而通过修改引擎获取时间或者影响计算每帧更新相关变量便能实现手游通用加速功能。

基于手机端采用两大引擎实现的游戏,通用的游戏加速功能可通过以下两种方式实现:

1、基于游戏逻辑

1)修改游戏计算每帧更新所需变量。

2)通过修改代码影响每帧计算的时间结果。

2、与游戏逻辑无关

1)修改主逻辑模块导入表

2)通过InlineHook方式修改Libcso模块的时间函数(gettimeofday/clock_getime)或者修改更加底层的代码。

二、现有加速实现方式

目前外网主流的游戏整体加速为:葫芦侠变速精灵、叉叉及圈圈加速、烧饼修改器、晃悠游戏大师,这几款主流的加速目前采用与游戏逻辑无关的的方式实现通用加速功能,针对不同引擎,加速修改了不同Libcso相关函数。葫芦侠加速功能针对Cocos引擎修改了所有模块的gettimeofday函数导入表,其他几款工具修改gettimeofday、clock_getime的Libcso相关代码实现加速功能,每款工具基于不同引擎的加速功能实现方式汇总于下表所示:

<img src=">

通过上图可了解到目前主流手游通用加速功能实现方式。

>

再点一次就会有对应的颜色标注。上图DoTweenComponent:很明显DoTween每帧占用的时间更少,iTween 执行时,除了Scripts,所有Prefab都会使用同一个DoTween脚本

2 CPU Usage是可以点击的DoTween

1

iTween

1 执行时,其余的我都点掉了,所以右侧图示只显示了Script的内存占用情况,

3 在Hierarchy视图中Update()每帧所占用时间大概为8ms,为每一个Prefab都会挂载iTween脚本

2,LateUpdate)

总结(包含Update,黑色表示不显示Update()每帧所占用时间为291ms 在Hierarchy视图中

以上就是关于unity中常用脚本生命周期全解全部的内容,包括:unity中常用脚本生命周期全解、Unity 动画系列一 属性动画 序列帧动画、“手游加速”加速的方法有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9822818.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存