Invoke
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 22 课,共 71 课。
Invoke("Explode", 3f) 会在 3 秒后调用脚本自身的 Explode 方法一次,后面的代码会立即继续执行。Unity 会根据以字符串形式给出的名称查找方法,而且该方法不接受参数。这个炸弹会在游戏开始 3 秒后爆炸:
void Start()
{
Invoke("Explode", 3f);
}
void Explode()
{
Debug.Log("Boom");
Destroy(gameObject);
}因为名称是字符串,编译器无法检查它。Invoke("Explod", 3f) 可以通过编译,但 3 秒后,Unity 会记录 Trying to Invoke method: Bomb.Explod couldn't be called.,而不是让炸弹爆炸。C# 的 nameof 可以解决这个问题:nameof(Explode) 是字符串 "Explode",由编译器根据经过检查的名称生成,因此其中的拼写错误会导致编译错误,你可以在游戏运行前发现。写成 Invoke(nameof(Explode), 3f);。
挑战
简单让平台在玩家落地片刻后崩塌。
- 在
OnCollisionEnter中,当collision.gameObject.CompareTag("Player")时,调用Invoke(nameof(Fall), delay);。 - 添加
void Fall():设置body.isKinematic = false;,并记录Crumble!。
按下“开始”并走上平台:一秒后,平台就会掉落。然后点击“检查”。
亲手试试
using UnityEngine;
public class Crumble : MonoBehaviour
{
public float delay = 1f;
Rigidbody body;
void Start()
{
body = GetComponent<Rigidbody>();
}
void OnCollisionEnter(Collision collision)
{
// 玩家落到平台上时:等待 delay 秒后让平台下落
}
// Fall():启用平台的物理效果,并记录 Crumble!
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器