Unity学习笔记04脚本编程
1.脚本使用代码来实现具体功能
2.脚本作为组件挂接到游戏物体上
3.脚本中的某些参数可以通过组件来便于修改
继承于 MonoBehaviour 类的脚本可以挂接给unity中的游戏物体,成为一个组件。
public class first : MonoBehaviour
重要函数或类
Transform类
1.物体的位置,旋转和缩放控制。
2.场景中的每个物体都会包含这个组件。
3.可以构造层次化(有父物体或者子物体)。
更新函数
Update
刷新每一帧的时候都会执行,在渲染和计算动画之前,(比如GameObject和transform相关的改变都可以写在这里)
FixedUpdate
物理引擎更新时候执行,执行频率是固定的,不同于渲染更新,给予物理体的操作写在这个函数里,一般用来完成跟物理更新有关的操作。
LateUpdate
执行是在Update和FixedUpdate之后,应用于要确保需要最后更新的场景(如摄像机要一直面朝某一个场景中的游戏物体,需要等场景物体运动计算完成后再改变摄像机的朝向)
初始化函数
Awake
相当于构造函数
加:
在脚本实例刚刚被加载时,触发Awake。
Start
在物体执行第一帧时被调用
物理相关函数
碰撞触发响应函数,实现多种游戏性。
时间类
1.按照物理公式来进行计算,如计算位移要使用速度乘以时间,不应该直接使用基于帧的计算。
2.可以缩放时间迟,得到暂停(如慢镜头之类的效果)或者“子弹时间”效果。
射线投射
1.用于查询场景信息(如场景中有哪些物体,用来导航等。发射的光线击中的场景物体)
2.实现游戏功能(向着鼠标点击方向发射物体)
有两种类型,一是图形式,用于UI功能实现中。而是物理式,可以用于二维或者三维物理体查询中
函数执行顺序
1.游戏物体之间可能存在依赖关系。
2.程序操作可能依赖于执行前后关系,比如Awake和Start都可以初始化,但是Awake在Start之前调用。
Awake-->OnEnable-->Reset-->Start-->FixedUpdate-->,,,,,,,,
//部分记录
void Start()
{
Debug.Log("Called Start");
}
private void Awake()
{
Debug.Log("Called Awake");
}
private void OnEnable()
{
Debug.Log("Called OnEnable");
}
private void OnLevelWasLoaded(int level)
{
Debug.Log("Called OnlevelWasLoaded");
//有新关卡被载入的时候才会被调用
}
private void OnApplicationPause(bool pause)
{
Debug.Log("called pause");
//当游戏被暂停的时候调用
}
private void OnPreCull()
{
Debug.Log("called OnPreCul");
//当摄像机剔除发送之前被执行
}
private void OnWillRenderObject()
{
Debug.Log("called OnWillRenderObjec");
//被渲染物体马上要被渲染的时候执行
}
private void OnPreRender()
{
Debug.Log("called OnPreRender");
//摄像机渲染完成前被调用
}
private void OnPostRender()
{
Debug.Log("called OnPostRender");
//摄像机渲染完成后被调用
}
//下面三个是关于物体或者程序的退出的函数
private void OnDestroy()
{
}
private void OnApplicationQuit()
{
}
private void OnDisable()
{
}
序列化
指的是在游戏保存或者载入过程当中,如何对数据进行操作。
概念
将数据结构或对象状态转换为可以存储和重建的格式的自动过程。
很多引擎功能使用了序列化,保存和载入、属性面板、实例化和预制件。
Unity用序列化过程去保存和加载场景,Asset等。
基本中的元素可以序列化规则
是公有的或者有SerializeField属性(不能是静态的,不能是常量,不能是只读)
复合数据结构也可能被自动序列化(简单数据类型数组容器可以被序列化,List<T>中元素是简单字段类型是可以被序列化的)
可以被序列化的类
1.含有Serializable属性
2.不能是虚类
3.不能是静态类
4.不能是泛型类,但是可以继承自泛型类
协程
一个程序循环是在一段时间内逐步完成的,而不是在一个更新帧内完成,这时就需要用到协程函数。
协程Coroutine和普通函数的区别
普通函数会在返回前执行完所有的指令(意味着函数内的指令都会在一帧之内完成)
协程可以在运行到特定指令后返回,等下一帧或者特定时间后继续运行。
使用协程
1.IEnumerator作为协程函数返回值
2.使用StartCoroutine来启用(调用)协程
3.可以通过返回等到时间来延迟下次调用(WaitForseconds)
4.使用StopCoroutine或者StopAllCoroutines来停止协程
预制件(Prefab)
类似于一个模板,但使用该模板的结果也不完全相同。
作用
1.可重用的有特定组件、属性和子物体的游戏对象。
2.类似于模板,将物体按照模板在场景中实例化。
3.对预制件的修改会影响到所有实例化的物体。
适合预制件的场合
1.场景资源(比如多次使用的一种树)
2.NPC(一个角色出现在多个关卡中,只是某些属性有区别)
3.子弹(需要在运行时动态添加到场景中)
4.玩家角色(每关都需要摆到特定出生点)
Radius:半径 Collider:碰撞
将层级窗口中的对象拖拽到project窗口后,字体变蓝色,说明该对象已经变成预制件。