中国大学 mooc 游戏引擎原理及应用学习笔记:组件、脚本与重要函数

中国大学 mooc 游戏引擎原理及应用学习笔记:组件、脚本与重要函数

目录

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