[英]Unity Value Assigned in Inspector Throws Null in Code
I'm a beginner at Unity with a problem for which I've not been able to find an answer on any of the boards. 我是Unity的初学者,有一个问题,我无法在任何一个主板上找到答案。 Creating a very basic Unity C# script, I have the following lines of code in my Awake()
function: 创建一个非常基本的Unity C#脚本,我的Awake()
函数中有以下几行代码:
Assert.IsNotNull(sfxJump);
Assert.IsNotNull(sfxDeath);
Assert.IsNotNull(sfxCoin);
The third assertion " Assert.IsNotNull(sfxCoin)
throws as null
, even though the coin AudioClip
is set in the Inspector: 第三个断言“ Assert.IsNotNull(sfxCoin)
抛出为null
,即使在Inspector中设置了硬币AudioClip
:
Inspector script values: 检查器脚本值:
However -- and this is the part that has me baffled -- for some reason sfxCoin
is not null
when invoked in the same script from an OnCollisionEnter()
routine 然而 - sfxCoin
我困惑的部分 - 由于某种原因,当从OnCollisionEnter()
例程在同一脚本中调用时, sfxCoin
不为 null
So it appears Unity does register the object with the code -- eventually -- but the assertions fail with the initial Awake()
, Start()
, and Update()
methods. 所以看来Unity确实用代码注册了对象 - 最终 - 但是断言失败了,最初是Awake()
, Start()
和Update()
方法。
And this only is happening with sfxCoin
. 这只发生在sfxCoin
。 sfxJump
and sfxDeath
do not have this issue. sfxJump
和sfxDeath
没有这个问题。
Any help would be appreciated 任何帮助,将不胜感激
Entire script is below: 整个脚本如下:
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;
}
}
}
sorry, I found out what the problem was. 对不起,我发现了问题所在。
There was a second instance of a game object that was also using the same script that did not have sfxCoin set. 还有一个游戏对象的第二个实例,它也使用了没有设置sfxCoin的相同脚本。 It was hidden under a node in the hierarchy so I didn't see it. 它隐藏在层次结构中的一个节点下,所以我没有看到它。
Like I said, I'm a beginner at this. 就像我说的那样,我是初学者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.