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.实验结果