首先, Awake()会在Start()之前被调用。
其次,Awake()是在脚本对象实例化时被调用的,在应用程序启动前使用Awake来初始化变量或状态。 ,而Start()是在对象的第一帧时被调用的,而且是在Update()之前。
还有, 如果取消激活脚本,Awake仍然会调用,但Start不会。(如果GameObject没有激活则两个都不会调用。) 两个函数都只会调用一次,即使取消激活再重新激活也不会多执行一次。
最后, 初始化放在Awake会更为保险。原因在于,例如A和B两个脚本的start函数中需要引用对方的变量。而假设B脚本中的变量b如果在Start进行初始化,那么A脚本的Start函数获取B脚本中的变量b,得到可能是未初始化的,那么可能引发空引用的错误。
if(Input.GetKey(KeyCode.UpArrow))
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
transform:speed乘以Time.deltaTime可以使得它以每秒走多少米而不是每帧走多少米。
if(Input.GetKey(KeyCode.RightArrow))
transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
rotate表示以某个轴为中心进行旋转 。
在制作游戏时,有时可以在两个值之间进行线性插值。这是通过 Lerp 函数来完成的。线性插值会在两个给定值之间找到某个百分比的值。例如,我们可以在数字 3 和 5 之间按 50% 进行线性插值以得到数字 4。这是因为 4 是 3 和 5 之间距离的 50%。
// 在此示例中,result = 4
float result = Mathf.Lerp (3f, 5f, 0.5f);
Mathf.Lerp 函数接受 3 个 float 参数:一个 float 参数表示要进行插值的起始值,另一个 float 参数表示要进行插值的结束值,最后一个 float 参数表示要进行插值的距离。在此示例中,插值为 0.5,表示 50%。如果为 0,则函数将返回“from”值;如果为 1,则函数将返回“to”值。
Vector3 from = new Vector3 (1f, 2f, 3f);
Vector3 to = new Vector3 (5f, 6f, 7f);
// 此处 result = (4, 5, 6)
Vector3 result = Vector3.Lerp (from, to, 0.75f);
在此示例中,结果为 (4, 5, 6),因为 4 位于 1 到 5 之间的 75% 处,5 位于 2 到 6 之间的 75% 处,而 6 位于 3 到 7 之间的 75% 处。 使用 Color.Lerp 时适用同样的原理。在 Color 结构中,颜色由代表红色、蓝色、绿色和 Alpha 的 4 个 float 参数表示。使用 Lerp 时,与 Mathf.Lerp 和 Vector3.Lerp 一样,这些 float 数值将进行插值。
在某些情况下,可使用 Lerp 函数使值随时间平滑。请考虑以下代码段:
void Update ()
{
light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f);
}
如果光的强度从 0 开始,则在第一次更新后,其值将设置为 4。下一帧会将其设置为 6,然后设置为 7,再然后设置为 7.5,依此类推。因此,经过几帧后,光强度将趋向于 8,但随着接近目标,其变化速率将减慢。请注意,这是在若干个帧的过程中发生的。
如果我们不希望与帧率有关,则可以使用以下代码:
void Update ()
{
light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime);
}
这意味着强度变化将按每秒而不是每帧发生。 请注意,在对值进行平滑时,通常情况下最好使用 SmoothDamp 函数。仅当您确定想要的效果时,才应使用 Lerp 进行平滑。
Destroy可以用来销毁物体 也可以用来销毁物体上面的组件:
Destroy可以用来销毁物体 也可以用来销毁物体上面的组件。
if(Input.GetKey(KeyCode.Space)
{
Destroy(GetComponent());
}
OnMouseDown是个按鼠标之后会进行自动回调。
Invoke 函数可用于延迟时间进行方法调用。
void Start()
{
Invoke ("SpawnObject", 2);
}
void SpawnObject()
{
Instantiate(target, new Vector3(0, 2, 0), Quaternion.identity);
}
Invoke可实现在几秒之后,然后按照固定的间隔调用 。
void Start()
{
InvokeRepeating("SpawnObject", 2, 1);//两秒后调用,每过一秒调用一次
}
void SpawnObject()
{
float x = Random.Range(-2.0f, 2.0f);
float z = Random.Range(-2.0f, 2.0f);
Instantiate(target, new Vector3(x, 2, z), Quaternion.identity);
}
enum Direction {North, East, South, West};