全是自己总结的干货
事件顺序
当一个GameObject首次Active=true后,会先触发Awake函数,再触发Start函数,之后每帧触发Update函数。
不管是在游戏内通过SetActive(true)来激活,还是本身已经激活,触发的顺序都为:Awake,OnEnable,Start。之后每次SetActive(false)触发OnDisable,每次SetActive(true)触发OnEnable。
音乐播放
游戏内部音乐从时间长度分为两种:短音乐和长音乐。
- 短音乐通过获取AudioSource组件,再通过该组件的PlayOneShot(AudioClip)来播放(PlayOneShot没有现成的方法去暂停)。
- 长音乐则考虑到暂停等因素,设置AudioSource的clip为指定AudioClip后,通过Play()方法播放。之后可以通过Pause暂停,UnPause继续。
- Stop()之后相当于关闭了,再次播放需要再次调用Play(),且会重新开始。
- 通过isPlaying来获取是否在播放。
- 想要不暂停音乐进度达到静音的效果,只需要设置mute为true(静音)
- 另外可以通过设置volume来改变音量(0到1)
// 参考
// 播放相关
static AudioSource audioSource;
static AudioSource audioOneShot;
static public void PlayAudioOneShot(AudioClip audioClip)
{
audioOneShot.PlayOneShot(audioClip);
}
static public void PlayAudio(AudioClip audioClip)
{
audioSource.clip = audioClip;
audioSource.Play();
}
// 设置音量
static public void SetAudioVolume(float volume)
{
audioSource.volume = volume;
}
// 设置静音
static public void SetAudioMute(bool ifMute)
{
audioSource.mute = ifMute;
}
载入资源
很多时候我们不想通过public再一个个拖进script组件的方式得到资源对应的对象。这个时候就需要载入资源了。
在Assets下面创建一个叫Resources的文件夹,Build的时候会将Resources下的资源自动包进去。
可以在代码内部通过(AudioClip)Resources.Load("Audio/XXX")
导入AudioClip对象
通过Resources.Load<Sprite>("Image/Button");
导入Sprite对象。
导入其他资源的时候可以自己试试类似的方法。
游戏暂停
一般是通过Time.timeScale来达到效果。设置为0就是暂停,设置为1就是正常。
其实可以看成是改变Time.deltaTime来到达效果。因为游戏内部物体的运动都是基于Time.deltaTime的,另外倒计时也可以通过timer+=Time.deltaTime实现。
但是不基于Time.deltaTime的是没办法通过这个停止的,例如Update函数还是会每帧都进行。
下面给一个可以暂停音乐的暂停方法:
// 参考
public void TimeManager(float scale)
{
Time.timeScale = scale;
if (scale == 0)
{
if(audioSource.isPlaying)
audioSource.Pause();
}
else
{
if (!audioSource.isPlaying)
audioSource.UnPause();
}
}