游戏脚本和MonoBehaviour生命周期

一.游戏脚本

1.双击Project视图中, Script目录下的GameManager脚本

游戏脚本和MonoBehaviour生命周期_第1张图片

2.使用MonoDevelop编辑器打开

游戏脚本和MonoBehaviour生命周期_第2张图片

3.所有创建的用于添加到游戏对象上的脚本都必须继承自MonoBehaviour。
二.调式
1.我们可以在脚本里输出调试信息, 并在控制台中显示。
2.接口
(1).Debug.Log:向控制台输出普通信息(白色)。
(2).Debug.LogWarning:向控制台输出警告信息(黄色)。
(3).Debug.LogError:向控制台输出错误信息(红色)。
三.MonoBehaviour生命周期
1.Awake(), 脚本唤醒函数。当游戏对象被创建的时候, 游戏对象绑定的脚本会在该帧内执行Awake()函数, 无论脚本是否处于激活状态。
2.Start(), 该函数在脚本被激活的时候执行, 位于Awake()函数之后。该函数的执行同样也是在游戏对象被创建的帧里。不同的是, 如果脚本处于不激活状态, Start()函数是不会被执行的。
3.Update(), 只有处于激活状态下的脚本, 都会在每一帧里调用Update()函数, 该函数也是最为常用的一个函数, 用来更新逻辑。
4.LateUpdate(), 该函数是延迟更新函数, 处于激活状态下的脚本在每一帧里都会在Update()函数执行后调用该函数, 通常用来调整代码执行的顺序。比如玩家的角色需要一个摄像机来跟随, 那么通常角色的移动逻辑会写在Update()里, 而摄像机的跟随在LateUpdate()里, 这样可以确保在角色的位置计算完毕后, 再根据角色位置确定摄像机的位置和视角。

5.FixedUpdate(), 该函数用于固定更新。在游戏运行的过程中, 每一帧的处理时间是不固定的, 当我们需要固定间隔时间执行某些代码时, 就会用到FixedUpdate()函数。在菜单栏中, 点击”Edit” -> “Project Settings” -> “Time”菜单项, 之后在Inspector视图里出现时间管理器, 其中”Fixed Timestep”选项用于设置FixeUpdate()的更新帧率, 更新帧率默认是0.02秒。固定更新常用于移动物体等操作, 因为固定更新每一帧调用的时间间隔是一样的, 所以移动速度是匀速的。

游戏脚本和MonoBehaviour生命周期_第3张图片

6.OnGUI(), 绘制界面函数。Unity使用最新的UGUI界面系统来创建页面, 所以OnGUI()一般作为测试功能使用, 如创建测试按钮。
7.OnDestroy(), 在当前脚本销毁时调用该函数, 可以在该函数里填写删除时需要处理的逻辑。
8. OnEnable(), 激活函数, 当脚本处于激活时调用。
9. OnDisable(), 当脚本被禁用时调用。

10.所有继承自MonoBehaviour的脚本都有一个名为enabled的bool属性值开关。enabled对应脚本名称左侧的勾, 如我们创建的GameManager脚本:

游戏脚本和MonoBehaviour生命周期_第4张图片

(1).enabled决定生命周期的函数是否会被调用。当enabled为true时, 生命周期各个阶段对应的函数将会被调用, 否则不调用, Awake和OnDisable函数除外。当enabled变为true时脚本执行OnEnable(), 当enabled变为false时脚本执行OnDisable()。
(2).enabled只是与生命周期的函数有关, 与其他函数和所有变量都没有关系。如果脚本中不保护任何生命周期函数, enabled将没有任何意义。

11.生命周期代码

using UnityEngine;

public class GameManager : MonoBehaviour
{
	private bool hasPrintUpdate = false;
	private bool hasPrintLateUpdate = false;
	private bool hasPrintFixedUpdate = false;
	private bool hasPrintGUI = false;

	void Awake()
	{
		Debug.Log ("---Awake---");
	}

	void OnEnable()
	{
		Debug.Log ("---OnEnable---");
	}

	void Start () 
	{
		Debug.Log ("---Start---");
	}

	void FixedUpdate()
	{
		if (!hasPrintFixedUpdate)
		{
			hasPrintFixedUpdate = true;
			Debug.Log ("---FixedUpdate---");
		}
	}

	void Update ()
	{
		if(!hasPrintUpdate)
		{
			hasPrintUpdate = true;
			Debug.Log ("---Update---");
		}
	}

	void LateUpdate()
	{
		if (!hasPrintLateUpdate) 
		{
			hasPrintLateUpdate = true;
			Debug.Log ("---LateUpdate---");
		}
	}

	void OnGUI()
	{
		if (!hasPrintGUI) 
		{
			hasPrintGUI = true;
			Debug.Log ("---OnGUI---");
		}
	}

	void OnDisable()
	{
		Debug.Log ("---OnDisable---");
	}

	void OnDestroy()
	{
		Debug.Log ("---OnDestroy---");
	}
		
}
12.绑定GameManager脚本到Cube游戏对象上
(1).在Hierarchy视图中选中Cube游戏对象

(2).在Project视图中,鼠标左键拖拽点GameManager脚本到Inspector视图中

游戏脚本和MonoBehaviour生命周期_第5张图片

(3).运行脚本,控制台打印

游戏脚本和MonoBehaviour生命周期_第6张图片

四.UnityGUI的使用
1.UnityGUI使用一个特殊的OnGUI()函数, 在该函数中加入实现UI的脚本。
2.UnityGUI的接口
(1).GUI.xxx(), 需要自己手动填写处于屏幕上的位置。
(2).GUILayout.xxx(),unity会自己排版。
3.UnityGUI测试函数
(1).GUILayout.Label (sting str), 标签用于显示文本。输入的参数为需要显示的文本。
(2).GUILayout.TextField (sting str), 按钮用于出发事件。输入的参数为在按钮上显示的文字。它返回一个bool值, 表示是否按下了按钮。
(3).GUILayout.Button(sting str), 文本区域用于输入文本。输入的参数为显示的文本, 返回经过用户输入改动后的文本。一般用参数变量接收返回值即可。

4.UseGUI实例

using UnityEngine;

public class UseGUI : MonoBehaviour
{
	private string text = "";
	private string myName = "";

	void OnGUI()
	{
		GUILayout.Label ("please input your name:");
		text = GUILayout.TextField (text);

		if(GUILayout.Button("submit"))
		{
			myName = text;
			text = string.Empty;
		}

		if(!string.IsNullOrEmpty(myName))
		{
			GUILayout.Label ("submit name success, name: " + myName);
		}
	}
}
5.绑定GameManager脚本到Cube游戏对象上
(1).在Hierarchy视图中选中Cube游戏对象

(2).在Inspector视图中, 点击Add Component按钮, 搜索UseGUI脚本进行绑定

游戏脚本和MonoBehaviour生命周期_第7张图片

(3).运行测试

游戏脚本和MonoBehaviour生命周期_第8张图片

你可能感兴趣的:(Unity基础知识)