我使用 Unity 2d 为 Android 和 WP8 开发了一款游戏。该游戏讲述的是一名玩家通过吃橙子来完成关卡的故事。当玩家与橙色碰撞时,它会播放声音片段。
所以,当你第一次玩的时候,没有什么问题,所有的声音都播放得很好。然后,当您选择转到菜单选项重新开始关卡时,游戏会在第一次碰撞时崩溃。如果你选择菜单并重新加载关卡,它就可以正常工作。 所以它一次运行良好,然后失败一次,然后一次运行良好,然后继续。
此错误发生在 WP8 中,而不是 Android 中。
问题出在 WP8 中,代码如下:
void OnTriggerEnter2D(Collider2D collider){
if (collider.tag == "Player") {
NotificationCenter.DefaultCenter ().PostNotification (this, "IncrementarPuntos", this.puntosGanados);
AudioSource.PlayClipAtPoint (itemSoundClip, Camera.main.transform.position, itemSoundVolume);
Destroy (this.gameObject);
}
}
有错误的行是
AudioSource.PlayClipAtPoint (itemSoundClip, Camera.main.transform.position, itemSoundVolume);
因为 itemSoundClip 为空。
我不明白为什么 itemSoundClip 有时会变成空。
这是例外
$exception {System.NullReferenceException: Object reference not set to an instance of an object.
at UnityEngine.AudioSource.PlayClipAtPoint(AudioClip clip, Vector3 position, Single volume)
at Item.OnTriggerEnter2D(Collider2D collider)
at Item.$Invoke0(Int64 instance, Int64* args)
at UnityEngine.Internal.$MethodUtility.InvokeMethod(Int64 instance, Int64* args, IntPtr method)} System.Exception {System.NullReferenceException}
一些重要的事情需要了解。
我的橙色物品是预制件。这个项目有一个脚本,我添加了一个剪辑声音(itemSoundClip)
在我的场景中,我使用一个生成器脚本,该脚本获取该橙色项目,并使用此行在随机时间创建它的实例
Instantiate (obj [Random.Range (0, obj.Length)], transform.position, Quaternion.identity);
也许当实例化发生时,该项目无法加载剪辑?
在我的 Unity 项目中,我在 WP8 中播放声音:
public AudioClip coinCollect;
void OnTriggerEnter(Collider other)
{
if (other.gameObject.name == "coin_gold")
{
AudioSource.PlayClipAtPoint(coinCollect, other.gameObject.transform.position,1);
gold++;
Destroy(other.gameObject);
}
}
在 Unity Inspector 中我添加了声音
我找到了解决办法。如果 itemClipSound 的变量为 null,那么我用这个通过 Resources 加载声音。
if (itemSoundClip == null)
itemSoundClip = (AudioClip) Resources.Load("cogerItem");