我是Unity的初学者,遇到了一个问题,但我在任何一块板上都找不到答案。创建一个非常基本的Unity C#脚本,我的Awake()
函数中包含以下代码行:
Assert.IsNotNull(sfxJump);
Assert.IsNotNull(sfxDeath);
Assert.IsNotNull(sfxCoin);
第三断言“
即使在检查器中设置了硬币
Assert.IsNotNull(sfxCoin)
,也会将null
抛出为AudioClip
:检查器脚本值:
但是-这是令我感到困惑的部分-由于某些原因,当从
sfxCoin
例程在同一脚本中调用null
时,不是OnCollisionEnter()
因此看来,Unity确实在代码中注册了对象-最终-但断言因初始的
Awake()
,Start()
和Update()
方法而失败。而这仅在
sfxCoin
中发生。 sfxJump
和sfxDeath
没有此问题。任何帮助,将不胜感激
整个脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Assertions;
public class Player : MonoBehaviour
{
[SerializeField] private float jumpForce = 100f;
[SerializeField] private float forwardMomentum = 5f;
[SerializeField] private AudioClip sfxJump;
[SerializeField] private AudioClip sfxDeath;
[SerializeField] private AudioClip sfxCoin;
private Animator anim;
private Rigidbody Rigidbody;
private bool jump = false;
private AudioSource audioSource;
private void Awake()
{
Assert.IsNotNull(sfxJump);
Assert.IsNotNull(sfxDeath);
Assert.IsNotNull(sfxCoin);
}
// Start is called before the first frame update
void Start()
{
anim = GetComponent<Animator>();
Rigidbody = GetComponent<Rigidbody>();
audioSource = GetComponent<AudioSource>();
}
// Update is called once per frame
void Update()
{
if (!GameManager.instance.GameOver() && GameManager.instance.GameStarted())
{
if (Input.GetMouseButton(0))
{
GameManager.instance.PlayerStartedGame();
anim.Play("Jump");
audioSource.PlayOneShot(sfxJump);
Rigidbody.useGravity = true;
jump = true;
}
}
}
private void FixedUpdate()
{
if (jump)
{
jump = false;
Rigidbody.velocity = new Vector2(0, 0);
Rigidbody.AddForce(new Vector2(forwardMomentum, jumpForce), ForceMode.Impulse);
}
}
private void OnCollisionEnter(Collision collision)
{
switch (collision.gameObject.tag)
{
case "obstacle":
Rigidbody.AddForce(new Vector2(-50, 20), ForceMode.Impulse);
Rigidbody.detectCollisions = false;
audioSource.PlayOneShot(sfxDeath);
GameManager.instance.PlayerCollided();
break;
case "coin":
audioSource.PlayOneShot(sfxCoin);
GameManager.instance.Score(1);
print("GOT COIN");
break;
}
}
}
最佳答案
抱歉,我发现了问题所在。
游戏对象的第二个实例也使用没有设置sfxCoin的相同脚本。它隐藏在层次结构中的某个节点下,因此我没有看到它。
就像我说的那样,我是一个初学者。