如何在Unity 3D OnCollisionEnter中增加分数

时间:2014-07-17 20:07:14

标签: c# unity3d

我坚持使用一开始就很容易解决的c#代码,但我无法让它工作。我在Unity3D中制作了一个视频游戏,我想创建一个在对象与墙碰撞后增加分数的功能。

我有2个脚本:

  1. Puntuacion.cs //增加和设置MAX和ACTUAL分数值的所有功能
  2. Collisions.cs //检测游戏碰撞的脚本
  3. 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),就这样。我想为下一次碰撞保存该值。

    我将非常感谢能帮助我解决这个问题的人

    祝你好运

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);
    }
}

你确定你这样做了吗?