我坚持使用一开始就很容易解决的c#代码,但我无法让它工作。我在Unity3D中制作了一个视频游戏,我想创建一个在对象与墙碰撞后增加分数的功能。
我有2个脚本:
CODE:
Puntuacion.cs
using UnityEngine;
using System.Collections;
public class Puntuacion : MonoBehaviour
{
public int puntuacionActual=0;
public int maximaPuntuacion = 14;
public Transform gamePointsTextActual; // Texto Marcador Actual
public Transform gamePointsTextMaxima; // Texto Marcador Maxima
void Start ()
{
gamePointsTextActual=GameObject.Find("Texto 3D - ScoreActual").transform;
gamePointsTextMaxima=GameObject.Find("Texto 3D - ScoreMaxima").transform;
}
void Update ()
{
gamePointsTextActual.GetComponent<TextMesh>().text=this.puntuacionActual.ToString("D3");
gamePointsTextMaxima.GetComponent<TextMesh>().text=this.maximaPuntuacion.ToString("D3");
if(puntuacionActual>maximaPuntuacion)
{
maximaPuntuacion = puntuacionActual;
gamePointsTextActual.GetComponent<TextMesh>().text=this.maximaPuntuacion.ToString("D3");
}
}
public void incrementarPuntuacion()
{
puntuacionActual = puntuacionActual+1;
Debug.Log("Puntuacion Actual :"+puntuacionActual);
if(puntuacionActual>maximaPuntuacion)
{
maximaPuntuacion = puntuacionActual;
}
}
}
Collisions.cs
using UnityEngine;
using System.Collections;
public class Collisions : MonoBehaviour
{
public Puntuacion puntuacion = new Puntuacion();
public void OnCollisionEnter(Collision obj_collision )
{
if(obj_collision.gameObject.name == "HitScore")
{
Debug.Log("Collision");
puntuacion.incrementarPuntuacion();
Destroy(gameObject,2.0F);
}
if(obj_collision.gameObject.name == "Plane")
{
Debug.Log("Collision Plano");
Destroy(gameObject,1.0F);
}
}
}
两个脚本都附加到同一个GameObject,但是我收到了这个错误:
NullReferenceException: Object reference not set to an instance of an object
Collisions.OnCollisionEnter (UnityEngine.Collision obj_collision
另一方面,代码不会增加分数,总是增加1,实际分数保持在1。 我猜这是因为每次游戏都有碰撞时,我会创建一个新的Puntuacion.cs实例,包括值puntuacionActual = 0和maximaPuntuacion = 14;并在每次碰撞中将puntuacionActual的值从0增加到1。
我想要达到的目的是在墙上的系统发生碰撞时增加得分值(+1),就这样。我想为下一次碰撞保存该值。
我将非常感谢能帮助我解决这个问题的人
祝你好运
答案 0 :(得分:0)
是的我认为你确实是对的,因为你在Punctuation
脚本中创建了一个新的Collisions
实例,所以你的得分总是被重置。请尝试使用GetComponent
:
Punctuation punctuationScript= gameObject.getComponent<Punctuation>();
然后您可以像这样访问公共变量或方法:
punctuationScript.incrementarPunctuation();
这样就不会创建新的脚本,而是只从该gameObject获取脚本。
修改强>
我只是将您的代码复制到我的项目中,并且在使用您的代码时出现了与您相同的错误:
Collisions.cs
public Puntuacion puntuacion = new Puntuacion();
public void OnCollisionEnter(Collision obj_collision)
{
if(obj_collision.gameObject.name == "HitScore")
{
Debug.Log("Collision");
puntuacion.incrementarPuntuacion();
Destroy(gameObject,2.0F);
}
}
然而,在我尝试使用我给你的代码后,一切都很顺利,分数甚至正确递增:
public void OnCollisionEnter(Collision obj_collision)
{
if(obj_collision.gameObject.name == "HitScore")
{
Debug.Log("Collision");
Puntuacion puntuacionScript = gameObject.GetComponent<Puntuacion>();
puntuacionScript.incrementarPuntuacion();
Destroy(gameObject,2.0F);
}
}
你确定你这样做了吗?