欢迎光临散文网 会员登陆 & 注册

Unity学习笔记04脚本编程

2021-11-29 20:40 作者:挽秋_z  | 我要投稿

组件和脚本

二者之间的关系:

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窗口后,字体变蓝色,说明该对象已经变成预制件。



Unity学习笔记04脚本编程的评论 (共 条)

分享到微博请遵守国家法律