Unity学习笔记(一)

吐槽

啊啊啊啊啊,最近考试唉,下周每天都考试,然后因为要参加腾讯的游戏的项目,8月初要交项目,好不容易把团队组起来,各种跑路的人唉,没办法还是想坚持下去,就这两种学了下C#和unity,把之前学的东西总结一下。

成果

就在网上看别人的课程入门写了两个小Demo

这里写图片描述
这里写图片描述
第一个就是打砖块,发射小球然后打击墙面
第二个就是类似微信小程序的见缝插针
都是看网上别人教程写的,不过基本的Unity自己算是入门了

知识点总结

1工程文件夹

先创建工程,类似和安卓差不多
Assets:资源,代码,脚本
Library:库,内置的脚本
ProjectSetting:工程设定
Temp:临时的文件夹

2窗口

Scene窗口 游戏的场景界面
Game窗口 游戏界面
Project窗口 Assets文件夹里面对应的
Hierarchy窗口 场景里面有那些物体
Inspector属性面板

3游戏分常见开发的,就像拍摄视频一样,设置剧本,每一个场景,问题,都是由自己决定。

4操作视野

Q W E R T 快捷键

5游戏物体组成部分

场景是由游戏物体组成———物体由组件组成的
组件:就是物体的各种属性,自己写的脚本
Transform:位置,旋转,放大信息的
cube:
Box Collider:
Mesh Renderer:控制显示

6创建预治体====类似于模板这种东西

然后根据预制体的性质创建相应的东西

7相机的移动

        loat h = Input.GetAxis("Horizontal");//相机的左右的值
        float v = Input.GetAxis("Vertical");//相机的上下移动的值
        Debug.Log(h);
        transform.Translate(new Vector3(h, v, 0)*Time.deltaTime*speed);//相机的镜头的移动

8发射的脚本

public class Shoot : MonoBehaviour {
    public GameObject bullet;//游戏中的绑定的物体
    public float speed = 35;//初数度
       // Use this for initialization
       void Start () {
        Debug.Log("hhhhhh");
        //GameObject.Instantiate(bullet,transform.position,transform.rotation);
       }

       // Update is called once per frame
       void Update () {
        //按下鼠标左键就弹出子弹
        if (Input.GetMouseButtonDown(0))//判断鼠标按键的
        {
            GameObject b = GameObject.Instantiate(bullet, transform.position, transform.rotation);
            Rigidbody rgb = b.GetComponent<Rigidbody>();//获得刚体
            rgb.velocity = transform.forward * speed;
        }

       }
}

9unity获取Camera类型的主对象

Camera mainCamera;
GameObject gameObject=GameObject.Find("MainCamera");
mainCamera=gameObject.GetComponent<Camera>();

10unity的事件方法//类似安卓活动的生命周期

Awake ->OnEable-> Start -> FixedUpdate-> Update -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy
1.Awake
用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息Awake总是在Start之前被调用。它不能用来执行协同程序。
2.Start
仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。在所有脚本实例中,Start函数总是在Awake函数之后调用。
3.FixedUpdate
固定帧更新,在Unity导航菜单栏中,点击“Edit”–>“Project Setting”–>“Time”菜单项后,右侧的Inspector视图将弹出时间管理器,其中“Fixed Timestep”选项用于设置FixedUpdate()的更新频率,更新频率默认为0.02s。
4.Update
正常帧更新,用于更新逻辑。每一帧都执行,处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
Update()与FixedUpdate()的区别
从字面上理解,它们都是在更新时会被调用,并且会循环的调用。但是Update会在每次渲 染新的一帧时,被调用。而FixedUpdate会在每个固定的时间间隔被调用,那么要是Update 和FixedUpdate的时间间隔一样,是不是就一样呢?答案是不一定,因为Update受当前渲染的物体,更确切的说是三角形的数量影响,有时快有时 慢,帧率会变化,update被调用的时间间隔就发生变化。但是FixedUpdate则不受帧率的变化,它是以固定的时间间隔来被调用,那么这个时间间 隔怎么设置呢?Edit->Project Setting->time下面的Fixed timestep。
5.LateUpdate
在所有Update函数调用后被调用,和fixedupdate一样都是每一帧都被调用执行,这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。LateUpdate,在每帧Update执行完毕调用,他是在所有update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
Update和LateUpdate的区别
在圣典里LateUpdate被解释成一句话,LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。
LateUpdate是晚于所有Update执行的。例如:游戏中有2个脚本,脚本1含有Update和LateUpdate,脚本2含有Update,那么当游戏执行时,每一帧都是把2个脚本中的Update执行完后才执行LateUpdate 。虽然是在同一帧中执行的,但是Update会先执行,LateUpdate会晚执行。
现在假设有2个不同的脚本同时在Update中控制一个物体,那么当其中一个脚本改变物体方位、旋转或者其他参数时,另一个脚步也在改变这些东西,那么这个物体的方位、旋转就会出现一定的反复。如果还有个物体在Update中跟随这个物体移动、旋转的话,那跟随的物体就会出现抖动。 如果是在LateUpdate中跟随的话就会只跟随所有Update执行完后的最后位置、旋转,这样就防止了抖动。
6.OnGUI
在渲染和处理GUI事件时调用。比如:你画一个button或label时常常用到它。这意味着OnGUI也是每帧执行一次。
7.Reset
在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个默认值。
8.OnDisable
当物体被销毁时 OnDisable将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。注意: OnDisable不能用于协同程序。
9.OnDestroy
当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用。注意:OnDestroy也不能用于协同程序。

void Awake()

{

    print("Here is Awake");

}





void OnEnable()

{

    print("Here is OnEnable");

}





void Start()

{

    print("Here is Start");

}





void FixedUpdate()

{

    print("Here is FixedUpdate");

}





void Update()

{

    print("Here is Update");

}





void LateUpdate()

{

    Debug.Log("Here is LateUpdate");

}





void OnGUI()

{

    print("Here is OnGUI");

}





void Reset()

{

    print("Here is OnReset");

}





void OnDisable()

{

    print("Here is OnDisable");

}





void OnDestroy()

{

    print("Here is OnDestroy");

}  

这里写图片描述
这里写图片描述
这里写图片描述

编辑器(Editor)
Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对象上,并且在Reset命令被使用时也会调用。
编者注:Reset是在用户点击Inspector面板上Reset按钮或者首次添加该组件时被调用。Reset最常用于在见识面板中给定一个默认值。

第一次场景加载(First Scene Load)
这些函数会在一个场景开始(场景中每个物体只调用一次)时被调用。
Awake:这个函数总是在任何Start()函数之前一个预设被实例化之后被调用,如果一个GameObject是非激活的(inactive),在启动期间Awake函数是不会被调用的直到它是活动的(active)。
OnEnable:只有在对象是激活(active)状态下才会被调用,这个函数只有在object被启用(enable)后才会调用。这会发生在一个MonoBehaviour实例被创建,例如当一个关卡被加载或者一个带有脚本组件的GameObject被实例化。
注意:当一个场景被添加到场景中,所有脚本上的Awake()和OnEable()函数将会被调用在Start()、Update()等它们中任何函数被调用之前。自然的,当一个物体在游戏过程中被实例化时这不能被强制执行。

第一帧更新之前(Before the first frame update)
Start:只要脚本实例被启用了Start()函数将会在Update()函数第一帧之前被调用。
对于那些被添加到场景中的物体,所有脚本上的Start()函数将会在它们中任何的Update()函数之前被调用,自然的,当一个物体在游戏过程中被实例化时这不能被强制执行。
在帧之间(In between frames)
OnApplicationPause:这个函数将会被调用在暂停被检测有效的在正常的帧更新之间的一帧的结束时。在OnApplicationPause被调用后将会有额外的一帧用来允许游戏显示显示图像表示在暂停状态下。

更新顺序(Update Order)
当你在跟踪游戏逻辑和状态,动画,相机位置等的时候,有几个不同的事件函数你可以使用。常见的模式是在Update()函数中执行大多数任务,但是也有其它的函数你可以使用。
FixedUpdate:FixedUpdate函数经常会比Update函数更频繁的被调用。它一帧会被调用多次,如果帧率低它可能不会在帧之间被调用,就算帧率是高的。所有的图形计算和更新在FixedUpdate之后会立即执行。当在FixedUpdate里执行移动计算,你并不需要Time.deltaTime乘以你的值,这是因为FixedUpdate是按真实时间,独立于帧率被调用的。
Update:Update每一帧都会被调用,对于帧更新它是主要的负荷函数。
LateUpdate:LateUpdate会在Update结束之后每一帧被调用,任何计算在Update里执行结束当LateUpdate开始时。LateUpdate常用为第三人称视角相机跟随。

渲染(Rendering)
OnPreCull:在相机剔除场景前被调用。剔除是取决于哪些物体对于摄像机是可见的,OnPreCull仅在剔除起作用之前被调用。
OnBecameVisible/OnBecameInvisible:当一个物体对任意摄像机变得可见/不可见时被调用。
OnPreRender:在摄像机开始渲染场景之前调用。
OnRenderObject:在指定场景渲染完成之后调用,你可以使用GL类或者Graphics.DrawMeshNow 来绘制自定义几何体在这里。
OnPostRender:在摄像机完成场景渲染之后调用。
OnRenderImage(Pro Only):在场景徐然完成之后允许屏幕图像后期处理调用。
OnGUI:为了响应GUI事件,每帧会被调用多次(一般最低两次)。布局Layout和Repaint事件会首先处理,接下来处理的是是通过
Layout和键盘/鼠标事件对应的每个输入事件。
OnDrawGizmos:用于可视化的绘制一些小玩意在场景视图中。

协同程序(Coroutines)
正常的协同程序更新是在Update函数返回之后运行。一个协同程序是可以暂停执行(yield)直到给出的依从指令(YieldInstruction )完成,写成的不同运用:
yield:在所有的Update函数都已经被调用的下一帧该协程将持续执行。
yield WaitForSeconds:一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后。
yield WaitForFixedUpdate:所有脚本上的FixedUpdate函数已经执行调用之后持续。
yield WWW:在WWW下载完成之后持续。
yield StartCoroutine:协同程序链,将会等到MuFunc函数协程执行完成首先。

销毁(When the Object is Destroyed)
OnDestory:这个函数在会在一个对象销毁前一帧调用,会在所有帧更新一个对象存在的最后一帧之后执行,对象也许会响应Object.Destroy 或一个场景关闭时被销毁。

退出游戏(When Quitting)
这些函数会在你场景中所有的激活的物体上调用:
OnApplicationQuit:这个函数在应用退出之前的所有游戏物体上调用,在编辑器(Editor)模式中会在用户停止PlayMode时调用,在网页播放器(web player)中会在网页视图关闭时调用。
OnDisable:当行为变为非启用(disable)或非激活(inactive)时调用。

11时间类的静态变量

这里写图片描述
图中红色为只读值,绿色为可读可写
Time.time 表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。
Time.timeSinceLevelLoad 表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止。
Time.deltaTime 表示从上一帧到当前帧时间,以秒为单位。
Time.fixedTime 表示以秒计游戏开始的时间,固定时间以定期间隔更新(相当于fixedDeltaTime)直到达到time属性。
Time.fixedDeltaTime 表示以秒计间隔,在物理和其他固定帧率进行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行设置。
Time.SmoothDeltaTime 表示一个平稳的deltaTime,根据前
N帧的时间加权平均的值。
Time.timeScale 时间缩放,默认值为1,若设置<1,表示时间减慢,若设置>1,表示时间加快,可以用来加速和减速游戏,非常有用。
Time.frameCount 总帧数
Time.realtimeSinceStartup 表示自游戏开始后的总时间,即使暂停也会不断的增加。
Time.captureFramerate 表示设置每秒的帧率,然后不考虑真实时间。
Time.unscaledDeltaTime 不考虑timescale时候与deltaTime相同,若timescale被设置,则无效。
Time.unscaledTime 不考虑timescale时候与time相同,若timescale被设置,则无效。

总结

总之,学这个蛮有意思的,很有成就感让别人玩自己写的游戏,我也要加快学习的进度了,但是又要考试好烦啊啊啊啊啊。

猜你喜欢

转载自blog.csdn.net/sakurakider/article/details/80959071