我想制作拖放游戏。该游戏可以运行并播放,但是存在一些错误。根据以下2种编码,出现错误:-
完整编码:-
Vector3 startposition;
getTarget.transform.position = Vector3.Lerp(getTarget.transform.position, startposition, 1.0f);
startposition = getTarget.GetComponent<Drag>().originalPosition;
1)第80行出现错误编码
startposition = getTarget.GetComponent<Drag>().originalPosition;
完整编码:-
if ((dropobject.name == namepartial+"Target") && (getTarget.name == namepartial))
{
startTime = Time.time;
journeyLength = Vector3.Distance(getTarget.transform.position, dropobject.transform.position);
correct = true;
correctdone = false;
if (dropobject.name == "ToasterTarget")
{
infoPanel1.SetActive(true);
infoPanel2.SetActive(false);
infoPanel3.SetActive(false);
infoPanel4.SetActive(false);
infoPanel5.SetActive(false);
infoPanel6.SetActive(false);
infoPanel7.SetActive(false);
}
}
if ((dropobject.name == namepartial+"Target") && (getTarget.name == namepartial))
{
playAudioCorrect();
target.GetComponentInChildren<Renderer>().enabled = false;
getTarget.tag = "Untagged";
int tempscore = int.Parse(scoretext.GetComponent<Text>().text) + 50;
scoretext.GetComponent<Text>().text = tempscore.ToString();
int tempscore1 = int.Parse(finalScoreText.GetComponent<Text>().text) + 50;
finalScoreText.GetComponent<Text>().text = tempscore1.ToString();
}
2)第150行出现错误编码:-
if ((dropobject.name == namepartial+"Target") && (getTarget.name == namepartial))
控制台第80和105行出现错误:-
NullReferenceException:对象引用未设置为对象的实例 Drag.Update()(位于Assets / GameApaNi / Scripts / Drag.cs:105)
答案 0 :(得分:1)
您没有显示您实际遇到的错误,但是鉴于您的代码,我只能假设您遇到了两个错误
NullReferenceException
第一个意思是未设置getTarget
(null
)-不能这样,因为否则您会在-之前的行中得到错误-或getTarget.GetComponent<Drag>()
返回null
,表示Drag
上没有没有组件getTarget
。
如果未完全附加到getTarget
对象,则可以使用GetComponentInParent<Drag>()
在层次结构中向上递归搜索,也可以使用GetComponentInChildren<Drag>(true)
在层次结构中向下递归搜索
第二个基本相同:dropobject
或getTarget
都没有设置,所以null
。
对于这两者,您都应检查Inspector引用并设置断点,并Debug一行一行地插入代码。
其他一些提示:
通常,您为什么使用完全相同的if
条件
if ((dropobject.name == namepartial+"Target") && (getTarget.name == namepartial))
两次通话是分开的吗?您不能将两个块合并为一个吗?
还应尽量避免重复调用GetComponent
,因为它们只会存储一次结果并重新使用引用,例如
var scoreText = scoretext.GetComponent<Text>();
int tempscore = int.Parse(scoreText.text) + 50;
scoreText.text = tempscore.ToString();
如果可能的话甚至不要使用它,而只能在Awake
中获得相应的组件一次,并在应用程序的整个运行时重复使用相同的引用。
如果您引用了这些内容,例如通过Unity Inspector在类似
的字段中public GameObject scoretext;
然后将类型更改为
public Text scoretext;
您可以完全摆脱所有GetComponent
调用,这将使您的脚本更加高效(快速)。