我在项目中遇到音频问题。有三个桨式游戏对象和一个立方体。多维数据集包含Rigidbody2d
或BoxCollider2d
。还有一个按钮脚本附加到多维数据集,当我们点击按钮多维数据集Kinematic
变为false并掉落在游泳池上时,它具有按钮功能。当它与任何桨状立方体发生碰撞时,再次使用新预制件进行实例化。当Cube下降时,声音会播放,立方体会被破坏。当再次点击按钮然后出现错误时,新的立方体就会被实例化。
MissingReferenceException
:AudioSource
类型的对象已被销毁,但您仍在尝试访问它。您的脚本应该检查它是否为null或者您不应该销毁该对象。
所有拨片上的脚本:
public class Paddle : MonoBehaviour
{
[SerializeField]
private AudioSource source;
[SerializeField]
private AudioClip hit;
[SerializeField]
private BoxCollider2D collide;
[SerializeField]
private GameObject Clone;
void Awake()
{
collide.isTrigger = true;
}
void OnTriggerEnter2D(Collider2D target)
{
source.PlayOneShot(hit);
Destroy(target.gameObject);
Instantiate(Clone, new Vector3(0f, 4.51f, 0f), Quaternion.identity);
}
}
多维数据集脚本:
public class Cube : MonoBehaviour
{
[SerializeField]
private AudioSource source;
[SerializeField]
private Rigidbody2D body;
[SerializeField]
private AudioClip play;
private Button bt;
private float pos;
public bool check;
void Start()
{
bt = GameObject.FindGameObjectWithTag("Button").GetComponent<Button>();
bt.onClick.AddListener(Fire);
body.isKinematic = true;
}
void Update()
{
if (check)
{
return;
}
Vector3 temp = transform.position;
pos = Camera.main.ScreenToWorldPoint(Input.mousePosition).x;
temp.x = Mathf.Clamp(pos, -6.25f, 6.25f);
body.position = temp;
}
public void Fire()
{
GameObject.FindGameObjectWithTag("Player").GetComponent<Cube>().check = true;
GameObject.FindGameObjectWithTag("Player").GetComponent<Rigidbody2D>().isKinematic = false;
source.PlayOneShot(play);
}
}
新出口套餐: https://drive.google.com/file/d/0B1H5fdK2PJAnSXVPdmE5Z3J1SUU
视频问题: https://drive.google.com/file/d/0B1H5fdK2PJAnYzRfVnlQT1FyTlE
答案 0 :(得分:3)
您的链接包工作正常,每次启动和销毁多维数据集时都会播放声音。
尽管如此,你应该删除destroy上的方法。当非持久性监听器为空时,Unity不会抛出任何错误或警告,有点奇怪,但事实就是这样。您应该手动删除它:
void OnDestroy(){
bt.onClick.RemoveListener (Fire);
}
但是当我运行它时,你的包不会抛出任何错误。
虽然,我会重新考虑你的方法,而不是将其Fire方法分配给Button事件,我会在按钮上包含一个包含Fire方法的脚本以及AudoiSource和clip。然后在Start上,Cube将自行传递,以便按钮可以访问其Cube和Rigidbody2D组件。
最好是传递包含这些成员的类:
public class CubeArgument{
public readonly Rigidbody2D rg = null;
public readonly Cube cube = null;
public CubeArgument(Rigidbody2D rg, Cube cube){
this.rg = rg;
this.cube = cube;
}
}
然后这是你的Cube启动方法:
void Start () {
bt = GameObject.FindGameObjectWithTag ("Button");
bt.GetComponent<ButtonController> ().Init(new CubeArgument(body, this));
body.isKinematic = true;
}
ButtonController参考甚至可以是静态的,因为整个级别只有一个。
然后在按钮上有一个ButtonController:
public class ButtonController : MonoBehaviour{
Cube currentCube = null;
Rigodbody2D currentRig = null;
public void Init(CubeArgument ca){
currentRig = ca.rg;
currentCube = ca.cube;
}
public void Fire(){
if(currentCube != null){ currentCube.check = true; }
if(currentRig != null) { currentRig.isKinematic = false; }
}
}
Fire作为侦听器传递给Button onClick,就是这样。