Unity3D动画游戏设计算法 --脚本生命周期

1.实验的目的和要求

       掌握脚本生命周期的概念,掌握MonoBehavior类,理解各个事件的含义、执行条件、执行过程,能够熟练利用各个事件实现相应的功能。

2.实验内容

       编写相关代码,测试脚本生命周期的主要事件。

3.主要代码

脚本更新
Unity只支持单线程,但是可以通过C#来模拟多线程。
举例来说:现在需要每1秒就创建一个游戏对象,可以通过协程的概念,使用for循环来写。使用StartCoroutine()方法即可启用一个协程任务。在循环中,使用yield return 来告诉unity需要等待多久才执行下一个循环。

//每隔一秒新建一个cube

public class Script_04_04 : MonoBehaviour

{

    // Start is called before the first frame update

    void Start()

    {

        StartCoroutine(CreateCube());

    }

    IEnumerator CreateCube()

    {

        for(int i = 0; i < 10; i++)

        {

            GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = Vector3.one * i;

            yield return new WaitForSeconds(1f);

        }

    }

 }

停止协程任务
在协程任务启动的过程中,如果需要重新启动它,必须停掉之前的协程。使用StartCoroutine()返回这个协程对象,需要停止的时候使用StopCoroutine()

//每隔一秒新建一个cube

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Script_04_04 : MonoBehaviour

{

  

    IEnumerator CreateCube()

    {

        for(int i = 0; i < 10; i++)

        {

            GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = Vector3.one * i;

            yield return new WaitForSeconds(1f);

        }

    }

    private Coroutine m_Coroutine = null;

    private void OnGUI()

    {

        if (GUILayout.Button("startcoroutine"))

        {

            if (m_Coroutine != null)

            {

                StopCoroutine(m_Coroutine);

            }

            m_Coroutine = StartCoroutine(CreateCube());

        }

        if (GUILayout.Button("stopcoroutine"))

        {

            if (m_Coroutine != null)

            {

                StopCoroutine(m_Coroutine);

            }

        }

    }

}

使用OnGUI显示FPS
FPS的含义就是一秒钟Update被执行了多少次。所以只需要在Update()中获取每一秒所执行的次数,最终在OnG()方法中将FPS打印在平面左上角。

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Script_04_06 : MonoBehaviour

{

    public float updateInterval = 0.5F;

    private float accum = 0;

    private int frames = 0;

    private float timeleft;

    private string stringFps;

    void Start()

    {

        timeleft = updateInterval;

    }

    void Update()

    {

        timeleft -= Time.deltaTime;//deltaTime为运行一帧所需要的时间

        accum += Time.timeScale / Time.deltaTime;//timeScale为运行速度

        ++frames;

        if (timeleft <= 0.0)

        {

            float fps = accum / frames;

            string format = System.String.Format("{0:F2} FPS", fps);

            stringFps = format;

            timeleft = updateInterval;

            accum = 0.0f;

            frames = 0;

        }

    }

    private void OnGUI()

    {

        GUIStyle gUIStyle = GUIStyle.none;

        gUIStyle.fontSize = 30;

        gUIStyle.normal.textColor = Color.red;

        gUIStyle.alignment = TextAnchor.UpperLeft;

        Rect rt = new Rect(40, 0, 100, 100);

        GUI.Label(rt, stringFps, gUIStyle);

    }

}

4.实验结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值