目录
5.1 组件和脚本
脚本语言的特点:
简单的跨平台和简单的语法
无法与计算机硬件直接交互
新建脚本的名称与脚本中的类名相对应
如何让角色前进:
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
(这只能间歇地进行。
脚本可以附加到对象上并成为对象的组件
Unity的功能其实都是使用脚本实现的
//这一节很简单。你应该已经学过很多了。
5.2 重要函数或类
游戏实际上不断刷新和重绘
Update(): 此方法在每一帧执行时立即调用。LateUpdate(): LateUpdate 在所有 Update 之后调用
方法调用后调用(出自经典)。FixedUpdate():固定更新,系统默认每0.02秒调用一次,具体间隔可以参见
在TimeManager中配置(详见文章末尾)。
一般来说Update()和LateUpdate()都是立即更新,更新之间的频率不固定,比如某个G帧有一个耗时操作,就会影响到下一个G帧。
一帧的更新时间,因此需要相对稳定更新频率的物理系统(例如Rididbody)不适合在这里处理更新。
FixedUpdate() 虽然是固定更新,但其实是比较固定的,比如一帧要好几秒,还是会卡的,不过一般程序都会优化耗时操作,小范围的帧率波动很正常,你可以让它更新的时间长一点,这样它的更新就比较平滑了。
在实际开发中,比如秒的倒计时,并不需要每一帧都确定时间,那么使用FixedUpdate是最合适的。
Awake 函数在 Start 函数之前执行
Vector3 force = transform.forward * 10 * Input.GetAxis("Vertical");
GetComponent<Rigidbody>().AddForce(force);
对物体施加力的方法(建议在FixedUpdate函数中执行
Debug.Log("输出语句");//这个方法可以在unity的界面输出语句
private void OnCollisionEnter(Collision collision){
if(collision.gameObject.GetComponent<Arraw>()){
hp=hp-10;
}
}
5.3 函数执行顺序
5.4 序列化过程
在 Unity 中实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class xuliehua : MonoBehaviour
{
[Serializable]//必须要加上这个 还有上面的using System才能使得下面的公开能在系统里面被看到
public class Node
{
public string value;
public List<Node> children = new List<Node>();
}
public Node root = new Node();
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
此方法可以用于Unity中存储根节点及其子节点。
(重新加载关卡时可以保存该值)
5.5 协程
有时我们会遇到需要连续执行的循环。换句话说,在一段时间内逐步完成的程序循环,而不是在一帧更新内完成整个循环,这时就需要协程函数了。
左边的功能在一帧之内完成。
右边的函数执行一次然后返回下次继续执行。
右侧功能有待改进
有时我们希望这个函数与时间相关而不是与帧相关。
该类继承自MonoBehaviour,只有当MonoBehaviour彻底销毁时游戏引擎原理及应用,协程才会停止。
所以有时候我们需要故意停止一些协程
当停止时,我们可以调用 StopCoroutine 或 StopAllCoroutine
停止相应或所有协程
Unity 中的演示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript1 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
StartCoroutine("Fade");//用字符串的形式调用协程函数
}
}
IEnumerator Fade()
{
for (float f = 1f; f >= 0; f -= 0.1f)
{
Color c = GetComponent<MeshRenderer>().material.color;
c.a = f;
GetComponent<MeshRenderer>().material.color = c;
yield return new WaitForSeconds(0.1f);
}
}
}
赋予球一个透明材质并选择透明作为渲染模式。
然后将上面的脚本交给小球,进入游戏按F键就可以看到小球逐渐变得透明
(注意这里有一个错误材质材料,如果在将脚本拖拽到某个对象上时出现这个错误,那么可能不是脚本的错误,而是另外一个对象的错误。
5.6 预制
将物体拖入文件夹,它会自动变成蓝色游戏引擎原理及应用,表示它已成为预制件。
更改预制件的某个参数将影响所有副本,但如果副本本身更改了某个参数游戏评测,则更改预制件的任何参数都不会影响该特定个体。
改变文件夹中的球体将会改变其他三个对象,但该特定对象不会改变。
锻炼
文章来源:https://blog.csdn.net/weixin_43757333/article/details/108943285